簡體   English   中英

對象數組上的Elasticsearch腳本過濾器

[英]Elasticsearch script filter on object array

我有以下彈性搜索文檔:

{
"json":{
  "freeSlots":[
         {
            "day":"2015-04-21",
            "beginTime":"08:00:00",
            "endTime":"09:00:00"
         },
         {
            "day":"2015-04-21",
            "beginTime":"14:00:00",
            "endTime":"17:00:00"
         }
      ]
   }
}

我希望這種查詢將返回它:

{
"query" : {
    "filtered" : {
        "query" : {
            "match_all" : {}
        }
     },
     "filter" : {
         "script": {
             "script" : "doc['json.freeSlots.endTime'].value - doc['json.freeSlots.beginTime'].value > param1",
             "params" : {
                 "param1" : 7200000
             }
          }
     }
 }

不幸的是,它僅考慮數組的第一個元素,並且endTimebeginTime之間的差小於7200000 ms。 如何更改此查詢,以便它返回任何文檔,其中包含freeSlots數組中包含持續時間( endTimebeginTime之間的beginTime )大於7200000 ms的對象的文檔? 日期映射已設置。

我將每個插槽都索引為一個單獨的文檔: { "day":... "beginTime":... "endTime":... }

然后使用以下查詢:

{ "query": { "filter": { "script": { "params": { "delta": 7200000 }, "script": "(doc['endTime'].value - doc['beginTime'].value) > delta" } }, "filtered": { "query": { "match_all": {} } } } }

另外,您可能需要在服務器中配置腳本(AFAIK最新版本不支持這種動態腳本)。

調試正在發生的事情的一種方法是使用script_field輸出一些值:

... "script_fields": { "delta": { "file": "debug_script_fields", "lang": "groovy" } } ...

在服務器的config/scripts添加一個文件debug_script_fields.groovy

doc['endTime'].value - doc['beginTime'].value

如果該值不是您期望的值,則過濾后的查詢不太可能起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM