关于 ElasticSearch 能否通过 script 新增一个返回字段的问题

2017-08-09 17:07:10 +08:00
 wclssdn

目前有一个比较变态的需求,文档有多个列,都是数值的,产品需求是通过几列计算出一个排序分,再通过几列计算出来一个显示分数(给用户看的)。

目前查询是这么写的(经过省略简化):

GET index/type/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": "return doc.a * 10 + doc.b * 1.2"
          }
        }
      ],
      "score_mode": "max",
      "boost_mode": "replace"
    }
  }
}

期望在返回的内容中可以通过_source.xxx拿到另外一个显示分数,或者通过其他方式也行。

我的设想,其中doc.x就是我想要的显示分数,通过结果中的_source.x拿到对应的值,但是实际上这个无法工作:

GET index/type/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": "_doc.x = doc.a + doc.b; return _doc.a * 10 + _doc.b * 1.2"
          }
        }
      ],
      "score_mode": "max",
      "boost_mode": "replace"
    }
  }
}

ps:目前有其他的实现方案,通过返回的所有列,在得到结果后再计算一遍,但这样公式是分布在两个地方了。不太方便维护。。。 所以,期望让 es 返回可直接使用的值。

2375 次点击
所在节点    问与答
1 条回复
wclssdn
2017-10-27 16:54:13 +08:00
没人关心还是咋的。。。

后来我找到答案了~~

使用 script_fields,配合_source=*实现的~ 代码不贴了,有兴趣自行查阅官方文档~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/381723

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX