Elasticsearch:嵌套查询中的脚本字段

And*_*ghi 3 elasticsearch

有没有办法在嵌套查询中使用“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"
                }
            }
         }                
      }         
}
Run Code Online (Sandbox Code Playgroud)

我执行 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": {},

    } 
Run Code Online (Sandbox Code Playgroud)

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

"inner_hits": {
   "name": [random name]
   "script_fields": {
      "overlap" : {
         ......
      }
    }
 }   
Run Code Online (Sandbox Code Playgroud)

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

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

Val*_*Val 5

是的,这是可行的。您只需要将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"
               }
             }
           }                
         }     
      }
   }              
}
Run Code Online (Sandbox Code Playgroud)