簡體   English   中英

Elasticsearch - 數組上的腳本過濾器

[英]Elasticsearch - Script filter on array

我是ES中的新bie,我想使用腳本過濾器來獲得所有匹配,即數組至少有一個小於max且大於min的元素(max和min是腳本中的param)。

該文件如:

 {
  "number": "5",
  "array": {
    "key": [
      10,
      5,
      9,
      20
    ]
  }
}

我嘗試了腳本,但它不起作用

{
  "script": {
    "lang": "groovy",
    "params": {
      "max": 64,
      "min": 6
    },
    "script": "for(element in doc['array.key'].values){element>= min + doc['number'].value &&  element <=max + doc['number'].value}"
  }
}

沒有錯誤消息,但搜索結果是錯誤的。有沒有辦法迭代數組字段?

謝謝你們。

是的,這是可行的,但是你的腳本並沒有這樣做。 嘗試使用Groovy的any()方法代替:

doc['array.key'].values.any{ it -> it >= min + doc['number'] && it <= max + doc['number'] }

一些東西:

  1. 你的腳本只是遍歷一個集合並檢查一個條件,不會返回一個布爾值,這就是你想要的
  2. 你可能會考慮更改為映射numberinteger類型
  3. 不確定為什么你有一個字段array ,里面有一個嵌套的字段key 難道你不能只有一個字段array ......和數組嗎? ;-)
  4. 請記住,在ES中,默認情況下,每個字段可以是單個值或數組。
  5. 正如@Val所說,你需要在你的conf/elasticsearch.yml elasticsearch.yml中啟用動態腳本,但我猜你已經完成了,否則你會得到異常。

像這樣的非常簡單的映射應該有效:

{
    "mappings": {
        "document": {
            "properties": {
                "value": {
                    "type": "integer"
                },
                "key": { 
                    "type": "integer"
                }
            }
        }
    }
}

例:

POST /documents/document/1
 {
  "number": 5,
    "key": [
      10,
      5,
      9,
      20
    ]
}

POST /documents/document/2
 {
  "number": 5,
    "key": [
      70,
      72
    ]
}

查詢:

GET /documents/document/_search
{
  "query": {
    "bool": {
      "filter": {
            "script": {
                "lang": "groovy",
                "params": {
                    "max": 64,
                    "min": 6
                },
                "script": "doc['key'].values.any{ it -> it >= min + doc['number'] && it <= max + doc['number'] }"
        }
      }
    }
  }
}

結果:

{
   "took": 22,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 0,
      "hits": [
         {
            "_index": "documents",
            "_type": "document",
            "_id": "1",
            "_score": 0,
            "_source": {
               "number": 5,
               "key": [
                  10,
                  5,
                  9,
                  20
               ]
            }
         }
      ]
   }
}

暫無
暫無

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

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