X

Шпаргалка ElasticSearch: установка через Docker + основные команды

Под катом небольшая шпаргалка по 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.

Категории: ElasticSearch
Тэги: dockerelasticelasticsearch