Под катом небольшая шпаргалка по ElasticSearch..
Установка ElasticSearch через Docker
docker-compose.yml
version: '3' services: elasticsearch: image: 'elasticsearch:6.6.0' restart: always environment: - discovery.type=single-node ports: - '9200:9200' - '9300:9300'
Запуск
docker-compose up
Использование ElasticSearch
Создание индекса (маппинг)
PUT my_index { "mappings": { "_doc": { "properties": { "title": { "type": "text" }, "name": { "type": "text" }, "age": { "type": "integer" }, "created": { "type": "date", "format": "strict_date_optional_time||epoch_millis" } } } } }
Создание уникальной записи
PUT localhost:9200/test_index/_doc/1/_create { "title": "Hello world", "category":"Main", "author":{ "first_name": "John", "last_name": "Doe" } }
Добавление/обновление записи
PUT localhost:9200/test_index/_doc/2 { "title": "Hello awesome world ", "category":"Main", "author":{ "first_name": "John", "last_name": "Doe" } }
Удаление записи
DELETE localhost:9200/test_index/_doc/2
Поиск всех записей
GET localhost:9200/test_index/_search
Поиск слов
Поиск слов по полю title
GET localhost:9200/test_index/_search { "query": { "match": { "title": "hello" } } }
Поиск слов ("любое из слов", порядок не важен) по полю title
GET localhost:9200/test_index/_search { "query": { "match": { "title": "world hello" } } }
Поиск слов ("все слова из запроса", порядок не важен) по полю title
GET localhost:9200/test_index/_search { "query": { "match": { "title":{ "query": "world awesome", "operator": "and" } } } }
Поиск слов ("минимум 2 слова из запроса", порядок не важен) по полю title
GET localhost:9200/test_index/_search { "query": { "match": { "title":{ "query": "world awesome hello", "minimum_should_match": 2 } } } }
Поиск через GET параметры по полю title
localhost:9200/test_index/_search?q=title:(world AND awesome)
Поиск фразы
Поиск фразы ("все слова из запроса", порядок важен) по полю title
GET localhost:9200/test_index/_search { "query": { "match_phrase": { "title":{ "query": "hello world" } } } }
Поиск фразы ("все слова из запроса", порядок важен, допустимо одно слово между словами запросами) по полю title
GET localhost:9200/test_index/_search { "query": { "match_phrase": { "title":{ "query": "hello world", "slop": 1 } } } }
Поиск фразы через GET параметры по полю title
localhost:9200/test_index/_search?q=title:"hello world"~1
Поиск по дате
Поиск по дате, в поле publish_date
GET localhost:9200/test_index/_search { "query": { "range": { "publish_date":{ "gte": "2019-01-01", "lt": "2019-02-01" } } } }
Управление оценкой поиска (bool query)
- must = запрос должен быть в результатах поиска и влияет на оценку _score
- must_not = запроса не должно быть в результатах поиска
- should = запрос не обязательно должен быть в результатах поиска, наличие запроса влияет на оценку _score
- filter = запрос должен быть в результатах поиска, но не влияет на оценку _score
Структура
GET localhost:9200/test_index/_search { "query": { "bool": { "must":[ {} ], "must_not":[ {} ], "should":[ {} ], "filter":[ {} ] } } }
Поиск title включающий "hello", но не включающий "awesome"
GET localhost:9200/test_index/_search { "query": { "bool": { "must":{ "match": { "title": "hello" } }, "must_not":{ "match": { "title": "awesome" } } } } }
Поиск title включающий "hello" + повышенный _score для включающих "awesome"
GET localhost:9200/test_index/_search { "query": { "bool": { "must":{ "match": { "title": "hello" } }, "should":{ "match": {"title": "awesome"} } } } }
Обратите внимание, что при таком запросе:
GET localhost:9200/test_index/_search { "query": { "bool": { "must":{ "match": { "title": "hello" } }, "should":[ {"match": {"title": "awesome"}}, {"match": {"title": "world"}} ] } } }
к набору:
Hello world Hello awesome world Hello something world
"Hello awesome world" будет иметь наименьший _score.