【问题标题】:Boost results in Elasticsearch based on string value of doc field基于 doc 字段的字符串值在 Elasticsearch 中提升结果
【发布时间】:2015-08-31 19:03:40
【问题描述】:

我有一个包含语言代码字段的 Elasticsearch 映射,例如EN、DE、ES、FR 等。如果用户以英语开始搜索,我想在搜索结果中提升所有英文文档;法语、西班牙语、德语等也一样。

我猜,script_score 是要走的路:

"script_score" : {
    "script" : "_score * doc['my_numeric_field'].value"
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function-script-score

但是,我需要比较每个索引文档的语言代码。将LANG作为用户的当前语言代码,可能如下所示:

"script_score" : {
    "script" : "_score * ("+LANG+" == doc['lang'].value ? 2 : 1)"
}

这里的本质是一个三元运算符,以便在其语言与当前用户的语言匹配的情况下将相关文档提升两倍:

LANG == doc['lang'] ? 2 : 1

到目前为止,任何这样的函数都被 ES 简单地忽略了。

【问题讨论】:

    标签: function search boost elasticsearch


    【解决方案1】:

    使用function_score 更具体地说是script_score 确实是要走的路。我这样做的方法是使用一个名为LANG 的参数,您将使用当前用户的语言对其进行初始化(例如下面的"LANG": "EN")。那么您的脚本只需要将文档的lang 字段与LANG 参数进行比较,然后将分数乘以2 而不是1。

         {
          "script_score": {
            "script": "_score * (doc.lang.value == LANG ? 2 : 1)",
            "params": {
              "LANG": "EN"
            }
          }
    

    【讨论】:

    • 像魅力一样工作,谢谢。我必须先在 ES 配置文件中启用脚本:script.groovy.sandbox.enabled: on
    猜你喜欢
    • 2013-12-24
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多