Не просто ищите журналы, пожалуйста, поймите принцип поиска

задняя часть
Не просто ищите журналы, пожалуйста, поймите принцип поиска

Основное содержание этой статьи следующее:

主要内容

предисловие

В проектах мы всегда используемKibanaИнтерфейс для поиска журналов в тестовой или производственной среде, чтобы увидеть, есть ли какая-либо ненормальная информация.Kibanaэто то, что мы всегда говоримELKсерединаK.

Интерфейс Kibana показан ниже:

Kibana 界面

Но каковы эти принципы извлечения журналов? Здесь на помощь приходит наша поисковая система Elasticsearch.

Я разделю его на три части, чтобы объяснить принцип, практику и развертывание Elasticsearch.Эта статья является первой, объясняющей ES.

  • Предыдущий:Объясните принцип Elasticsearch (ES) и конфигурацию сегментации китайских слов.
  • Середина:Практическое приложение ES.
  • Следующий:Кластерное развертывание ES.

Почему он разделен на три части, потому что каждая часть очень длинная и имеет разную направленность, поэтому она разделена на три части, чтобы объяснить.

1. Введение в Elasticsearch

1.1 Что такое Elasticsearch?

Elasticsearch — это распределенная система поиска и анализа с открытым исходным кодом для всех типов данных, включая текстовые, числовые, геопространственные, структурированные и неструктурированные данные. Короче говоря, пока это включает в себя поиск и анализ, ES может это сделать.

1.2 Для чего нужен Elasticsearch?

Elasticsearch отличается как скоростью, так и масштабируемостью, а его способность индексировать многие типы контента означает, что его можно использовать для различных вариантов использования:

  • Например, онлайн-магазин, где вы можете позволить клиентам искать продукты, которые вы продаете. В этом случае вы можете использовать Elasticsearch для хранения всего вашего каталога продуктов и инвентаря и предоставления им предложений по поиску и автозаполнению.

搜索手机

  • Например, сбор данных журнала или транзакций, а также анализ и анализ этих данных на предмет тенденций, статистики, сводок или аномалий. В этом случае вы можете использовать Logstash (часть стека Elasticsearch/Logstash/Kibana) для сбора, агрегирования и анализа данных, а затем позволить Logstash передавать эти данные в Elasticsearch. Когда данные находятся в Elasticsearch, вы можете запускать поиск и агрегацию для получения любой интересующей вас информации.

1.3 Как работает Elasticsearch?

ELK 原理图

Elasticsearch построен на основе Lucene. ES внесла много улучшений в Lucence.

Lucene — это подпроект проектной группы jakarta Apache Software Foundation 4.открытый источникПолнотекстовый поисковый инструментарий, но это не полная полнотекстовая поисковая система, но архитектура полнотекстовой поисковой системы, обеспечивая полный двигатель запроса и индексирующий двигатель, частьюАнализ текстаДвигатель (два западных языка, английский и немецкий). Цель Lucene — предоставить разработчикам программного обеспечения простой в использовании набор инструментов для простой реализации функций полнотекстового поиска в целевой системе или для создания на его основе полноценной системы полнотекстового поиска. (из энциклопедии Baidu)

Откуда берутся необработанные данные для Elasticsearch?

Необработанные данные поступают в Elasticsearch из нескольких источников, включая журналы, системные показатели и веб-приложения.

Как собираются данные Elasticsearch?

Прием данных — это процесс анализа, нормализации и обогащения этих необработанных данных перед их индексированием в Elasticsearch. Как только эти данные проиндексированы в Elasticsearch, пользователи могут выполнять сложные запросы к своим данным и использовать агрегации для получения сложных сводок своих собственных данных. Здесь используется Logstash, который будет представлен позже.

Как визуализировать данные, которые вы хотите получить?

Именно здесь в игру вступает Kibana, где пользователи могут искать, просматривать представления данных и многое другое на основе своих собственных данных.

1.4 Что такое индексы Elasticsearch?

Индекс Elasticsearch относится к набору взаимосвязанных документов. Elasticsearch хранит данные в виде документов JSON. Каждый документ связывает набор ключей (имен полей или свойств) с соответствующими им значениями (строками, числами, логическими значениями, датами, группами значений, географическими местоположениями или другими типами данных).

