在 Elasticsearch 中按相似数值排序

Sorting by similar numeric value in Elasticsearch

让我们想象一下像这样的简单弹性文档:

{
 title: 'Samsung Galaxy S5' //string
 price 599.45 //float
},
{
 title: 'Cover for Samsung Galaxy S5'
 price: 5.49
}

现在我想编写 bool 查询,它将获取一些标题和一些价格,如下所示:(我使用 ruflin/elastica)

$query = [
            'from' => 0,
            'size' => 1000,
            'query' => [
                'bool' => [
                    'must' => [
                        ['match' => ['title' => $title]],
                    ],
                ]
            ]
        ];

所以这很好用。但我想补充的是,可以通过某种方式对价格最相似的商品进行优先排序。

在这种情况下它会正常工作。但如果有成千上万种产品,我希望首先看到价格相似的结果。我不想使用过滤器,因为它可能会排除好的匹配项,并且在我的特定用例中,误报是可以接受的,而漏报则不是。

提前致谢!

您需要的是具有 decay 功能的 function_score。基本上,就像一个 range 查询,但边缘不是那么严格,这意味着该值越接近 "origin" 值(您正在搜索的值),得分就越高。所以,这不是 black/white 情况,而是 "shades of gray" 比较。此处有更多详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function-decay

还有一个您可以开始玩的查询:

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "title": "samsung"
              }
            }
          ]
        }
      },
      "functions": [
        {
          "exp": {
            "price": {
              "origin": "500",
              "scale": "100",
              "decay": 0.5
            }
          }
        }
      ]
    }
  }
}