ElasticSearch按数组项过滤

时间:2014-02-27 19:45:50

标签: elasticsearch

我在ES中有以下记录:

"authInput" : {
    "uID" : "foo",
    "userName" : "asdfasdfasdfasdf",
    "userType" : "External",
    "clientType" : "Unknown",
    "authType" : "Redemption_regular",
    "uIDExtensionFields" : 
    [
        {
            "key" : "IsAccountCreation",
            "value" : "true"
        }
    ],
    "externalReferences" : []
}

“uIDExtensionFields”是键/值对的数组。我想查询ES以查找所有记录:

  1. “uIDExtensionFields.key”=“IsAccountCreation”
  2. AND“uIDExtensionFields.value”=“true”
  3. 这是我认为我应该使用的过滤器,但它永远不会返回任何数据。

    GET devdev/authEvent/_search
    {
       "size": 10,
        "filter": {
            "and": {
               "filters": [
                  {
                      "term": {
                         "authInput.uIDExtensionFields.key" : "IsAccountCreation"
                      }
                  },
                  {
                   "term": {
                      "authInput.uIDExtensionFields.value": "true"
                   }   
                  }
               ]
            }
        }
    }
    

    你们可以给我的任何帮助都会非常感激。

    干杯!

    更新:在此之下的回应中,我如何解决我的问题:

    1. 小写我正在搜索的值。 (将“IsAccoutCreation”更改为“isaccountcreation”)
    2. 更新了映射,以便“uIDExtensionFields”是嵌套类型
    3. 将我的过滤器更新为以下内容:
    4. _

      GET devhilden/authEvent/_search
      {
         "size": 10,
         "filter": {
            "nested": {
               "path": "authInput.uIDExtensionFields",
               "query": {
                  "bool": {
                     "must": [
                        {
                           "term": {
                              "authInput.uIDExtensionFields.key": "isaccountcreation"
                           }
                        },
                        {
                           "term": {
                              "authInput.uIDExtensionFields.value": "true"
                           }
                        }                  
                     ]
                  }
               }
            }
         }
      }
      

1 个答案:

答案 0 :(得分:3)

这里可能会出现一些问题。

首先,正如mconlin指出的那样,您可能已经为您的关键字段使用标准分析器进行了映射。它会小写密钥。您可能希望为该字段指定"index": "not_analyzed"

其次,您必须为此文档结构使用嵌套映射,并在嵌套过滤器中指定键和值。那是因为否则,你会得到以下文件的匹配:

"uIDExtensionFields" : [
    {
        "key" : "IsAccountCreation",
        "value" : "false"
    },
    {
        "key" : "SomeOtherField",
        "value" : "true"
    }
]

第三,您希望使用bool - 过滤器的must而不是and来确保正确的可达性。

最后,您需要将过滤器放在filtered - 查询中。顶级过滤器适用于您希望过滤匹配的时间,但不能过滤分面/聚合。这就是为什么它在1.0中被重命名为post_filter

以下是您要查看的一些资源: