在 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
}
}
}
]
}
}
}
让我们想象一下像这样的简单弹性文档:
{
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
}
}
}
]
}
}
}