Одна статья: Начало работы с запросами Elasticsearch

Elasticsearch

Это 15-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

подготовка данных

Работайте с интерфейсом, предоставляемым kibana.

POST /school/student/_bulk
{ "index": { "_id": 1 }}
{ "name" : "liubei", "age" : 20 , "sex": "boy", "birth": "1996-01-02" , "about": "i like diaocan he girl" }
{ "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" }

1. Используйте match_all для запроса

GET /school/student/_search?pretty
{
    "query": {
        "match_all": {}
    }
}

Проблема: после сопоставления через match_all будут получены все данные, но часто реальное требование бизнеса состоит не в том, чтобы найти все данные, а в том, чтобы получить то, что вы хотите; а для кластера es получить все данные напрямую, это легко чтобы вызвать явление GC. Итак, нам нужно научиться эффективно извлекать данные.

2. Запрос по ключевому полю

GET /school/student/_search?pretty
{
    "query": {
         "match": {"about": "travel"}
     }
}

Что мне делать, если я хочу узнать о ком-то, кто любит путешествовать и не может быть мальчиком?

在这里插入图片描述

Этот способ неправильный, так как под одним совпадением не может появиться несколько значений поля

[match] запрос не поддерживает несколько полей, вам нужно использовать составной запрос

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

При наличии нескольких комбинаций операторов запроса для их включения можно использовать bool.

bool и агрегаты содержат:must,must_notилиshould, должно означать или

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

GET /school/student/_search?pretty
{
"query": {
   "bool": {
      "must": { "match": {"about": "travel"}},
      "must_not": {"match": {"sex": "boy"}}
     }
  }
}

4. Должен в составном запросе bool

Должен означает необязательный (если должен совпадать, он будет отображаться, в противном случае он не будет отображаться)

Пример: Запрос кто любит путешествовать, если есть мужчина, то он будет отображаться, иначе не отображаться

GET /school/student/_search?pretty
{
"query": {
   "bool": {
      "must": { "match": {"about": "travel"}},
      "should": {"match": {"sex": "boy"}}         
     }
  }
}

5, соответствие сроков

Точное соответствие с использованием термина

такие как числа, даты, логические значения или строки not_analyzed (неанализированные текстовые типы данных)

грамматика

{ "term": { "age": 20 }}
{ "term": { "date": "2018-04-01" }}
{ "term": { "sex": “boy” }}
{ "term": { "about": "trivel" }}

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

GET /school/student/_search?pretty
{
"query": {
   "bool": {
      "must": { "terms": {"about": ["travel","history"]}}          
     }
  }
}

термин в основном используется для точной фильтрации

Например: «Я люблю тебя»

Соответствие под соответствием может быть парсером, содержащим: я, любовь, ты, я люблю и т. д.

По синтаксису термина это точно соответствует: «Я люблю тебя»

7. Фильтрация диапазонов

Фильтрация диапазона позволяет нам найти некоторые данные по заданному диапазону:

Рабочий диапазон значение
gt больше, чем
gae больше или равно
lt меньше, чем
lte меньше или равно

Пример: найти учащихся старше 20 лет и младше 25 лет.

GET /school/student/_search?pretty
{
"query": {
   "range": {
    "age": {"gt":20,"lte":25}
         }
      }
}

8, существует и отсутствует фильтрация

существующие и отсутствующие фильтры могут определить, содержит ли документ поле или не имеет поля

Пример: поиск документов с возрастом в поле

GET /school/student/_search?pretty
{
"query": {
   "exists": {
    "field": "age"  
         }
      }
}

9. Мультиусловная фильтрация bool

Использование bool также может фильтровать многострочные условия, такие как предыдущее совпадение:

ключевые слова значение эквивалентно
must Точное совпадение нескольких условий запроса and
must_not Обратное сопоставление нескольких условий запроса not
should Соответствует хотя бы одно условие запроса or

Пример. Отфильтровать учащихся, в поле «О которых» указано путешествие, а также учащихся старше 20 и моложе 30 лет.

GET /school/student/_search?pretty
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "about": {
            "value": "travel"
          }
        }},{"range": {
          "age": {
            "gte": 20,
            "lte": 30
          }
        }}
      ]
    }
  }
}

10. Комбинируйте условия запроса и фильтра

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

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

GET /school/student/_search?pretty
{
  "query": {
   "bool": {
     "must": {"match": {"about": "travel"}},     
     "filter": [{"term":{"age": 20}}]
     }
  }
}