如何在elasticsearch函数得分中提高字段长度规范?

12

我知道elasticsearch在计算查询检索到的文档的得分时会考虑字段的长度。字段越短,权重就越高(见字段长度规范)。

我喜欢这种行为:当我搜索iphone时,我更感兴趣的是iphone 6而不是Crappy accessories for: iphone 5 iphone 5s iphone 6

现在,我想尝试提高这些内容的重要性,比如说我想将它们的重要性提高一倍。

我知道可以使用函数评分来修改得分,我猜可以通过脚本评分来实现我的目的。

我试图像这样给得分添加另一个字段长度规范:

    {
     "query": {
       "function_score": {
         "boost_mode": "replace",
         "query": {...},
         "script_score": {
             "script": "_score + norm(doc)"
         }
       }
     }
   }

但是我失败了,出现了这个错误:[No parser for element [function_score]]

编辑:

我的第一个错误是没有将函数得分包含在“query”中。现在我已经编辑了上面的代码。我的新错误信息如下:

GroovyScriptExecutionException[MissingMethodException
[No signature of method: Script5.norm() is applicable for argument types:
(org.elasticsearch.search.lookup.DocLookup) values: 
[<org.elasticsearch.search.lookup.DocLookup@2c935f6f>]
Possible solutions: notify(), wait(), run(), run(), dump(), any()]]

编辑:我提供了第一个答案,但我希望有更好的答案。

2个回答

12
看起来您可以使用类型为token_count的字段和field_value_factor函数得分来实现这一目标。
因此,在字段映射中可能会像这样:
"name": { 
  "type": "string",
  "fields": {
    "length": { 
      "type":     "token_count",
      "analyzer": "standard"
    }
  }
}

这将使用字段中的令牌数量。如果您想使用字符数,可以将分析器从 standard 更改为将每个字符标记化的自定义分析器。

然后在查询中:

"function_score": {
  ...,
  "field_value_factor": {
    "field": "name.length",
    "modifier": "reciprocal"
  }
}

3

我有一个有点能用的东西。通过以下方式,我从分数中减去我感兴趣的字段的长度。

{
 "query": {
   "function_score": {
     "boost_mode": "replace",
     "query": {...},
     "script_score": {
         "script": "_score  - doc['<field_name>'].value.length()"
     }
   }
 }
}

然而,我无法控制我正在减去的数字与旧分数相比的相对权重。这就是为什么我不接受我的答案:我会等待一段时间以获得更好的答案。理想情况下,我希望能够在script_score内访问字段长度规范化函数,或者获得等效的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接