Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Query DSL ›Специализированные запросы

Запрос по расстоянию

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

Можно использовать запрос distance_feature для поиска ближайших соседей к определённому местоположению. Также запрос можно использовать в фильтре поиска с помощью запроса bool для добавления увеличенных оценок релевантности к результатам запроса bool.

Пример запроса

Настройка индекса

Для использования запроса distance_feature индекс должен содержать поле date, date_nanos или geo_point.

Чтобы увидеть, как настроить индекс для запроса distance_feature, попробуйте следующий пример.

  1. Создайте индекс items со следующей картой полей:

    • name, поле типа keyword
    • production_date, поле типа date
    • location, поле типа geo_point
    PUT /items
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "production_date": {
            "type": "date"
          },
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
  2. Добавьте несколько документов в этот индекс.

    PUT /items/_doc/1?refresh
    {
      "name" : "chocolate",
      "production_date": "2018-02-01",
      "location": [-71.34, 41.12]
    }
    
    PUT /items/_doc/2?refresh
    {
      "name" : "chocolate",
      "production_date": "2018-01-01",
      "location": [-71.3, 41.15]
    }
    
    
    PUT /items/_doc/3?refresh
    {
      "name" : "chocolate",
      "production_date": "2017-12-01",
      "location": [-71.3, 41.12]
    }

Примеры запросов

Увеличение релевантности документов по дате

Следующий bool поиск возвращает документы с значением name равным chocolate. Поиск также использует запрос distance_feature для повышения релевантности документов со значением production_date, более близким к значению now.

GET /items/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "chocolate"
        }
      },
      "should": {
        "distance_feature": {
          "field": "production_date",
          "pivot": "7d",
          "origin": "now"
        }
      }
    }
  }
}
Увеличение релевантности документов по местоположению

Следующий bool поиск возвращает документы с значением name равным chocolate. Поиск также использует запрос distance_feature для повышения релевантности документов со значением location, более близким к значению [-71.3, 41.15].

GET /items/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "chocolate"
        }
      },
      "should": {
        "distance_feature": {
          "field": "location",
          "pivot": "1000m",
          "origin": [-71.3, 41.15]
        }
      }
    }
  }
}

Параметры верхнего уровня для запроса distance_feature

field

(Обязательно, строка) Имя поля, используемого для расчёта расстояний. Это поле должно соответствовать следующим критериям:

  • Быть полем типа date, date_nanos или geo_point
  • Иметь значение параметра отображения index равное true, что является значением по умолчанию
  • Иметь значение параметра отображения doc_values равное true, что является значением по умолчанию
origin

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

Если значение field является полем типа date или date_nanos, значение origin должно быть датой. Поддерживается Date Math, например, now-1h.

Если значение field является полем типа geo_point, значение origin должно быть геокоординатами.

pivot

(Обязательно, единица измерения времени или единица измерения расстояния) Расстояние от origin, на котором оценки релевантности получат половину от значения boost.

Если значение field является полем типа date или date_nanos, значение pivot должно быть единицей измерения времени, например, 1h или 10d.

Если значение field является полем типа geo_point, значение pivot должно быть единицей измерения расстояния, например, 1km или 12m.

boost

(Необязательно, число с плавающей запятой) Число с плавающей запятой, используемое для умножения оценки релевантности соответствующих документов. Это значение не может быть отрицательным. По умолчанию 1.0.

Примечания

Как запрос distance_feature рассчитывает оценки релевантности

Запрос distance_feature динамически рассчитывает расстояние между значением origin и значениями поля документа. Затем он использует это расстояние как признак для повышения оценки релевантности более близких документов.

Запрос distance_feature вычисляет оценку релевантности документа следующим образом:

relevance score = boost * pivot / (pivot + distance)

distance — это абсолютное различие между значением origin и значением поля документа.

Пропуск неконкурентных результатов

В отличие от запроса function_score или других способов изменения оценок релевантности, запрос distance_feature эффективно пропускает неконкурентные результаты, когда параметр track_total_hits не true.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-distance-feature-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API