【问题标题】:Elasticsearch: script fields in nested queryElasticsearch:嵌套查询中的脚本字段
【发布时间】:2018-08-14 20:18:02
【问题描述】:

有没有办法在嵌套查询中使用“script_fields”向返回的 inner_hits 添加字段?示例:

{
   "nested": {
      "inner_hits": {},
      "path": "companies",
      "score_mode": "sum",
      "query": {},
      "script_fields": {
         "overlap" : {
            "script": {
               "source": "................................",
               "params": {
                   "from": "2012-01-01",
                    "to": "2015-06-30"
                }
            }
         }                
      }         
}

我执行 n 个嵌套查询,向每个查询传递一组特定参数。这个想法是让源脚本根据提供的参数为每个内部命中的重叠字段分配一个值。

Val 建议将 script_fields 添加到内部点击后更新

看起来像在定义不同 inner_hits 的同一嵌套路径上执行更多嵌套查询会使 ES 剥离 inner_hits 匹配项。示例:

{
       "nested": {
          "inner_hits": {
            "script_fields": {
               "overlap" : {
                  "script": {
                     "source": "................................",
                        "params": {
                           "from": "2012-01-01",
                           "to": "2015-06-30"
                         }
                      }
                   }                
                 } 
          },
          "path": "companies",
          "score_mode": "sum",
          "query": {},

    },
    {
       "nested": {
          "inner_hits": {
            "script_fields": {
               "overlap" : {
                  "script": {
                     "source": "................................",
                        "params": {
                           "from": "2012-01-01",
                           "to": "2015-06-30"
                         }
                      }
                   }                
                 } 
          },
          "path": "companies",
          "score_mode": "sum",
          "query": {},

    } 

如果像这样运行更嵌套的查询,我会得到正确的匹配,但不会返回所有预期的 inner_hits。我可以获得所有命中,只为不同的 inner_hits 提供一个随机名称,例如:

"inner_hits": {
   "name": [random name]
   "script_fields": {
      "overlap" : {
         ......
      }
    }
 }   

然后我得到正确的命中结果,但有一些缺点。我必须检查重复的结果,因为命中被添加到不同的结果集中并且不再是唯一的。我必须使用正则表达式解析结果以重建统一列表。

这听起来像是一个错误吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    是的,这是可行的。您只需将script_fields 部分移动到inner_hits 中,如下所示:

    {
       "nested": {
          "path": "companies",
          "score_mode": "sum",
          "query": {}.
          "inner_hits": {
             "script_fields": {
               "overlap" : {
                 "script": {
                   "source": "................................",
                   "params": {
                       "from": "2012-01-01",
                        "to": "2015-06-30"
                   }
                 }
               }                
             }     
          }
       }              
    }
    

    【讨论】:

    • 是的,这是有效的。将 script_fields 添加到 inner_hits 可以工作......即使没有记录。虽然我认为这是我的问题的答案,但我的用例带来了一个新挑战,因为我需要执行 n 个嵌套查询,并且我必须为它们中的每一个定义一个 n inner_hits {script_fields: ...} 因为我需要的参数是计算脚本字段因查询而异。我已经更新了问题中的示例
    • 为什么不在multi-search 中发送您的查询?
    • 因为当我想匹配“父母”对嵌套数组执行 n 查询并使用一些额外的计算字段返回命中时,我会有更多的“父”匹配。有意义吗?
    • 实际上,我们应该关闭这个问题,因为最初的需求已经解决,你应该用新问题创建一个新问题。
    • 好的,我将关闭并创建一个新问题。
    猜你喜欢
    • 2020-09-04
    • 2020-02-15
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多