距离特征查询编辑

提升更接近提供的 origin 日期或点的文档的 相关度分数。例如,您可以使用此查询为更接近某个日期或位置的文档赋予更高的权重。

您可以使用 distance_feature 查询查找某个位置的最近邻。您还可以在 bool 搜索的 should 过滤器中使用此查询,以将提升的相关度分数添加到 bool 查询的分数中。

示例请求编辑

索引设置编辑

要使用 distance_feature 查询,您的索引必须包含 datedate_nanosgeo_point 字段。

要查看如何为 distance_feature 查询设置索引,请尝试以下示例。

  1. 使用以下字段映射创建一个 items 索引

    • name,一个 keyword 字段
    • production_date,一个 date 字段
    • location,一个 geo_point 字段
    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"
          }
        }
      }
    }
  2. 将多个文档索引到此索引。

    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

(必填,字符串)用于计算距离的字段的名称。此字段必须满足以下条件

origin

(必填,字符串)用于计算距离的原点日期或点。

如果 field 值是一个 datedate_nanos 字段,则 origin 值必须是一个 日期。支持 日期数学,例如 now-1h

如果 field 值是一个 geo_point 字段,则 origin 值必须是一个地理点。

pivot

(必填,时间单位距离单位)距离 origin 的距离,在该距离处,相关度分数将获得 boost 值的一半。

如果 field 值是一个 datedate_nanos 字段,则 pivot 值必须是一个 时间单位,例如 1h10d

如果 field 值是一个 geo_point 字段,则 pivot 值必须是一个 距离单位,例如 1km12m

boost

(可选,浮点数)用于乘以匹配文档的 相关度分数 的浮点数。此值不能为负数。默认为 1.0

注意编辑

distance_feature 查询如何计算相关度分数编辑

distance_feature 查询动态计算 origin 值与文档的字段值之间的距离。然后,它使用此距离作为特征来提升更接近的文档的 相关度分数

distance_feature 查询按如下方式计算文档的 相关度分数

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

distanceorigin 值与文档的字段值之间的绝对差。

跳过无竞争力的匹配编辑

function_score 查询或其他更改 相关度分数 的方法不同,当 track_total_hits 参数 不是 true 时,distance_feature 查询会有效地跳过无竞争力的匹配。