предисловие
Базовое введение в ELK
ELK — это аббревиатура трех программных продуктов: Elasticsearch, Logstash и Kibana. Все эти три программного обеспечения являются программным обеспечением с открытым исходным кодом, обычно используемым вместе, и они последовательно называются Elastic.co, поэтому их называют стеками протоколов ELK.
С левой стороны мы развернули несколько серверов, а потом собираем данные через logstash.После завершения сбора отправляем в ES-кластер для хранения, а потом отображаем в браузере через Kibana.Это такой простая рутина
Elasticsearch — это распределенная поисковая система с открытым исходным кодом.Его функции включают в себя: готовую, распределенную, не требующую настройки, автоматическое обнаружение, автоматическое сегментирование индекса, механизм репликации индекса, интерфейс RESTful, несколько источников данных, автоматическую загрузку поиска и т. д. .
Logstash — это инструмент с полностью открытым исходным кодом, который может собирать, фильтровать и хранить ваши журналы для последующего использования (например, для поиска ES).
Kibana также является бесплатным инструментом с открытым исходным кодом, который предоставляет удобный веб-интерфейс для анализа журналов для Logstash и ElasticSearch, который может помочь вам собирать, анализировать и искать важные журналы данных.
Введение в реализацию ELK
ELK | язык реализации | Введение |
---|---|---|
ElasticSearch | Java | Механизм распределенного поиска и анализа в режиме реального времени для полнотекстового поиска, структурированного поиска и анализа на основе Lucene. Похоже на: Солр |
Logstash | JRuby | Механизм сбора данных с возможностями канала в реальном времени, включая модули ввода, фильтрации и вывода, и обычно выполняет синтаксический анализ форматирования журнала в модуле фильтрации. |
Kibana | JavaScript | Веб-платформа, предоставляющая аналитическую платформу и визуализацию для ElasticSerach. Он может находить, вызывать данные в индексе ElasticSerac и генерировать табличные графики различной размерности. |
Ссылки для ELK
Официальный сайт ELK: https://www.elastic.co/
Документ официального сайта ELK: https://www.elastic.co/guide/index.html
Руководство ELK на китайском языке: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
Китайское сообщество ELK: https://elasticsearch.cn/
1. Развертывание Elasticsearch
1.1 Введение
ElasticSearch, именуемый ES, ES — это масштабируемая система с открытым исходным кодом.Распределенная полнотекстовая поисковая система,оно можетпочти в реальном времениОн хранит и извлекает данные, обладает хорошей масштабируемостью и может быть расширен до сотен серверов для обработки данных уровня PB. ES также разработан на Java и использует Lucene в качестве ядра для всех функций индексирования и поиска, но его цель — скрыть сложность Lucene с помощью простого RESTful API, упрощая полнотекстовый поиск.
Ниже приведены некоторые варианты использования, предоставленные поисковыми системами.
GayHub:
2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。它使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”
Wiki:
Википедия: запуск базовой архитектуры поиска на основе elasticsearch
SoundCloud:
SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务
Baidu:
百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括Casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据
Sina: Используйте ElasticSearch для анализа и обработки 3,2 миллиарда журналов в режиме реального времени.
Alibaba: Используйте ElasticSearch для создания собственной системы сбора и анализа журналов.
1.2 Подготовка к использованию
Все установочные пакеты, которыми я пользовался, я загрузил в Baidu Cloud, и при необходимости могу их забрать, чтобы не смущать сеть 🤣
链接:https://pan.baidu.com/s/17m0LmmRcffQbfhjSikIHhA
提取码:l1lj
Прежде всего, мы должны отметить, что ES не может быть запущен пользователем root, он должен быть установлен и запущен обычным пользователем, здесь мы используем нового пользователя
Решение также может напрямую относиться к этомуhttps://www.cnblogs.com/gcgc/p/10297563.html
Первый — загрузить установочный пакет, а затем разархивировать его Операция относительно проста и не будет здесь объясняться.
После этого создаем две папки, обе можно создать в каталоге ES.
mkdir -p /usr/local/elasticsearch-6.7.0/logs/
mkdir -p /usr/local/elasticsearch-6.7.0/datas
Просто создайте файл данных и папку для хранения журнала
Затем измените файл конфигурации vim elasticsearch.yml в папке конфигурации.
cluster.name: myes
node.name: node3
path.data: 自己的安装路径/elasticsearch-6.7.0/datas
path.logs: 自己的安装路径/elasticsearch-6.7.0/logs
network.host: 自己节点的地址
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.name --- 集群的名字,默认ElasticSearch
node.name --- 节点名
path.data --- 数据文件存放路径
path.logs --- 日志文件存放路径
http.port --- 访问端口号
discovery.zen.ping.unicast.hosts: 集群自动发现功能
bootstrap.system_call_filter:
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"
Обратите внимание, что path.data и path.logs должны стоять перед путем /, например, у меня это path.data:/usr/local/elasticsearch-6.7.0/datas, конечно все умные дети, подсчитано, что не забудут
Мы также можем установить минимальную и максимальную память кучи в файле конфигурации jvm.option. После изменения, распространяемого на другие узлы, конечно же, этот профиль соответствует двум другим узлам выше процедуры, чтобы измениться просто отлично.
cd /usr/local
scp -r elasticsearch-6.7.0/ node2:$PWD
scp -r elasticsearch-6.7.0/ node3:$PWD
Поскольку мои первые две виртуальные машины потерпели крах, не зная почему, на их собственном компьютере недостаточно памяти. Так что я один узел 🤣
1.3 Изменить некоторые конфигурации системы
1.3.1 Максимальное количество открытых файлов для обычных пользователей
Описание сообщения об ошибке:
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
Решение: Снять ограничение на максимальное количество открытых файлов для обычных пользователей, иначе может выдаваться ошибка при запуске ES
sudo vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
Вставьте эти четыре строки
1.3.2 Ограничение на количество потоков, запускаемых обычными пользователями
sudo vi /etc/sysctl.conf
添加下面两行
vm.max_map_count=655360
fs.file-max=655360
Выполните sudo sysctl -p, чтобы конфигурация вступила в силу.
Примечание. После того, как две вышеупомянутые проблемы будут изменены, обязательно повторно подключитесь к Linux, чтобы изменения вступили в силу. Закройте инструмент secureCRT или XShell, а затем снова откройте инструмент для подключения к Linux.
1.3.3 Действия после повторного подключения инструмента
Выполните следующие 4 команды, нет проблем
[hadoop@node01 ~]$ ulimit -Hn
131072
[hadoop@node01 ~]$ ulimit -Sn
65536
[hadoop@node01 ~]$ ulimit -Hu
4096
[hadoop@node01 ~]$ ulimit -Su
4096
1.3.4 Запуск кластера ES
nohup /usr/local/elasticsearch-6.7.0/bin/elasticsearch 2>&1 &
После успешного запуска jsp может увидеть сервисный процесс es и получить доступ к странице
http://node3:9200/?pretty
Примечание. Если какая-либо служба машины не запускается, перейдите к журналам той машины, чтобы просмотреть журнал ошибок.
Появляется эта страница, она уже запущена, очень некрасиво
1.3.5 плагин elasticsearch-head
Так как интерфейс доступа некрасивый после запуска службы es, чтобы лучше просматривать информацию в библиотеке индексов, мы можем установить плагин elasticsearch-head для достижения этого, этот плагин может видеть интерфейс управления es удобнее и быстрее
Сначала установите node.js
1.3.6 Node.js
Node.js — это среда выполнения JavaScript, основанная на движке Chrome V8.
Node.js - это среда выполнения JavaScript, выпущенная в мае 2009 года и разработана RYAN DAHL, которая по сути является пакетом двигателя Chrome V8. Node.js - это не JavaScript Framework, в отличие от CakePhp, Django, Rails. Node.js - это не библиотека боковой браузеры и не может сравниться с jQuery и extjs. Node.js - это платформа разработки, которая позволяет JavaScript запустить на стороне сервера. Это делает JavaScript язык сценариев на равных основаниях с языками на стороне серверов, таких как PHP, Python, Perl и Ruby.
Ссылка на этапы установки: https://www.cnblogs.com/kevingrace/p/8990169.html
Скачав установочный пакет, разархивируем его и проведем некоторую настройку.
sudo ln -s /usr/local/node-v8.1.0-linux-x64/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
sudo ln -s /usr/local/node-v8.1.0-linux-x64/bin/node /usr/local/bin/node
Затем измените переменную среды
sudo vim .bash_profile
export NODE_HOME=/usr/local/node-v8.1.0-linux-x64
export PATH=:$PATH:$NODE_HOME/bin
Затем источник его
Вышеупомянутая версия узла и npm может появиться
1.3.7 Установка плагина elasticsearch-head
Если вы устанавливаете его онлайн, вы не порекомендуете его, потому что скорость сети у всех (вы знаете), конечно, не такая, как у этого вида установочного пакета.
В это время мы разархивируем его, а затем модифицируем Gruntfile.js
cd /usr/local/elasticsearch-head
vim Gruntfile.js
Вы можете напрямую сдвинуть +:, перейти в командный режим, использовать /hostname, чтобы найти этот параметр, имя хоста: «ваш собственный IP-адрес узла»
после
cd /usr/local/elasticsearch-head/_site
vim app.js
Та же процедура, что и выше, сначала найдите ключевое слово http://, а затем измените localhost на свой собственный IP-адрес узла.
Затем мы можем запустить службу
cd /usr/local/elasticsearch-head/node_modules/grunt/bin/
nohup ./grunt server >/dev/null 2>&1 &
посетить послеhttp: // Ваш узел IP: 9100 / для посещения, конечно, это тоже страница, которая выглядит не очень хорошо.Кроме того, у меня здесь две виртуальные машины, поэтому у меня нет возможности запустить одну ноду.
1.3.8 Как закрыть
Выполните следующую команду, чтобы найти процесс плагина elasticsearch-head, а затем используйте команду kill -9, чтобы завершить процесс.
sudo yum install net-tools
netstat -nltp | grep 9100
kill -9 88297
1.3.9 Установка Кибаны
Эта вещь в основном распакована и может быть использована.
Сначала подготовьте установочный пакет, а затем разархивируйте его
cd /usr/local/kibana-6.7.0-linux-x86_64/config/
vi kibana.yml
配置内容如下:
server.host: "node3"
elasticsearch.hosts: ["http://node3:9200"]
Тогда мы можем начать
cd /usr/local/kibana-6.7.0-linux-x86_64
nohup bin/kibana >/dev/null 2>&1 &
Все, что вам нужно, это подождать
ну подождем немного 😂
Здесь написано, что он сообщает вам, что в вашем кластере нет данных, просто нажмите на первый в это время.
На этот раз, даже если установка завершена. После этого наш метод взаимодействия — инструменты DEV --- инструменты разработчика для взаимодействия с ES.
2. Простое управление ElasticSearch
2.1 Некоторые концепции ЭС
Давайте используем традиционную реляционную базу данных в качестве аналогии.
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Обычно мы связываемся с MySQL, которая не является несколькими базами данных, несколькими таблицами базы данных для каждой таблицы, каждая таблица имеет много строк данных, поле столбцов, а затем данные
Есть много индексных библиотек Indices под ES, а под ним много Types, похожих на таблицы, каждый кусок данных — это документы, а поля — это Fields
2.2 Объяснение некоторых имен собственных
2.2.1, указательный указатель
Индекс представляет собой набор документов с похожими характеристиками. Например, у вас может быть индекс данных о клиентах, еще один индекс каталогов продуктов и индекс данных о заказах. Индекс идентифицируется по имени (Должны быть все строчные буквы), и мы используем это имя, когда хотим индексировать, искать, обновлять и удалять документы, соответствующие этому индексу. Внутри кластера может быть определено любое количество индексов.
2.2.2, тип тип
В индексе вы можете определить один или несколько типов. Тип — это логическая классификация/раздел вашего индекса, семантика которого полностью зависит от нас. Обычно тип определяется для документов с общим набором полей. Например, предположим, что вы используете платформу для ведения блогов и храните все свои данные в индексе. В этом индексе вы можете определить один тип для пользовательских данных, другой тип для данных блога и, конечно же, еще один тип для данных комментариев.
2.2.3, Поле Поле
Это эквивалентно полю таблицы данных, а также классификации и идентификации данных документа по различным атрибутам.
2.2.4, отображение отображения
По сути, это то же самое, что и JavaBean. Сопоставление заключается в том, чтобы наложить некоторые ограничения на способ и правила обработки данных, такие как тип данных, значение по умолчанию, анализатор, индексация поля и т. д. Они могут быть установлены в сопоставлении, а другие являются некоторыми данных в es.Использование настроек правил также называется сопоставлением.Обработка данных по оптимальным правилам значительно повышает производительность.Поэтому необходимо установить сопоставление, и необходимо подумать о том, как установить сопоставление для повышения производительности.
2.2.5, документ документ
Документ — это основная единица информации, которая может быть проиндексирована. Например, у вас может быть документ для клиента, документ для продукта и, конечно же, документ для заказа. Документы представлены в формате JSON (Javascript Object Notation), а JSON — это повсеместно распространенный формат обмена данными в Интернете.
Внутри индекса/типа вы можете хранить столько документов, сколько хотите. Обратите внимание, что хотя документ физически существует в индексе, документ должен быть проиндексирован/назначен тип индекса.
2.2.6 НЗТ в режиме, близком к реальному времени
Elasticsearch — это поисковая платформа, работающая практически в реальном времени. Это означает, что существует небольшая задержка (обычно в пределах 1 секунды) от индексации документа до того, как документ станет доступным для поиска.
2.2.7, осколки и реплики осколки и реплики
Индекс может хранить большие объемы данных за пределами аппаратных ограничений одного узла. Например, индекс с 1 миллиардом документов занимает 1 ТБ дискового пространства, а ни у одного узла нет такого большого дискового пространства, или один узел обрабатывает поисковые запросы и отвечает слишком медленно. Для решения этой проблемы Elasticsearch предоставляет возможность разделить индекс на несколько частей, которые называются осколками. При создании индекса вы можете указать желаемое количество осколков. Каждый шард сам по себе является полнофункциональным и независимым «индексом», который можно разместить на любом узле кластера. Разделение важно по двум основным причинам:
允许你水平分割/扩展你的内容容量。
允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
То, как распространяется сегмент и как его документы снова объединяются в поисковые запросы, полностью управляется Elasticsearch и является прозрачным для вас как пользователя.
В сетевой среде, где сбои могут произойти в любое время, когда сегмент/узел каким-то образом отключается или исчезает по какой-либо причине, очень полезен механизм аварийного переключения. Для этой цели Elasticsearch позволяет создать одну или несколько копий шарда, эти копии называются репликами или в китайском переводе могут называться репликами.
Реплики важны по двум основным причинам:
Обеспечивает высокую доступность в случае сбоя сегмента/узла. по этой причине,Реплицированные осколки никогда не размещаются на том же узле, что и исходные/основные осколки.. Масштабируйте объем/пропускную способность поиска, поскольку поиск можно выполнять на всех репликах параллельно. Таким образом, каждый индекс можно разделить на несколько осколков. Индекс также может быть реплицирован 0 раз (что означает отсутствие репликации) или несколько раз. После репликации у каждого индекса есть основной сегмент (исходный сегмент, из которого он был реплицирован) и реплицированный сегмент (копия основного сегмента). Количество сегментов и реплик можно указать во время создания индекса. Вы можете динамически изменить количество реплик в любое время после создания индекса, но вы не можете изменить количество сегментов впоследствии.
По умолчанию каждый индекс в Elasticsearch разделен на 5 основных сегментов и 1 реплику, что означает, что если в вашем кластере есть как минимум два узла, ваш индекс будет иметь 5 основных сегментов и 1 реплику. Еще 5 реплицированных сегментов (1 полная копия). всего 10 осколков на индекс.
2.2.8, инструмент управления
curl — это инструмент для передачи файлов с открытым исходным кодом, который использует синтаксис URL для работы в режиме командной строки. С помощью curl можно легко реализовать распространенные запросы на получение/отправку. Просто подумайте об этом как об инструменте, который может получить доступ к URL-адресу из командной строки. В стандартной библиотеке Centos есть инструмент curl, если нет установки yum.
yum -y install curl
curl
-X 指定http的请求方法 有HEAD GET POST PUT DELETE
-d 指定要传输的数据
-H 指定http请求头信息
2.3 Используйте Xput для создания индекса
2.3.1 Создать индекс
На данный момент в нашем индексе только индекс, созданный Kibana для нас по умолчанию.
Выполните следующую инструкцию в наших инструментах разработки kibana.
curl -XPUT http://node3:9200/blog01/?pretty
kibana автоматически сделает для нас некоторые настройки форматирования
После успешного выполнения мы снова можем видеть так называемую красивую страницу в это время🤣
2.3.2 Вставка части данных
curl -XPUT http://node3:9200/blog01/article/1?pretty -d '{"id": "1", "title": "What is ELK"}'
Добавьте документ в /article (тип документа) с помощью команды PUT и назначьте документу идентификатор 1. URL-адрес отображается как индекс/тип документа/идентификатор.
Мы можем нажать на blog01 в модуле просмотра данных, чтобы просмотреть
Если что-то пойдет не так: заголовок Content-Type [application/x-www-form-urlencoded] не поддерживается
По этой причине ES добавляет механизм безопасности и выполняет строгую проверку типа контента.Строгая проверка типа контента также может использоваться в качестве уровня защиты от атак с подделкой межсайтовых запросов.Официальное объяснение веб-сайта
http.content_type.required
2.3.3 Данные запроса
curl -XGET http://node3:9200/blog01/article/1?pretty
Эту команду можно выполнить в Kibana или в кластере.
2.3.4 Обновление документации
Операция обновления в основном такая же, как и вставка, потому что если есть id, он будет обновлен, а если id нет, он будет вставлен, что похоже на операцию в Java.
curl -XPUT http://node3:9200/blog01/article/1?pretty -d '{"id": "1", "title": " What is elasticsearch"}'
Картинка не выложена, просто повеселитесь
2.3.5 Поиск документов
curl -XGET "http://node3:9200/blog01/article/_search?q=title:elasticsearch"
2.3.6 Удаление документов и указателей
удалить документ
curl -XDELETE "http://node3:9200/blog01/article/1?pretty"
падение индекса
curl -XDELETE http://node3:9200/blog01?pretty
Выполнение будет удалено, и я не буду выполнять его здесь.
2.4 Условный запрос ЭС
Давайте сначала смоделируем некоторые данные
POST /school/student/_bulk
{ "index": { "_id": 1 }}
{ "name" : "tellYourDream", "age" : 25 , "sex": "boy", "birth": "1995-01-01" , "about": "i like bigdata" }
{ "index": { "_id": 2 }}
{ "name" : "guanyu", "age" : 21 , "sex": "boy", "birth": "1995-01-02" , "about": "i like diaocan" }
{ "index": { "_id": 3 }}
{ "name" : "zhangfei", "age" : 18 , "sex": "boy", "birth": "1998-01-02" , "about": "i like travel" }
{ "index": { "_id": 4 }}
{ "name" : "diaocan", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and sport" }
{ "index": { "_id": 5 }}
{ "name" : "panjinlian", "age" : 25 , "sex": "girl", "birth": "1991-01-02" , "about": "i like travel and wusong" }
{ "index": { "_id": 6 }}
{ "name" : "caocao", "age" : 30 , "sex": "boy", "birth": "1988-01-02" , "about": "i like xiaoqiao" }
{ "index": { "_id": 7 }}
{ "name" : "zhaoyun", "age" : 31 , "sex": "boy", "birth": "1997-01-02" , "about": "i like travel and music" }
{ "index": { "_id": 8 }}
{ "name" : "xiaoqiao", "age" : 18 , "sex": "girl", "birth": "1998-01-02" , "about": "i like caocao" }
{ "index": { "_id": 9 }}
{ "name" : "daqiao", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and history" }
Просто скопируйте его в кибану и выполните
В это время вы также можете увидеть это на стороне ES-головы.
2.4.1 1. Используйте match_all для запроса
GET /school/student/_search?pretty
{
"query": {
"match_all": {}
}
}
Проблема: после сопоставления через match_all будут получены все данные, но часто реальное требование бизнеса состоит не в том, чтобы найти все данные, а в том, чтобы получить то, что вы хотите; а для кластера es получить все данные напрямую, это легко чтобы вызвать явление GC. Итак, нам нужно научиться эффективно извлекать данные.
2.4.2 Запрос по ключевому полю
GET /school/student/_search?pretty
{
"query": {
"match": {"about": "travel"}
}
}
Что мне делать, если я хочу узнать о ком-то, кто любит путешествовать и не может быть мальчиком?
[Этот метод неверен, т.к. при совпадении не могут отображаться значения нескольких полей [соответствие] запрос не поддерживает несколько полей], нужно использовать составной запрос
2.4.3 Составной запрос для bool
При наличии нескольких комбинаций операторов запроса для их включения можно использовать bool. bool и агрегация включают: must, must_not or should, should означает или
Пример: опрос людей, не являющихся мужчинами, которые любят путешествовать
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "match": {"about": "travel"}},
"must_not": {"match": {"sex": "boy"}}
}
}
}
2.4.4, должен в составном запросе bool
Должен означает необязательный (если должен совпадать, он будет отображаться, в противном случае он не будет отображаться)
пример:
Запрос кто любит путешествовать, если есть мужчина, то он будет отображаться, иначе не отображаться
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "match": {"about": "travel"}},
"should": {"match": {"sex": "boy"}}
}
}
}
2.4.5, сопоставление терминов
Используйте термин для точных совпадений (таких как числа, даты, логические значения или строки not_analyzed (неанализированные текстовые типы данных))
грамматика
{ "term": { "age": 20 }}
{ "term": { "date": "2018-04-01" }}
{ "term": { "sex": “boy” }}
{ "term": { "about": "travel" }}
Пример: запрос, кто любит путешествовать
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "term": {"about": "travel"}},
"should": {"term": {"sex": "boy"}}
}}
}
2.4.6. Используйте термины для сопоставления нескольких значений
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "terms": {"about": ["travel","history"]}}
}
}
}
2.4.7, Фильтрация диапазона
Фильтрация диапазона позволяет нам найти некоторые данные в соответствии с заданным диапазоном: Рабочий диапазон:
gt: --- 大于
gae: --- 大于等于
lt: --- 小于
lte: --- 小于等于
Пример: найти учащихся старше 20 лет и младше 25 лет.
GET /school/student/_search?pretty
{
"query": {
"range": {
"age": {"gt":20,"lte":25}
}
}
}
2.4.8, существует и отсутствует фильтрация
существующие и отсутствующие фильтры могут определить, содержит ли документ поле или не имеет поля
пример:
Найти документы с возрастом в поле
GET /school/student/_search?pretty
{
"query": {
"exists": {
"field": "age"
}
}
}
2.4.9, мультиусловная фильтрация bool
Использование bool также может фильтровать многострочные условия, такие как предыдущее совпадение:
must: --- 多个查询条件的完全匹配,相当于 and 。
must_not: --- 多个查询条件的相反匹配,相当于 not 。
should: --- 至少有一个查询条件匹配, 相当于 or
пример:
Отфильтровать учащихся, чье поле about содержит информацию о путешествиях и старше 20 и моложе 30 лет.
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": [
{"term": {
"about": {
"value": "travel"
}
}},{"range": {
"age": {
"gte": 20,
"lte": 30
}
}}
]
}
}
}
2.4.10 Комбинация условий запроса и фильтра
Часто сложный запрос, мы должны сотрудничать для реализации оператора фильтра кэширования, поскольку вы можете достичь с помощью оператора фильтра
Пример: запрос документов, которые любят путешествовать и возраст которых составляет 20 лет.
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": {"match": {"about": "travel"}},
"filter": [{"term":{"age": 20}}]
}
}
}
2.5 Важные понятия в сопоставлениях и настройках ES
Сопоставления в основном используются для определения типа поля в ES. В es каждое поле будет иметь тип по умолчанию. Согласно первому вводу данных в него, es автоматически выведет тип поля для нас. Конечно, мы также можно установить сопоставления, чтобы заранее настроить тип нашего поля.
DELETE document
PUT document
{
"mappings": {
"article" : {
"properties":
{
"title" : {"type": "text"} ,
"author" : {"type": "text"} ,
"titleScore" : {"type": "double"}
}
}
}
}
Затем вы можете использовать get document/article/_mapping для просмотра
Настройки в основном используются для определения количества осколков и реплик.
DELETE document
PUT document
{
"mappings": {
"article" : {
"properties":
{
"title" : {"type": "text"} ,
"author" : {"type": "text"} ,
"titleScore" : {"type": "double"}
}
}
}
}
GET /document/_settings
Т.к. нода у меня только одна, скриншот картинки со стороны ES-головы делать не буду, бесполезно😂
В-третьих, пейджинговое решение ES
Смоделируйте некоторые данные, а затем скопируйте их непосредственно в Kibana для выполнения.
DELETE us
POST /_bulk
{ "create": { "_index": "us", "_type": "tweet", "_id": "1" }}
{ "email" : "john@smith.com", "name" : "John Smith", "username" : "@john" }
{ "create": { "_index": "us", "_type": "tweet", "_id": "2" }}
{ "email" : "mary@jones.com", "name" : "Mary Jones", "username" : "@mary" }
{ "create": { "_index": "us", "_type": "tweet", "_id": "3" }}
{ "date" : "2014-09-13", "name" : "Mary Jones", "tweet" : "Elasticsearch means full text search has never been so easy", "user_id" : 2 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "4" }}
{ "date" : "2014-09-14", "name" : "John Smith", "tweet" : "@mary it is not just text, it does everything", "user_id" : 1 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "5" }}
{ "date" : "2014-09-15", "name" : "Mary Jones", "tweet" : "However did I manage before Elasticsearch?", "user_id" : 2 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "6" }}
{ "date" : "2014-09-16", "name" : "John Smith", "tweet" : "The Elasticsearch API is really easy to use", "user_id" : 1 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "7" }}
{ "date" : "2014-09-17", "name" : "Mary Jones", "tweet" : "The Query DSL is really powerful and flexible", "user_id" : 2 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "8" }}
{ "date" : "2014-09-18", "name" : "John Smith", "user_id" : 1 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "9" }}
{ "date" : "2014-09-19", "name" : "Mary Jones", "tweet" : "Geo-location aggregations are really cool", "user_id" : 2 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "10" }}
{ "date" : "2014-09-20", "name" : "John Smith", "tweet" : "Elasticsearch surely is one of the hottest new NoSQL products", "user_id" : 1 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "11" }}
{ "date" : "2014-09-21", "name" : "Mary Jones", "tweet" : "Elasticsearch is built for the cloud, easy to scale", "user_id" : 2 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "12" }}
{ "date" : "2014-09-22", "name" : "John Smith", "tweet" : "Elasticsearch and I have left the honeymoon stage, and I still love her.", "user_id" : 1 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "13" }}
{ "date" : "2014-09-23", "name" : "Mary Jones", "tweet" : "So yes, I am an Elasticsearch fanboy", "user_id" : 2 }
{ "create": { "_index": "us", "_type": "tweet", "_id": "14" }}
{ "date" : "2014-09-24", "name" : "John Smith", "tweet" : "How many more cheesy tweets do I have to write?", "user_id" : 1 }
3.1 размер+от мелкого пейджинга
Согласно общему процессу запроса, если я хочу запросить первые 10 данных:
- Запрос клиента отправляется на узел
- Узел пересылает на каждый сегмент и запрашивает первые 10 элементов в каждом сегменте.
- Результат возвращается узлу, данные интегрируются и извлекаются первые 10 элементов.
- возвращается запрашивающему клиенту
from определяет значение смещения целевых данных, а size определяет количество возвращаемых событий.
Запросить данные первых 5 элементов
GET /us/_search?pretty
{
"from" : 0 , "size" : 5
}
Подсчет от статьи 5, запрос 5 статей
GET /us/_search?pretty
{
"from" : 5 , "size" : 5
}
После этого мы таким образом запрашиваем наши данные ES в Java API, но такой вид неглубокого пейджинга подходит только для небольшого количества данных, потому что по мере увеличения от время запроса будет увеличиваться, и чем больше объем данных , индекс эффективности запросов снизится.
Преимущества: from+size более эффективен, когда объем данных невелик.
Недостатки: В случае очень большого объема данных пейджинг from+size загрузит все записи в память, что не только будет очень медленно запускать экспресс, но и легко приведет к тому, что ES закончится память и зависнет
3.2 Глубокая прокрутка страниц
Для неглубокой разбивки на страницы, описанной выше, когда Elasticsearch отвечает на запрос, он должен определить порядок документов и ранжировать результаты ответа.
Если количество запрошенных страниц невелико (скажем, 20 документов на странице), у Elasticsearch не возникнет проблем, но если количество страниц велико, например, запрос страницы 20, Elasticsearch должен получить все страницы с 1 по 20. документы , а затем удалите документы со страниц с 1 по 19, чтобы получить документы на странице 20.
Решение состоит в использовании прокрутки, которая поддерживает моментальный снимок текущего сегмента индекса - кэш (эта информация о моментальном снимке является моментальным снимком при выполнении запроса прокрутки).
Прокрутку можно разделить на два этапа: инициализация и обход: 1. При инициализации все результаты поиска, удовлетворяющие условиям поиска, кэшируются, что можно представить в виде снимка 2. При обходе берутся данные из этого снимка;
初始化
GET us/_search?scroll=3m
{
"query": {"match_all": {}},
"size": 3
}
При инициализации это похоже на обычный поиск, где scroll=3m означает, что данные текущего запроса кэшируются на 3 минуты. Размер: 3 представляет собой текущий запрос из 3 фрагментов данных.
При обходе получите scrollid в предыдущем обходе, затем возьмите параметр прокрутки, повторите последний шаг обхода и знайте, что возвращаемые данные пусты, это означает, что обход завершен
GET /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAShGFnE5ZURldkZjVDFHMHVaODdBOThZVWcAAAAAAAEoSRZxOWVEZXZGY1QxRzB1Wjg3QTk4WVVnAAAAAAABKEcWcTllRGV2RmNUMUcwdVo4N0E5OFlVZwAAAAAAAShIFnE5ZURldkZjVDFHMHVaODdBOThZVWcAAAAAAAEoShZxOWVEZXZGY1QxRzB1Wjg3QTk4WVVn"
}
Примечание: Вы должны передавать параметр scroll каждый раз, чтобы обновить время кеша результатов поиска, кроме того, вам не нужно указывать индекс и тип (не устанавливайте слишком большое время кеша, которое будет занимать память )
В сравнении:
Неглубокое разбиение по страницам, каждый запрос будет отправляться в индексную библиотеку (локальную папку) для запроса данных pageNum*page, а затем перехватывать предыдущие данные, оставляя последние данные. Такая операция будет выполняться с каждым осколком, и, наконец, данные нескольких осколков будут объединены, снова отсортированы и перехвачены по мере необходимости.
Глубокая подкачка может одновременно помещать в память все данные, соответствующие условиям запроса. При подкачке запрашивать в памяти. Относительно неглубокая подкачка позволяет избежать многократного чтения с диска.
В-четвертых, китайский токенизатор ES IK
ES лучше поддерживает токенизатор английского текста по умолчанию, но, как и в lucene, если вам нужно выполнить полнотекстовый поиск на китайском языке, вам нужно использовать китайский токенизатор.Как и в lucene, вам необходимо интегрировать токенизатор IK перед использованием китайского языка. полнотекстовый поиск. Затем мы установим токенизатор IK для сегментации китайских слов.
4.1 Скачать
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.0/elasticsearch-analysis-ik-6.7.0.zip
Затем создайте новый каталог в каталоге ES для хранения плагина.
mkdir -p /usr/local/elasticsearch-6.7.0/plugins/analysis-ik
unzip elasticsearch-analysis-ik-6.7.0.zip -d /usr/local/elasticsearch-6.7.0/plugins/analysis-ik/
Затем вы можете распространять его на другие машины
cd /usr/local/elasticsearch-6.7.0/plugins
scp -r analysis-ik/ node2:$PWD
После этого нужно перезапустить службу ES
ps -ef|grep elasticsearch | grep bootstrap | awk '{print $2}' |xargs kill -9
nohup /kkb/install/elasticsearch-6.7.0/bin/elasticsearch 2>&1 &
4.2 Опыт один
Создайте библиотеку индексов в kibana и настройте токенизатор IK
delete iktest
PUT /iktest?pretty
{
"settings" : {
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik_max_word"
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"subject" : {
"type" : "text",
"analyzer" : "ik_max_word"
}
}
}
}
}
При создании индексной библиотеки мы указываем метод сегментации слов как ik_max_word, который будет выполнять наиболее точную сегментацию нашего китайского языка Теперь давайте посмотрим на эффект
Здесь видно, что мой id разбит на несколько частей
Вы также можете использовать следующий синтаксис, чтобы выделить ваш запрос, такой как этот эффект
POST /iktest/article/_search?pretty
{
"query" : { "match" : { "subject" : "抗击肺炎" }},
"highlight" : {
"pre_tags" : ["<font color=red>"],
"post_tags" : ["</font>"],
"fields" : {
"subject" : {}
}
}
}
4.3 Настройка обновления Hotword
Мы можем обнаружить, что мой ID разделен на несколько частей, потому что «скажи свое желание» — это не модное слово с точки зрения плагина, но мы можем сказать ему, что я — модное слово 🤣
Например, сейчас разделился мастер теневого потока Цай Сюкунь, так как же нам его настроить? Нам нужно иметь возможность обновлять наши сетевые горячие слова в режиме реального времени Мы можем решить эту проблему, внедрив удаленный тезаурус через tomcat.
4.4 Установите кота
Просто установите tomcat и только один
Затем вам нужно перейти к его ROOT пути, например, мой
cd /usr/local/apache-tomcat-8.5.34/webapps/ROOT
然后new一个file出来
vi hot.dic
Затем сохраните и выйдите
Затем запустите свой tomcat, если запуск прошел успешно, вы увидите службу начальной загрузки.
Вы можете получить доступ к hot.dic
4.5 Изменить конфигурацию токенизатора
Фактически, изменить этот файл
Нажмите там несколько китайских аннотаций, и тогда вы увидите это
Удалите комментарий к этой строке, а затем настройте путь к слову tomcat, к которому мы только что обращались, то естьhttp://192.168.200.11:8080/hot.dicПросто
Затем распространите этот файл конфигурации на два других узла.
Затем мы можем перезапустить ES, и теперь мы будем выполнять сегментацию слов, и будут ключевые слова.
finally
Эта статья в основном посвящена развертыванию, и позже она будет включать в себя работу с некоторыми API, поэтому длина не будет такой большой 😶