Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.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
    resp = client.indices.create(
        index="items",
        mappings={
            "properties": {
                "name": {
                    "type": "keyword"
                },
                "production_date": {
                    "type": "date"
                },
                "location": {
                    "type": "geo_point"
                }
            }
        },
    )
    print(resp)
    response = client.indices.create(
      index: 'items',
      body: {
        mappings: {
          properties: {
            name: {
              type: 'keyword'
            },
            production_date: {
              type: 'date'
            },
            location: {
              type: 'geo_point'
            }
          }
        }
      }
    )
    puts response
    const response = await client.indices.create({
      index: "items",
      mappings: {
        properties: {
          name: {
            type: "keyword",
          },
          production_date: {
            type: "date",
          },
          location: {
            type: "geo_point",
          },
        },
      },
    });
    console.log(response);
    PUT /items
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "production_date": {
            "type": "date"
          },
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
  2. Занесите несколько документов в этот индекс.

    resp = client.index(
        index="items",
        id="1",
        refresh=True,
        document={
            "name": "chocolate",
            "production_date": "2018-02-01",
            "location": [
                -71.34,
                41.12
            ]
        },
    )
    print(resp)
    
    resp1 = client.index(
        index="items",
        id="2",
        refresh=True,
        document={
            "name": "chocolate",
            "production_date": "2018-01-01",
            "location": [
                -71.3,
                41.15
            ]
        },
    )
    print(resp1)
    
    resp2 = client.index(
        index="items",
        id="3",
        refresh=True,
        document={
            "name": "chocolate",
            "production_date": "2017-12-01",
            "location": [
                -71.3,
                41.12
            ]
        },
    )
    print(resp2)
    response = client.index(
      index: 'items',
      id: 1,
      refresh: true,
      body: {
        name: 'chocolate',
        production_date: '2018-02-01',
        location: [
          -71.34,
          41.12
        ]
      }
    )
    puts response
    
    response = client.index(
      index: 'items',
      id: 2,
      refresh: true,
      body: {
        name: 'chocolate',
        production_date: '2018-01-01',
        location: [
          -71.3,
          41.15
        ]
      }
    )
    puts response
    
    response = client.index(
      index: 'items',
      id: 3,
      refresh: true,
      body: {
        name: 'chocolate',
        production_date: '2017-12-01',
        location: [
          -71.3,
          41.12
        ]
      }
    )
    puts response
    const response = await client.index({
      index: "items",
      id: 1,
      refresh: "true",
      document: {
        name: "chocolate",
        production_date: "2018-02-01",
        location: [-71.34, 41.12],
      },
    });
    console.log(response);
    
    const response1 = await client.index({
      index: "items",
      id: 2,
      refresh: "true",
      document: {
        name: "chocolate",
        production_date: "2018-01-01",
        location: [-71.3, 41.15],
      },
    });
    console.log(response1);
    
    const response2 = await client.index({
      index: "items",
      id: 3,
      refresh: "true",
      document: {
        name: "chocolate",
        production_date: "2017-12-01",
        location: [-71.3, 41.12],
      },
    });
    console.log(response2);
    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.

resp = client.search(
    index="items",
    query={
        "bool": {
            "must": {
                "match": {
                    "name": "chocolate"
                }
            },
            "should": {
                "distance_feature": {
                    "field": "production_date",
                    "pivot": "7d",
                    "origin": "now"
                }
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'items',
  body: {
    query: {
      bool: {
        must: {
          match: {
            name: 'chocolate'
          }
        },
        should: {
          distance_feature: {
            field: 'production_date',
            pivot: '7d',
            origin: 'now'
          }
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "items",
  query: {
    bool: {
      must: {
        match: {
          name: "chocolate",
        },
      },
      should: {
        distance_feature: {
          field: "production_date",
          pivot: "7d",
          origin: "now",
        },
      },
    },
  },
});
console.log(response);
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].

resp = client.search(
    index="items",
    query={
        "bool": {
            "must": {
                "match": {
                    "name": "chocolate"
                }
            },
            "should": {
                "distance_feature": {
                    "field": "location",
                    "pivot": "1000m",
                    "origin": [
                        -71.3,
                        41.15
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'items',
  body: {
    query: {
      bool: {
        must: {
          match: {
            name: 'chocolate'
          }
        },
        should: {
          distance_feature: {
            field: 'location',
            pivot: '1000m',
            origin: [
              -71.3,
              41.15
            ]
          }
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "items",
  query: {
    bool: {
      must: {
        match: {
          name: "chocolate",
        },
      },
      should: {
        distance_feature: {
          field: "location",
          pivot: "1000m",
          origin: [-71.3, 41.15],
        },
      },
    },
  },
});
console.log(response);
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 должно быть датой. Поддерживается Дата-математика, например, 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/8.17/query-dsl-distance-feature-query.html

Spec-Zone.ru

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