Elasticsearch использует структуру данных, называемую инвертированным индексом, которая предназначена для очень быстрого полнотекстового поиска. Инвертированный индекс перечисляет каждое уникальное слово, встречающееся во всех документах, и может найти все документы, содержащие каждое слово.

В процессе индексации Elasticsearch сохраняет документы и строит инвертированный индекс, чтобы пользователи могли искать данные документа практически в реальном времени. Процесс индексирования инициируется в Indexing API, который позволяет добавлять и изменять документы JSON в определенном индексе.

1.5 Для чего используется Logstash?

Логсташ этоELKсерединаL.

Logstash — один из основных продуктов Elastic Stack, который можно использовать для сбора и обработки данных и их отправки в Elasticsearch. Logstash — это конвейер обработки данных на стороне сервера с открытым исходным кодом, который позволяет одновременно получать, обогащать и преобразовывать данные из нескольких источников, прежде чем индексировать их в Elasticsearch.

1.6 Какова цель Кибаны?

Kibana — это инструмент визуализации и управления данными для Elasticsearch, который предоставляет гистограммы в реальном времени, линейные графики и многое другое.

1.7 Зачем использовать Elasticsearch

  • ES — это быстрая поисковая платформа, работающая практически в реальном времени.
  • ЭС имеет распределенный характер.
  • ES включает в себя широкий набор функций, таких как агрегация данных и управление жизненным циклом индекса.

Официальная документация:woohoo.elastic.co/talent/what-is/…

Во-вторых, основная концепция ES

2.1 Указатель

Глаголы: ВСТАВИТЬ в MySQL

Существительное: эквивалентно базе данных в Mysql.

Контраст с mysql

серийный номер Mysql Elasticsearch
1 Сервис MySQL Служба кластера ES
2 База данных базы данных показатель
3 Таблица Тип Тип
4 Record Records (построчные записи) Документ Документ (формат JSON)

2.2 Перевернутый индекс

Предположим, что в базе данных есть следующие записи фильмов:

1- Westward путешествие

2-История путешествия на запад

3-Анализ путешествия на запад

4- Путешествие на Запад: Покорение демонов

5- Эксклюзивный анализ фэнтезийного путешествия на запад

Сегментация слов: разделить все предложение на слова

серийный номер слова, сохраненные в es Соответствующий номер записи фильма
A Путешествие на Запад 1,2, 3,4, 5
B большой разговор 1,2, 3
C сплетни 2,4, 5
D Разобрать 3,5
E Демон 4
F мечтать 5
G эксклюзивный 5

Извлечение: Эксклюзивное путешествие на запад

будет独家大话西游разбор в独家,大话,西游

Все записи A, B и G в ES содержат одно из этих трех слов, поэтому все записи 1, 2, 3, 4 и 5 содержат связанные слова.

Рекорд №1 попадает 2 раза, как в А, так и в Б (попадание2Times), и № 1 записан2слов, оценка релевантности:2Второсортный/2слова =1

Запись № 2 содержит по 2 слова как в A, так и в B (попадание2раз ), а запись № 2 имеет2слов, оценка релевантности:2Второсортный/3слова =0.67

Запись № 3 содержит по 2 слова как в A, так и в B (попадание2раз ), а запись №3 имеет2слов, оценка релевантности:2Второсортный/3слова =0.67

Запись № 4 ударяет 2 слова в A (ударить1раз ), а запись 4 имеет2слов, оценка релевантности:1Второсортный/3слова =0.33

Запись № 5 соответствует 2 словам в А (попадание2раз ), а запись 4 имеет4слов, оценка релевантности:2Второсортный/4слова =0.5

Таким образом, порядок извлеченных записей следующий:

​ 1- Путешествие на запад (Оценка воображения: 1)

​ 2-История путешествия на запад (Оценка воображения: 0,67)

​ 3-Анализ путешествия на запад (оценка воображения: 0,67)

Эксклюзивный анализ 5-Fantasy Westward Journey (оценка воображения: 0,5)

4- Путешествие на Запад, чтобы победить демонов (оценка воображения: 0,33)

3. Среда сборки Docker

3.1 Настройка среды Elasticsearch

Чтобы собрать среду виртуальной машины и установить докер, вы можете обратиться к ранее написанным документам:

1) Загрузите файл изображения

docker pull elasticsearch:7.4.2

2) Создать экземпляр

    1. файл конфигурации сопоставления
配置映射文件夹
mkdir -p /mydata/elasticsearch/config

配置映射文件夹
mkdir -p /mydata/elasticsearch/data

设置文件夹权限任何用户可读可写
chmod 777 /mydata/elasticsearch -R

配置 http.host
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
    1. Запустите контейнер elasticsearch
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type"="single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
    1. Доступ к сервису эластичного поиска

доступ:http://192.168.56.10:9200

возвращенный ответ

{
  "name" : "8448ec5f3312",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "xC72O3nKSjWavYZ-EPt9Gw",
  "version" : {
    "number" : "7.4.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
    "build_date" : "2019-10-28T20:40:44.881551Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

доступ:http://192.168.56.10:9200/_catИнформация о узле доступа

127.0.0.1 62 90 0 0.06 0.10 0.05 dilm * 8448ec5f3312

3.2 Настройка среды Kibana

docker pull kibana:7.4.2

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2

Посетите кибану:http://192.168.56.10:5601/

kibana

В-четвертых, основной поисковый геймплей

4.1._использование кота

GET /_cat/nodes: 查看所有节点
GET /_cat/health: 查看 es 健康状况
GET /_cat/master: 查看主节点
GET /_cat/indices: 查看所有索引

查询汇总:
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates

4.2 Индексировать документ (сохранить)

Пример: вcustomerпод индексомexternalСохранить под типом, указанным как1Данные.

  • Создано с использованием инструментов разработчика Kibana.
PUT member/external/1

{
"name":"jay huang"
}

Reponse:

{
    "_index": "member", //在哪个索引
    "_type": "external",//在那个类型
    "_id": "2",//记录 id
    "_version": 7,//版本号
    "result": "updated",//操作类型
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 9,
    "_primary_term": 1
}
  • Записи также можно создавать, отправив запрос через инструмент Postman.

创建一条记录

Уведомление:

И PUT, и POST могут создавать записи.

POST: Если вы не укажете id, автоматически сгенерируется id. Если вы укажете идентификатор, эта запись будет изменена, и появится новый номер версии.

PUT: Необходимо указать id, если такой записи нет, то она будет добавлена, если есть, то она будет обновлена.

4.3 Запрос документов

请求:http://192.168.56.10:9200/member/external/2

Reposne:
{
    "_index": "member",   //在哪个索引
    "_type": "external",  //在那个类型
    "_id": "2",           //记录 id
    "_version": 7,        //版本号
    "_seq_no": 9,         //并发控制字段,每次更新就会+1,用来做乐观锁
    "_primary_term": 1,   //同上,主分片重新分配,如重启,就会变化
    "found": true,
    "_source": { //真正的内容
        "name": "jay huang"
 }
}

_seq_no используется как оптимистическая блокировка

После каждого обновления данных _seq_no будет +1, поэтому его можно использовать для управления параллелизмом.

При обновлении записи, если _seq_no не соответствует заданному значению, это означает, что запись была обновлена ​​хотя бы один раз, и это обновление не разрешено.

Использование заключается в следующем:

请求更新记录 2: http://192.168.56.10:9200/member/external/2?if_seq_no=9&&if_primary_term=1
返回结果:
{
    "_index": "member",
    "_type": "external",
    "_id": "2",
    "_version": 9,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 11,
    "_primary_term": 1
}

_seq_no равно 10, и данные обновляются, когда _primary_term = 1. После однократного выполнения запроса выполнение вышеуказанного запроса сообщит об ошибке: конфликт версий

{
    "error": {
        "root_cause": [
 {
                "type": "version_conflict_engine_exception",
                "reason": "[2]: version conflict, required seqNo [10], primary term [1]. current document has seqNo [11] and primary term [1]",
                "index_uuid": "CX6uwPBKRByWpuym9rMuxQ",
                "shard": "0",
                "index": "member"
 }
        ],
        "type": "version_conflict_engine_exception",
        "reason": "[2]: version conflict, required seqNo [10], primary term [1]. current document has seqNo [11] and primary term [1]",
        "index_uuid": "CX6uwPBKRByWpuym9rMuxQ",
        "shard": "0",
        "index": "member"
    },
    "status": 409
}

4.4 Документация обновления

  • использование

ПОСТ группа_updateЕсли исходные данные не менялись, то результат в репсонсе возвращает noop (нет операции), и версия не изменится.

Тело запроса должно использоватьdocОберните данные запроса.

POST 请求:http://192.168.56.10:9200/member/external/2/_update
{
    "doc":{
        "name":"jay huang"
 }
}
响应:
{
    "_index": "member",
    "_type": "external",
    "_id": "2",
    "_version": 12,
    "result": "noop",
    "_shards": {
        "total": 0,
        "successful": 0,
        "failed": 0
    },
    "_seq_no": 14,
    "_primary_term": 1
}

Сценарий использования: Для больших одновременных обновлений рекомендуется не_update. Для больших одновременных запросов небольшая сцена обновления может занять _update, по сравнению с обновлением.

  • добавлять атрибуты при обновлении

добавить в тело запросаageАтрибуты

http://192.168.56.10:9200/member/external/2/_update
request:
{
    "doc":{
        "name":"jay huang",
        "age": 18
 }
}
response:
{
    "_index": "member",
    "_type": "external",
    "_id": "2",
    "_version": 13,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 15,
    "_primary_term": 1
}

4.5 Удаление документов и индексов

  • удалить документ
DELETE 请求:http://192.168.56.10:9200/member/external/2
response:
{
    "_index": "member",
    "_type": "external",
    "_id": "2",
    "_version": 2,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}
  • падение индекса
DELETE 请求:http://192.168.56.10:9200/member
repsonse:
{
    "acknowledged": true
}
  • Нет функции удаления типа

4.6 Пакетный импорт данных

Используя инструменты разработчика kinaba, введите следующий оператор

POST /member/external/_bulk
{"index":{"_id":"1"}}
{"name":"Jay Huang"}
{"index":{"_id":"2"}}
{"name":"Jackson Huang"}

Результат выполнения показан на следующем рисунке:

批量插入数据

  • Скопируйте официальные данные образца
https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json

官方样本数据

  • Выполнение скриптов в кибане
POST /bank/account/_bulk
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
......

批量插入样本数据的执行结果

  • Посмотреть все индексы

查看所有索引

Из возвращенных результатов видно, что в банковском индексе содержится 1000 фрагментов данных, занимающих 440,2 КБ дискового пространства.

5. Расширенный игровой процесс поиска

5.1 Два метода запроса

5.1.1 URL, за которым следуют параметры

GET bank/_search?q=*&sort=account_number: asc

```/_search?q=*&sort=account_number: asc`

Запрос всех данных, всего 1000 фрагментов данных, это занимает 1 мс, и отображаются только 10 фрагментов данных (пейджинг ES)

URL 后接参数

Описание значения свойства:

took – ES 执行搜索的时间 ( 毫秒 )
timed_out – ES 是否超时
_shards – 有多少个分片被搜索了,以及统计了成功/失败/跳过的搜索的分片
max_score – 最高得分
hits.total.value - 命中多少条记录
hits.sort - 结果的排序 key 键,没有则按 score 排序
hits._score - 相关性得分
参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-search.html

5.1.2 URL-адрес плюс тело запроса на поиск (QueryDSL)

Напишите условия запроса в теле запроса

грамматика:

GET bank/_search
{
  "query":{"match_all": {}},
  "sort": [
    {"account_number": "asc" }
 ]
}

Пример: запросить все, сначала отсортировать по номеру счета в порядке возрастания, а затем отсортировать по балансу в порядке убывания.

URL 加请求体进行检索

5.2 Подробный запрос QueryDSL

DSL: Domain Specific Language

5.2.1 Сопоставить все match_all

Пример: запросить все записи, отсортировать по балансу в порядке убывания, вернуть только записи с 11-й по 20-ю и отобразить только поля баланса и имени.

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
 {
      "balance": {
        "order": "desc"
 }
 }
  ],
  "from": 10,
  "size": 10,
  "_source": ["balance", "firstname"]
}

5.2.2 Соответствие запросу

  • базовый тип (не строка), точное совпадение
GET bank/_search
{
  "query": {
    "match": {"account_number": "30"}
 }
}
  • Строка, полнотекстовый поиск
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill road"
 }
 }
}

字符串全文检索

Полнотекстовый поиск сортируется в соответствии с оценкой, а критерии поиска будут соответствовать сегментации слов.

Запросaddressсодержитmillилиroadилиmill roadи дать оценку корреляции.

Было найдено 32 записи, самая высокая из них была Address = "990 Mill Road", оценка: 8,926605. Address="198 Mill Lane" оценка 5,4032025, совпало только слово Mill.

5.2.3 Матч Match_Phase

Получить значение для сопоставления как целое слово (без причастий)

GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
 }
 }
}

Узнать, что адрес содержитmill roadВсе записи и дать оценку релевантности

5.2.4 Сопоставление нескольких полей multi_match

GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill land",
      "fields": [
        "state",
        "address"
 ]
 }
 }
}

Запрос в multi_match также выполняет токенизацию.

ЗапросstateВключаютmillилиlandилиaddressВключаютmillилиlandзапись о.

5.2.5 Составной запрос bool

Составные операторы можно комбинировать с любыми другими операторами запроса, включая составные операторы. Составные операторы могут быть вложены друг в друга и могут выражать сложную логику.

