避免ElasticSearch查询中的魔术数量提升?

时间:2015-02-04 23:35:10

标签: elasticsearch magic-numbers

我喜欢ElasticSearch查询产生的文档,其中有一个字段(称之为“fubar'”)设置为某些值,这些值在查询时确定为始终在文档之前#&# 39;将fubar设置为其中一个值。

例如,在查询时,我决定将fubar设置为1,5或10的文档应该在所有其他文档之前。

现在我通过使用function_score来过滤fubar是"在"值列表,并将过滤器的增强设置为10x。然后将查询得分和这个提升的过滤器相加。

这感觉就像是黑客 - 我怎么知道不需要100倍的提升?有没有"清洁"这样做的方式并没有对最大可能的文件分数做出假设?换句话说,有没有办法做到这一点,以避免魔法'提高数字?

1 个答案:

答案 0 :(得分:2)

已编辑:修改了查询排序以匹配OP的澄清问题。

{
  "query" : {"match_all" : {}},
  "sort" : [
    {"_script" : {
      "script" : "[1, 10, 15].contains(doc['fubar'].value.toInteger()) ? 1 : 0",
      "type" : "number",
      "order" : "desc"
    }},
    "_score"
  ]
}

此排序依赖于指定的脚本来动态确定每个文档中的fubar是否相应地排序为1个,10个或15个排序。在这个例子中,我选择将结果映射到1或0,但我确定还有其他任何方法可以解决它。使用以下示例数据:

{"name":"Alice", "fubar":1}
{"name":"Bob", "fubar":21}
{"name":"Carol", "fubar":33}
{"name":"David", "fubar":17}
{"name":"Evelyn", "fubar":5}
{"name":"Fred", "fubar":10}

我得到了以下结果(为了便于阅读而截断了多余的位):

"hits" : [ {
  "_index" : "test",
  "_type" : "test",
  "_id" : "1",
  "_score" : 1.0,
  "_source":{"fubar": 1, "name": "Alice"},
  "sort" : [ 1.0, 1.0 ]
}, {
  "_index" : "test",
  "_type" : "test",
  "_id" : "6",
  "_score" : 1.0,
  "_source":{"fubar": 10, "name": "Fred"},
  "sort" : [ 1.0, 1.0 ]
}, {
  "_index" : "test",
  "_type" : "test",
  "_id" : "4",
  "_score" : 1.0,
  "_source":{"fubar": 17, "name": "David"},
  "sort" : [ 0.0, 1.0 ]
}, {
  "_index" : "test",
  "_type" : "test",
  "_id" : "5",
  "_score" : 1.0,
  "_source":{"fubar": 5, "name": "Evelyn"},
  "sort" : [ 0.0, 1.0 ]
}, {
  "_index" : "test",
  "_type" : "test",
  "_id" : "2",
  "_score" : 1.0,
  "_source":{"fubar": 21, "name": "Bob"},
  "sort" : [ 0.0, 1.0 ]
}, {
  "_index" : "test",
  "_type" : "test",
  "_id" : "3",
  "_score" : 1.0,
  "_source":{"fubar": 33, "name": "Carol"},
  "sort" : [ 0.0, 1.0 ]
} ]

请注意,首先返回Alice和Fred,这是所需的行为。对于我的琐碎案例,所有文档的得分均为1.0,因此使用_score作为次要排序标准无效,但真实世界数据(使用真实世界评分)将考虑到这一点。