距离特征查询
编辑距离特征查询编辑
提升更接近提供的 origin
日期或点的文档的 相关度分数。例如,您可以使用此查询为更接近某个日期或位置的文档赋予更高的权重。
您可以使用 distance_feature
查询查找某个位置的最近邻。您还可以在 bool
搜索的 should
过滤器中使用此查询,以将提升的相关度分数添加到 bool
查询的分数中。
示例请求编辑
索引设置编辑
要使用 distance_feature
查询,您的索引必须包含 date
、date_nanos
或 geo_point
字段。
要查看如何为 distance_feature
查询设置索引,请尝试以下示例。
-
使用以下字段映射创建一个
items
索引response = client.indices.create( index: 'items', body: { mappings: { properties: { name: { type: 'keyword' }, production_date: { type: 'date' }, location: { type: 'geo_point' } } } } ) puts response
PUT /items { "mappings": { "properties": { "name": { "type": "keyword" }, "production_date": { "type": "date" }, "location": { "type": "geo_point" } } } }
-
将多个文档索引到此索引。
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
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
的文档的相关度分数。
response = client.search( index: 'items', body: { query: { bool: { must: { match: { name: 'chocolate' } }, should: { distance_feature: { field: 'production_date', pivot: '7d', origin: 'now' } } } } } ) puts 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]
的文档的相关度分数。
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
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
查询或其他更改 相关度分数 的方法不同,当 track_total_hits
参数 不是 true
时,distance_feature
查询会有效地跳过无竞争力的匹配。