elasticsearch -check如果数组包含值

时间:2015-06-10 11:08:12

标签: elasticsearch

我想检查一个包含一些值的数组long类型的字段。 我发现的唯一方法是使用脚本:ElasticSearch Scripting: check if array contains a value

但它仍然无法解决我的问题: 查询:

  {
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "script": {
                    "script": "doc['Commodity'].values.contains(param1)",
                    "params": {
                        "param1": 50
                    }
                }
            }
        }
    }
}

但我得到0次点击。虽然我有记录:

{
"_index" : "aaa",
"_type" : "logs",
"_id" : "2zzlXEOgRtujWiCGtX6s9Q",
"_score" : 1,
"_source" : {

   "Commodity" : [
     50
    ],
   "Type" : 1,
    "SourceId" : "fsd",
      "Id" : 123
  }
}

3 个答案:

答案 0 :(得分:4)

尝试使用此脚本代替该脚本:

{
  "query": {
    "filtered": {
      "filter": {
        "terms": {
          "Commodity": [
            55,
            150
          ],
          "execution": "and"
        }
      }
    }
  }
}

答案 1 :(得分:1)

对于使用最新版本的Elasticsearch(7.1.1)的用户,请注意 “过滤”和“执行”已被弃用,因此@Andrei Stefan的答案可能不再有用。

您可以通过以下讨论找到其他方法。

https://discuss.elastic.co/t/is-there-an-alternative-solution-to-terms-execution-and-on-es-2-x/41089

在上述讨论中,由nik9000编写的答案中,我只是将“ term”替换为“ terms”(在PHP中),并且它开始使用数组输入,并且针对每个“ terms”键应用了AND我用过。

编辑:根据要求,我将发布一个用PHP编写的示例查询。

'body' => [ 
      'query' => [ 
           'bool' => [
               'filter' => [
                     ['terms' => ['key1' => array1]],
                     ['terms' => ['key2' => array2]],   
                     ['terms' => ['key3' => array3]],
                     ['terms' => ['key4' => array4]],                            
                           ]
                     ]
                 ]
             ] 

key1,key2和key3是存在于我的Elasticsearch数据中的键,它们将在各自的数组中进行搜索。 AND函数应用于[“ terms” => [''key'=> array]行之间。

答案 2 :(得分:0)

对于使用es 6.x的您来说,这可能有所帮助。 在这里,我通过传递订单数组来检查用户(rennish.joseph@gmail.com)是否有任何订单

GET user-orders/_search
{
  "query": {
    "bool": {
      "filter": [
         {
           "terms":{
             "orders":["123456","45678910"]
           }
         },
         {
           "term":{
             "user":"rennish.joseph@gmail.com"
           }
         }
        ]
    }
  }
}