V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wclssdn
V2EX  ›  问与答

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

  •  
  •   wclssdn · 2017-08-09 17:07:10 +08:00 · 2368 次点击
    这是一个创建于 2692 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    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 返回可直接使用的值。

    1 条回复    2017-10-27 16:54:13 +08:00
    wclssdn
        1
    wclssdn  
    OP
       2017-10-27 16:54:13 +08:00
    没人关心还是咋的。。。

    后来我找到答案了~~

    使用 script_fields,配合_source=*实现的~ 代码不贴了,有兴趣自行查阅官方文档~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5643 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 92ms · UTC 01:42 · PVG 09:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.