Elasticsearch - поисковая система
Устанока
Установка и настройка Elasticsearch
- Установите максимальный размер открытых дескрипторов файла для пользователя от 32k до 64k
nano /etc/sysctl.conf
vm.max_map_count = 262144
- Если возможно, отключите свопинг памяти для процессов Elasticsearch. Обратите внимание, что в виртуальных средах это может привести к неожиданным результатам.
- Установите значение -Xms равным -Xmx (то же самое что установить значение переменной среды ES_HEAP_SIZE).
- Оставьте некоторое количество памяти, чтобы кеш операционной системы мог использовать его для Lucene.
Установка плагинов
elasticsearch-HQ
$ plugin -install royrusso/elasticsearch-HQ
elasticsearch-head
$ plugin -install mobz/elasticsearch-head
elasticsearch-gui
$ plugin install jettro/elasticsearch-gui
Проверка работоспособности сервера
curl -XGET http://localhost:9200/_nodes/?pretty
Snapshot / Dump
curl -XPUT 'http://localhost:9200/_snapshot/backup' -d '{ "type": "fs", "settings": { "location": "/usr/local/var/elasticsearch/snapshot", "compress": true } }'
- где:
- backup - название репозитория
- /usr/local/var/elasticsearch/snapshot - папка с содержанием самого репозитория
drwxrwxr-x 6 mirocow 204 ноя 30 23:41 ./ drwxr-xr-x 6 mirocow 204 ноя 30 23:34 ../ -rwxr-xr-x 1 mirocow 27 ноя 19 18:18 index* drwxr-xr-x 4 mirocow 136 ноя 19 18:17 indices/ -rwxr-xr-x 1 mirocow 61 ноя 19 18:17 metadata-dump* -rwxr-xr-x 1 mirocow 187 ноя 19 18:18 snapshot-dump*
Восстановление / Restore
Настройка
curl -XPUT 'http://localhost:9200/_snapshot/backup' -d '{ "type": "fs", "settings": { "location": "/usr/local/var/elasticsearch/snapshot", "compress": true } }'
- где:
- backup - название репозитория
- /usr/local/var/elasticsearch/snapshot - папка с содержанием самого репозитория
Проверка
curl -XPOST http://localhost:9200/_snapshot/backup/snapshot/_verify
Восстановление
curl -XPOST http://localhost:9200/_snapshot/backup/snapshot/_restore
Запрос поиска
curl -XGET http://localhost:9200/1vse/product/_search/ -d '{ "size": 10, "query": { "bool": { "should": [ { "function_score": { "weight": 100, "query": { "match": { "product.title": "samsung" } } } }, { "function_score": { "weight": 80, "query": { "match_phrase_prefix": { "product.title": "samsung" } } } } ] } } }'
- где:
- 1vse - название БД
- product.title - название таблицы
Команды
curl -XGET http://localhost:9200/_cluster/state curl -XGET http://localhost:9200/_status curl -XGET http://localhost:9200/_nodes/stats?all=true curl -XGET http://localhost:9200/_nodes
Ошибки / Errors
- snapshot_missing_exception:
{"type": "no_such_file_exception","reason/usr/local/var/elasticsearch/snapshot/snap-snapshot.dat"}
- SnapshotMissingException:
{"error":"SnapshotMissingException[[backup:snapshot] is missing]; nested: FileNotFoundException[/usr/local/var/elasticsearch/snapshot/snapshot-snapshot (No such file or directory)]; ","status":404}
snapshot не найден, так как дамп создавался с отличным названием снапшота от snapshot
Создание индексов
Фильтры
Фильтр worddelimiter
Фильтр worddelimiter разбивает слова на несколько частей. Небольшой пример: представьте, что вы допустили опечатку в предложении “To be or not to be.That is the question”. Если вы обратите внимание, то заметите отсутствие пробела после точки. Без этого фильтра Elasticsearch проиндексирует “be.That” как одно слово - “bethat”. При помощи этого фильтра мы указываем ему индексировать эти слова по отдельности - “be” и “that”.
Фильтр stopwords
Фильтр stopwords состоит из списка слов запрещенных к индексированию. Например он исключает такие слова, как “and”, “a”, “the”, “to” и т.д. Конечно этот список уникален для каждого языка, но существует довольно много заготовок, которые вы можете использовать.
Фильтр snowball
Фильтр snowball используется для группировки слов по их основе. Фильтр применяет набор правил для правильного определения основы слова. Это означает, что разные настройки могут выдавать разные результаты. Например слова “indexing”, “indexable”, “indexes”, “indexation” и т.д. получать основу “index”. Хотелось бы отметить, что вы получите результат “Make my string indexable”, запросив “Indexing string”.
Фильтр elison
Фильтр elison имеет большее значения для некоторых языков (например французский) и не так важен для других (например английский). Он исключает маловажные слова перед индексированием, например “j’attends que tu m’appelles” (Я жду вашего звонка) проиндексируется как “attends que tu appelles” (наконце слова “que” и “tu” будут исключены фильтром stopwords). Как вы видите слова “j’” и “m’” (Я) были удалены из-за настройки фильтра elison.
Лексеры
nGram
"min_gram" : "3", "max_gram" : "20"
Анализаторы
Мапинг
Примеры индексов
settings: index: analysis: analyzer: app_analyzer: type: custom tokenizer: nGram filter : [stopwords, app_ngram, asciifolding, lowercase, snowball, worddelimiter] app_search_analyzer: type: custom tokenizer: standard filter : [stopwords, app_ngram, asciifolding, lowercase, snowball, worddelimiter] tokenizer: nGram: type: "nGram" min_gram: 2 max_gram: 20 filter: snowball: type: snowball language: English app_ngram: type: "nGram" min_gram: 2 max_gram: 20 worddelimiter : type: word_delimiter stopwords: type: stop stopwords: [_french_] ignore_case : true
Клиенты
- Elastica - PHP клиент