English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

DSL запроса Elasticsearch

В Elasticsearch поиск выполняется с использованием запросов на основе JSON. Запрос состоит из двух предложений-

  • Листовые предложения запроса — это предложения, соответствующие, терминам или диапазонам, которые ищут определенное значение в конкретном поле.

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

Elasticsearch поддерживает множество запросов. Запросы начинаются с ключевого слова запроса, затем включают условия и фильтры в виде объекта JSON. Ниже описаны различные типы запросов.

Запрос соответствия всем

Это самый простой запрос; он возвращает все содержимое, оценка каждого объекта составляет 1.0.

POST /schools/_search
{
   "query": {
      "match_all":{}
   }
}

При выполнении上面的 кода мы получили следующие результаты-

{
   "took": 7,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
         "value": 2
         "relation": "eq"
      }
      "max_score": 1.0
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "5",
            "_score": 1.0,
            "_source": {
               "name": "Central School",
               "description": "CBSE Affiliation",
               "street": "Nagan",
               "city": "paprola",
               "state": "HP",
               "zip": "176115",
               "location": [
                  31.8955385,
                  76.8380405
               ],
               "fees": 2200,
               "tags": [
                  "Senior Secondary"
                  "beautiful campus"
               ],
               "rating": "3.3"
            }
         }
         {
            "_index": "schools",
            "_type": "school",
            "_id": "4",
            "_score": 1.0,
            "_source": {
               "name": "City Best School",
               "description": "ICSE",
               "street": "West End",
               "city": "Meerut",
               "state": "UP",
               "zip": "250002",
               "location": [
                  28.9926174,
                  77.692485
               ],
               "fees": 3500,
               "tags": [
                  "fully computerized"
               ],
               "rating": "4.5"
            }
         }
      ]
   }
}

Полнотекстовый запрос

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

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

Этот запрос соответствует тексту или фразе,匹配 одним или несколькими полями.

POST /schools*/_search
{
   "query": {
      "match": {
         "rating":"4.5"
      }
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{
   "took": 44,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      }
      "max_score": 0.47000363,
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "4",
            "_score": 0.47000363,
            "_source": {
               "name": "City Best School",
               "description": "ICSE",
               "street": "West End",
               "city": "Meerut",
               "state": "UP",
               "zip": "250002",
               "location": [
                  28.9926174,
                  77.692485
               ],
               "fees": 3500,
               "tags": [
                  "fully computerized"
               ],
               "rating": "4.5"
            }
         }
      ]
   }
}

Множественный соответствие запроса

Этот запрос соответствует тексту или фразе,匹配 одним или несколькими полями.

POST /schools*/_search
{
   "query": {
      "multi_match": {
         "query": "paprola",
         "fields": ["city", "state"]
      }
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{
   "took": 12,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      }
      "max_score": 0.9808292,
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "5",
            "_score": 0.9808292,
            "_source": {
               "name": "Central School",
               "description": "CBSE Affiliation",
               "street": "Nagan",
               "city": "paprola",
               "state": "HP",
               "zip": "176115",
               "location": [
                  31.8955385,
                  76.8380405
               ],
               "fees": 2200,
               "tags": [
                  "Senior Secondary"
                  "beautiful campus"
               ],
               "rating": "3.3"
            }
         }
      ]
   }
}

поиск по строке запроса

Этот запрос использует анализатор запросов и ключевое слово query_string.

POST /schools*/_search
{
   "query": {
      "query_string":{
         "query":"beautiful"
      }
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{
   "took": 60,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
      "value": 1,
      "relation": "eq"
   }
………………………………….

поиск по словам

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

POST /schools*/_search
{
   "query": {
      "term":{"zip":"176115"}
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

……………………………..
"hits": [
   {
      "_index": "schools",
      "_type": "school",
      "_id": "5",
      "_score": 0.9808292,
      "_source": {
         "name": "Central School",
         "description": "CBSE Affiliation",
         "street": "Nagan",
         "city": "paprola",
         "state": "HP",
         "zip": "176115",
         "location": [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

поиск диапазона

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

  • gte −больше или равно

  • gt −больше

  • lte −меньше или равно

  • lt −меньше

Например, рассмотрим следующий код,-

POST /schools*/_search
{
   "query": {
      "range": {
         "rating": {
            "gte": 3.5
         }
      }
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{
   "took": 24,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      }
      "max_score": 1.0
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "4",
            "_score": 1.0,
            "_source": {
               "name": "City Best School",
               "description": "ICSE",
               "street": "West End",
               "city": "Meerut",
               "state": "UP",
               "zip": "250002",
               "location": [
                  28.9926174,
                  77.692485
               ],
               "fees": 3500,
               "tags": [
                  "fully computerized"
               ],
               "rating": "4.5"
            }
         }
      ]
   }
}

Существуют и другие типы запросов по уровню терминов, например,-

  • Запрос существования −Если значение поля не пусто.

  • Запрос отсутствия −Это полностью противоположно запросу существования, который ищет объекты без конкретного поля или с пустым значением.

  • Запросы с подстановочными знаками или regexp −Этот запрос использует регулярное выражение для поиска шаблонов в объекте.

Комплексные запросы

Эти запросы представляют собой набор различных запросов, которые объединяются彼此 через использование булевых операторов (например, и/или, или, не) или для различных индексов или с функциональными вызовами.

POST /schools/_search
{
   "query": {
      "bool": {
         "must": {
            "term": {    "state": "UP"  }
         }
         "filter": {
            "term": {    "fees": "2200"  }
         }
         "minimum_should_match": 1,
         "boost": 1.0
      }
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{
   "took": 6,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
         "value": 0,
         "relation": "eq"
      }
      "max_score": null,
      "hits": [    ]
   }
}

Географические запросы

Эти запросы обрабатывают географические данные и географические объекты. Эти запросы помогают найти географические объекты附近学校或 любые другие географические объекты. Вам нужно использовать тип данных географического местоположения.

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{    "acknowledged": true,
   "shards_acknowledged": true,
   "index": "geo_example"
}

Теперь мы опубликуем данные в созданный выше индекс.

POST /geo_example/_doc?refresh
{
   "name": "Chapter One, London, UK",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

После выполнения上面的 кода, мы получили следующий ответ:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   }
   "hits": {
      "total": {
         "value": 2
         "relation": "eq"
      }
      "max_score": 1.0
      "hits": []
         "_index": "geo_example",
         "_type": "_doc",
         "_id": "hASWZ2oBbkdGzVfiXHKD",
         "_score": 1.0,
         "_source": {
            "name": "Chapter One, London, UK",
            "location": {
               "type": "point",
               "coordinates": [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }