【问题标题】:elasticsearch -check if array contains a valueelasticsearch - 检查数组是否包含值
【发布时间】:2019-09-17 04:11:31
【问题描述】:

我想检查一个包含一些值的长数组类型的字段。 我发现的唯一方法是使用脚本: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
  }
}

【问题讨论】:

  • 你为什么不用{ "query": { "match": { "Commodity": 50 } } }
  • 我有一长串类似的过滤器。 + 我希望能够过滤多个值,例如:包含 50 和 45 的商品

标签: elasticsearch


【解决方案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 是我的弹性搜索数据中存在的键,它们将在各自的数组中进行搜索。 AND 函数应用于 ["terms" => ['key' => array ] 行之间。

【讨论】:

  • 你能在这里分享替代方法吗(而不仅仅是一个链接)?...这将使答案更清晰,更少依赖外部资源
【解决方案2】:

试试这个而不是那个脚本:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 您可以检查 hits.total 以查看它返回的任何结果。如果有任何结果,将 > 0
    猜你喜欢
    • 2019-08-10
    • 2015-01-01
    • 2021-07-15
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多