【问题标题】:ElasticSearch filter by array itemElasticSearch 按数组项过滤
【发布时间】:2014-02-28 06:27:14
【问题描述】:

我在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"

这是我认为我应该使用的过滤器,但它从不返回任何数据。

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. 将我的过滤器更新为以下内容:

_

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

【问题讨论】:

  • 尝试“isaccountcreation”的小写键值,取决于您的映射,可能不关心大小写。
  • 将“IsAccountCreation”更改为“isaccountcreation”确实解决了我的查询问题,非常感谢!

标签: elasticsearch


【解决方案1】:

这里可能有一些问题。

首先,正如 mconlin 指出的那样,您的关键字段可能具有与标准分析器的映射。它将小写密钥。您可能希望为该字段指定"index": "not_analyzed"

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

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

第三,您需要使用bool-filter 的must 而不是and 以确保适当的缓存能力。

最后,您需要将过滤器放在filtered-查询中。顶级过滤器适用于您希望过滤点击,但不希望过滤方面/聚合的情况。这就是它在 1.0 中重命名为 post_filter 的原因。

这里有一些你想要查看的资源:

【讨论】:

  • 谢谢你 mconlin,你是对的,如果我把它小写,那么它在只搜索键时就可以工作。 @Alex,谢谢你关于嵌套的建议,你说的很对。我的问题是:ES 0.9x 是否支持它,还是需要 1.0 版本才能获得嵌套?我更新后的查询正在运行,但仍然存在需要修复的嵌套问题。
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多