Используйте с must,must_not,should

must: условие, указанное must, должно быть выполнено. (влияет на показатель релевантности)

must_not: Условие must_not не должно выполняться. (не влияет на показатель релевантности)

должен: если условие должно быть выполнено, оценка может быть увеличена. Если вас это не устраивает, вы также можете запросить запись. (влияет на показатель релевантности)

Пример: записи запроса, в которых адрес содержит слово «мельница», пол — М, а возраст — не 28 лет, а записи, в которых имя содержит слово «Винни», отображаются в первую очередь.

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
 {
          "match": {
            "address": "mill"
 }
        },
 {
          "match": {
            "gender": "M"
 }
 }
      ],
      "must_not": [
 {
          "match": {
            "age": "28"
 }
 }
      ],
      "should": [
 {
          "match": {
            "firstname": "Winnie"
 }
 }
 ]
 }
 }
}

5.2.6 фильтр

Не влияет на показатель корреляции и запрашивает записи, соответствующие условиям фильтрации.

Используйте логическое значение.

GET bank/_search
{
  "query": {
    "bool": {
      "filter": [
 {
          "range": {
            "age": {
              "gte":18,
              "lte":40
 }
 }
 }
 ]
 }
 }
}

5.2.7 термин запрос

Соответствует значению атрибута.

Используйте совпадение для полей полнотекстового поиска и термин для других нетекстовых полей.

ключевое слово: точное совпадение текста (соответствует всем)

match_phase: совпадение текстовой фразы

非 text 字段精确匹配
GET bank/_search
{
  "query": {
    "term": {
      "age": "20"
 }
 }
}

5.2.8 агрегации

Агрегация: группировка и извлечение данных из данных. Аналогично SQL GROUP BY и агрегатным функциям SQL.

Elasticsearch может одновременно возвращать хиты и несколько агрегатов.

Общий синтаксис:

"aggregations" : {
    "<聚合名称 1>" : {
        "<聚合类型>" : {
            <聚合体内容>
        }
        [,"元数据" : {  [<meta_data_body>] }]?
        [,"aggregations" : { [<sub_aggregation>]+ }]?
    }
    [,"聚合名称 2>" : { ... }]*
}
  • Пример 1: Поиск распределения по возрасту (топ-10) и среднего возраста, а также средней зарплаты всех, чей адрес содержит большие
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
 }
  },
  "aggs": {
    "ageAggr": {
      "terms": {
        "field": "age",
        "size": 10
       }
    },
    "ageAvg": {
      "avg": {
        "field": "age"
      }
    },
    "balanceAvg": {
      "avg": {
        "field": "balance"
      }
   }
 }
}

Результаты поиска следующие:

Возвращается запись посещений, а также возвращаются три агрегированных результата: средний возраст 34 года, средняя зарплата 25208,0 и возрастное распределение Pinjun: 2 для 38-летних, 1 для 28-летних, и 1 для 32-летних

示例 1

Если вы не хотите возвращать результат попадания, вы можете установить размер: 0 в конце

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
 }
  },
  "aggs": {
    "ageAggr": {
      "terms": {
        "field": "age",
        "size": 10
      }
    }
  },
  "size": 0
}
  • Пример 2. Агрегируйте по возрасту и запросите среднюю зарплату для этих возрастных групп.

Из результатов видно, что 31-летний 61 человек со средней зарплатой 28 312,9, и агрегированные результаты других возрастов аналогичны.

示例 2

  • Пример 3. Сгруппируйте по возрасту, затем сгруппируйте сгруппированные результаты по полу, а затем запросите среднюю зарплату после этих групп.
GET bank/_search
{
  "query": {
    "match_all": {
 }
  },
  "aggs": {
    "ageAggr": {
      "terms": {
        "field": "age",
        "size": 10
      },
      "aggs": {
        "genderAggr": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
            "balanceAvg": {
              "avg": {
                "field": "balance"
          }
        }
      }
    }
  }
 }
  },
  "size": 0
}

Из результатов мы видим, что 31-летний 61 человек. из которых полM35 лет, средняя заработная плата 29565,6, полF26 из них, со средней зарплатой 26626,6. Совокупные результаты для других возрастов аналогичны.

聚合结果

5.2.9 Отображение

Отображение используется для определения документа (document) и того, как содержащиеся в нем свойства (field) хранятся и индексируются.

  • Определите, какие строковые свойства следует рассматривать как полнотекстовые свойства (полнотекстовые поля).
  • Определите, какие свойства содержат числа, даты или географические местоположения
  • Определяет, могут ли быть проиндексированы все свойства в документе (конфигурация _all).
  • Формат даты
  • Пользовательские правила сопоставления для динамического добавления свойств

Elasticsearch7 удаляет концепцию tpye:

В реляционной базе данных представление двух баз данных является независимым, даже если в них есть столбцы с одинаковыми именами, это не влияет на использование, но в ES это не так. Elasticsearch — это поисковая система, разработанная на базе Lucence, и поля с одинаковыми именами под разными типами в ES в итоге обрабатываются в Lucence одинаково.

Чтобы различать поля с одинаковыми именами в разных типах, Lucence необходимо справляться с конфликтами, что приводит к снижению эффективности поиска.

Версии ES7.x: Параметр типа в URL-адресе является необязательным.

Версия ES8.x: параметр type в URL не поддерживается

Все типы могут ссылаться на документацию:woohoo.elastic.co/expensive/en/bad…

  • отображение индекса запроса

Например, запрос индексной карты my-index

GET /my-index/_mapping
返回结果:
{
  "my-index" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "email" : {
          "type" : "keyword"
        },
        "employee-id" : {
          "type" : "keyword",
          "index" : false
        },
        "name" : {
          "type" : "text"
      }
    }
  }
 }
}
  • Создайте индекс и укажите сопоставление

Например, для создания индекса my-index есть три поля: возраст, электронная почта, имя, а указанный тип — междоусобица, ключевое слово, текст.

PUT /my-index
{
  "mappings": {
    "properties": {
      "age": { "type": "integer" },
      "email": { "type": "keyword"  },
      "name": { "type": "text" }
    }
 }
返回结果:
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my-index"
}

  • Добавить новое сопоставление полей

Например, добавьте полеploy-id в индекс my-index и укажите тип как ключевое слово.

PUT /my-index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
 }
}
  • обновить карту

Мы не можем обновлять существующие сопоставленные поля, мы должны создавать новые индексы для переноса данных.

  • перенос данных

POST _reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
 }
}

6. Сегментация китайских слов

В ES есть много встроенных токенизаторов, но он не подходит для сегментации китайских слов, поэтому нам нужно использовать сторонний инструментарий сегментации китайских слов.

6.1 Принцип сегментации слов в ЭС

6.1.1 Концепция токенизатора ES

Токенизатор ES берет поток символов, разбивает его на отдельные токены (токены) и выдает поток токенов.

ES предоставляет множество встроенных токенизаторов, которые можно использовать для создания пользовательских токенизаторов (пользовательских анализаторов).

6.1.2 Принцип стандартного токенизатора

Например, стандартный токенизатор stadard tokenizer при встрече с пробелами выполняет сегментацию слов. Токенизатор также отвечает за запись порядка или положения каждого термина (для фразовых фраз и запросов близости слов). Смещение символа для каждого слова (используется для выделения того, что нужно искать).

6.1.3 Примеры сегментации английского языка и слов пунктуации

Пример запроса выглядит следующим образом:

POST _analyze
{
  "analyzer": "standard",
  "text": "Do you know why I want to study ELK? 2 3 33..."
}

результат поиска:

do, you, know, why, i, want, to, study, elk, 2,3,33

Вы можете увидеть из результатов запроса:

(1) Знаки препинания не имеют причастий.

(2) Номера будут сегментированы.

英文句子分词

6.1.4 Примеры китайских слов

