Запрос функции расстояния
Увеличивает релевантность документов, находящихся ближе к заданной origin дате или точке. Например, этот запрос можно использовать для придания большего веса документам, расположенным ближе к определенной дате или местоположению.
Запрос distance_feature позволяет найти ближайших соседей по местоположению. Также его можно использовать в фильтре поиска с помощью запроса bool для добавления усиленных оценок релевантности к результатам поиска по запросу bool.
Пример запроса
Настройка индекса
Для использования запроса distance_feature ваш индекс должен содержать поле date, date_nanos или geo_point.
Чтобы узнать, как настроить индекс для запроса distance_feature, рассмотрите пример ниже.
-
Создайте индекс
itemsс указанным ниже отображением полей: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 responseconst 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" } } } } -
Занесите несколько документов в этот индекс.
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 responseconst 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
|
|