我试图在Elasticsearch中创建一个非常复杂的查询,但遇到了一个小问题。希望有人可以帮助解决一些问题...
我有一个价格值,可以用最小值和/或最大值定义,或者两者都不定义。当定义min 和 max时,它很容易使用gauss
函数来获得min和max之间的结果,得分为1,并且对于定义范围之外的任何内容,得分都会降低...
"gauss": {
"price_amount": {
"origin": 150000,
"offset": 50000,
"scale": 10000
}
}
然而,当仅时,最小或 max被定义为有点棘手。
因此,例如,用户将价格定义为范围:100,000 - 无最大
我如何将其构建为Elasticsearch查询,以便为100,000以上的任何内容提供一致的分数,但也会选择价格低于100,000的文档,但是会有一个惩罚分数(就像使用{{1在gauss
查询中的函数?)
我曾考虑先按价格过滤结果(在使用function_score
功能之前)但是如果我将gauss
设置为范围查询值到最小值(100,000),那么这将排除以下任何内容100,000。我可以减少我为gte
查询分配的值,以捕获低于100,000的文档,可能将其设置为75,000,但这感觉不对......
此外,使用高斯函数会在价格上涨后降低分数,在偏移之后,这不是我需要的。我希望得分高于最小值(在本例中),并且衰减得分低于100,000。
非常感谢任何指导。
由于 利
答案 0 :(得分:0)
自发布以来,我确实找到了答案。所以发布任何人都会遇到这个......
function_score查询中的函数仅影响文档的分数,您可以通过在函数旁边使用过滤器来控制使用该函数影响的文档。
所以解决我的问题的方法是按如下方式过滤:
"query": {
"function_score": {
"min_score": 1e-12,
"functions": [
{ ... },
{
"filter": {
"range": {
"price_amount": {
"lte": 100000
}
}
},
"gauss": {
"price_amount": {
"origin": 100000,
"offset": 0,
"scale": 5000
}
}
}
],
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
[
...
]
]
}
}
}
}
}
}
这使用高斯钟形曲线并降低价格低于100,000的文档的分数。偏移量为0,因此分数开始直接衰减,因为我们已经低于用户定义的最小值,在此示例中。