如何使用具有最小值但没有最大值的Elasticsearch高斯函数,但仍然得到低于分数且得分降低的结果?

时间:2016-06-29 09:40:13

标签: php elasticsearch

我试图在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。

非常感谢任何指导。

由于 利

1 个答案:

答案 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,因此分数开始直接衰减,因为我们已经低于用户定义的最小值,在此示例中。