Однако этот токенизатор не поддерживает сегментацию китайских слов и будет сегментировать слова на отдельные китайские символы. Например, следующий пример будет悟空聊架构причастие,,,,, ожидаемое причастие悟空,,架构.

POST _analyze
{
  "analyzer": "standard",
  "text": "悟空聊架构"
}

中文分词悟空聊架构

Мы можем установить токенизатор ik для более удобной сегментации китайских слов.

6.2 Установка прерывателя слов

6.2.1 адрес токенизатора ik

адрес токенизатора ik:

https://github.com/medcl/elasticsearch-analysis-ik/releases

Сначала проверьте версию ES, я установил версию7.4.2, поэтому версия, которую мы устанавливаем, токенизатор ik также выбирает 7.4.2

http://192.168.56.10:9200/
{
  "name" : "8448ec5f3312",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "xC72O3nKSjWavYZ-EPt9Gw",
  "version" : {
    "number" : "7.4.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
    "build_date" : "2019-10-28T20:40:44.881551Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

选择 ik 分词器

6.2.2 Как установить токенизатор ik

6.2.2.1 Способ 1. Установите токенизатор ik в контейнер

  • Перейдите в каталог плагинов внутри контейнера es.
docker exec -it <容器 id> /bin/bash
  • Получить архив ik tokenizer
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
  • распаковать ик архив
unzip 压缩包
  • Удалить скачанный архив
rm -rf *.zip

6.2.2.2 Метод 2: файл карты для установки ik tokenizer

зайти в папку с картой

cd /mydata/elasticsearch/plugins

Загрузите установочный пакет

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
  • распаковать ик архив
unzip 压缩包
  • Удалить скачанный архив
rm -rf *.zip

6.2.2.3 Метод 3: Xftp загружает сжатый пакет в каталог сопоставления

Сначала используйте инструмент XShell для подключения к виртуальной машине (этапы работы см. в статье, написанной ранее [02. Быстрое создание среды Linux — необходимо для работы и обслуживания] (www.jayh.club/#/05.Installation and Deployment / 01. Environment Construction )) , а затем с помощью Xftp скопируйте загруженный установочный пакет на виртуальную машину.

Xftp 上传压缩包

6.3 Распакуйте токенизатор ik в контейнер

  • Если инструмент для распаковки не установлен, установите его.
apt install unzip
  • Разархивируйте токенизатор ik в папку ik текущего каталога.

Формат команды: unzip

Пример:

unzip ELK-IKv7.4.2.zip -d ./ik

解压 ik 分词器

  • Измените разрешения папки на чтение и запись.
chmod -R 777 ik/
  • Удалить архив ik tokenizer
rm ELK-IKv7.4.2.zip

6.4 Проверка установки токенизатора ik

  • в контейнер
docker exec -it <容器 id> /bin/bash
  • Ознакомьтесь с плагинами Elasticsearch
elasticsearch-plugin list

结果如下,说明 ik 分词器安装好了。 Разве это не просто.

ik

ik 分词器插件

Затем выйдите из контейнера Elasticsearch и перезапустите контейнер Elasticsearch.

exit
docker restart elasticsearch

6.5 Использование китайского токенизатора ik

ik tokenizer имеет два режима

  • Умный режим сегментации слов ( ik_smart )

  • Режим сегментации максимального комбинированного слова ( ik_max_word )

Давайте взглянем智能分词Эффект режима. например, для一颗小星星Выполните сегментацию китайских слов и получите два слова:一颗,小星星

Вводим следующий запрос в Dev Tools Console

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "一颗小星星"
}

Получается следующий результат, который сегментируется на а и маленькую звездочку.

一颗小星星分词结果

посмотри снова最大组合分词模式. Введите следующую инструкцию запроса.

POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "一颗小星星"
}

一颗小星星Он делится на 6 слов: один, один, один, звездочка, звездочка, звездочка.

一颗小星星分词结果

Давайте посмотрим на другое китайское слово. Например, поиск братьев Wukong, ожидания: я делаю три слова в Wukong, чате и архитектуре.

Фактические результаты: Ву, Kongge, чат, архитектура четыре слова. Токенизатор ik сегментировал Brother Wukong, думая, что空哥это слово. Так что вам нужно позволить IK токенизатору знать悟空哥Это слово, нет разделения. Тогда как это сделать?

悟空哥聊架构分词

6.5 Пользовательский тезаурус сегментации слов

6.5.1 Схема пользовательского тезауруса

  • план

Создайте новый файл библиотеки слов, а затем укажите путь к файлу библиотеки слов в профиле класса IK. Вы можете указать локальный путь или указать путь к файлу удаленного сервера. Здесь мы используем файловую схему удаленного сервера, потому что это решение может поддерживать горячие обновления (обновление файлов сервера, ограждение ИК «будет перезагружено»).

  • Изменить файл конфигурации

Путь конфигурационного файла ik tokenizer в контейнере:

/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml。

Изменить этот файл можно, изменив файл сопоставления, путь к файлу:

/mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

Отредактируйте файл конфигурации:

vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

Содержимое конфигурационного файла следующее:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
     <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">location</entry>
     <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>

Изменить настройкуremote_ext_dictЗначение свойства указывает путь к файлу удаленного веб-сайта, напримерWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Здесь мы можем сами собрать среду nginx, а затем поместить ikwords.text в корневой каталог nginx.

6.5.2 Настройка среды nginx

Решение: сначала получите образ nginx, затем запустите контейнер nginx, затем скопируйте файл конфигурации nginx в корневой каталог, удалите исходный контейнер nginx, а затем перезапустите контейнер nginx, сопоставив папку.

  • Установите среду nginx через контейнер Docker.
docker run -p 80:80 --name nginx -d nginx:1.10
  • Скопируйте файл конфигурации контейнера nginx в папку conf каталога mydata
cd /mydata
docker container cp nginx:/etc/nginx ./conf
  • каталог mydata создать каталог nginx
mkdir nginx
  • Перемещение папки CONF в папку сопоставления NGINX
mv conf nginx/
  • Завершите работу и удалите исходный контейнер nginx.
docker stop nginx
docker rm <容器 id>
  • запустить новый контейнер
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
  • Доступ к сервису nginx
192.168.56.10

Если сообщается 403 Forbidden, nginx/1.10.3, это означает, что служба nginx запускается нормально. Причина исключения 403 заключается в том, что в службе nginx нет файла.

  • Создайте новый html-файл в каталоге nginx.
cd /mydata/nginx/html
vim index.html
hello passjava
  • Снова получить доступ к службе nginx

Браузер печатает hello passjava. Это означает, что нет проблем с доступом к странице, которую обслуживает nginx.

  • Создать файл тезауруса сегментации ik word
cd /mydata/nginx/html
mkdir ik
cd ik
vim ik.txt

заполнять悟空哥и сохраните файл.

  • получить доступ к файлу тезауруса
http://192.168.56.10/ik/ik.txt

Браузер выведет строку искаженных символов, вы можете сначала игнорировать искаженные символы. Доступ к файлу тезауруса возможен.

  • Изменить конфигурацию токенизатора ik
cd /mydata/elasticsearch/plugins/ik/config
vim IKAnalyzer.cfg.xml

修改 ik 分词器配置

  • Перезапустите контейнер elasticsearch и задайте запуск контейнера elasticsearch при каждом перезапуске компьютера.
docker restart elasticsearch
docker update elasticsearch --restart=always
  • Повторно запросить результаты сегментации слов

можно увидеть悟空哥聊架构делится на悟空哥,,架构Три слова, описывающие содержимое пользовательского тезауруса悟空哥имеет эффект.

自定义词库后的分词结果

7. Пишите в конце

Продолжай печень в средней и второй главах, давай!

  • Часть 2: Практическое применение ЭС.
  • Далее: Кластерное развертывание ES.

Привет, я悟空哥,«7 лет опыта разработки проектов, инженер полного стека, руководитель группы разработчиков, супер-подобная иллюстрация для решения принципа дна».

я по-прежнему手写了 2 个小程序,Java 刷题小程序,PMP 刷题小程序, нажмите на меню моей официальной учетной записи, чтобы открыть!
Кроме того, есть 111 материалов по архитектуре и 1000 вопросов для собеседования по Java, все организовано в формате PDF.
Вы можете подписаться на общедоступный номер"Гоку чата архитектура"Ответить悟空Получите качественную информацию.

«Ретвит -> Просмотр -> Нравится -> Избранное -> Комментарий!!!»Это моя самая большая поддержка!

Я Гоку, усердно работаю, чтобы стать сильнее и стать Супер Сайяном! Увидимся в следующий раз!