我在ES中有以下记录:
"authInput" : {
"uID" : "foo",
"userName" : "asdfasdfasdfasdf",
"userType" : "External",
"clientType" : "Unknown",
"authType" : "Redemption_regular",
"uIDExtensionFields" :
[
{
"key" : "IsAccountCreation",
"value" : "true"
}
],
"externalReferences" : []
}
“uIDExtensionFields”是键/值对的数组。我想查询ES以查找所有记录:
这是我认为我应该使用的过滤器,但它永远不会返回任何数据。
GET devdev/authEvent/_search
{
"size": 10,
"filter": {
"and": {
"filters": [
{
"term": {
"authInput.uIDExtensionFields.key" : "IsAccountCreation"
}
},
{
"term": {
"authInput.uIDExtensionFields.value": "true"
}
}
]
}
}
}
你们可以给我的任何帮助都会非常感激。
干杯!
更新:在此之下的回应中,我如何解决我的问题:
_
GET devhilden/authEvent/_search
{
"size": 10,
"filter": {
"nested": {
"path": "authInput.uIDExtensionFields",
"query": {
"bool": {
"must": [
{
"term": {
"authInput.uIDExtensionFields.key": "isaccountcreation"
}
},
{
"term": {
"authInput.uIDExtensionFields.value": "true"
}
}
]
}
}
}
}
}
答案 0 :(得分:3)
这里可能会出现一些问题。
首先,正如mconlin指出的那样,您可能已经为您的关键字段使用标准分析器进行了映射。它会小写密钥。您可能希望为该字段指定"index": "not_analyzed"
。
其次,您必须为此文档结构使用嵌套映射,并在嵌套过滤器中指定键和值。那是因为否则,你会得到以下文件的匹配:
"uIDExtensionFields" : [
{
"key" : "IsAccountCreation",
"value" : "false"
},
{
"key" : "SomeOtherField",
"value" : "true"
}
]
第三,您希望使用bool
- 过滤器的must
而不是and
来确保正确的可达性。
最后,您需要将过滤器放在filtered
- 查询中。顶级过滤器适用于您希望过滤匹配的时间,但不能过滤分面/聚合。这就是为什么它在1.0中被重命名为post_filter
。
以下是您要查看的一些资源:
Troubleshooting Elasticsearch searches, for Beginners涵盖前两个问题。
Managing Relations in ElasticSearch涵盖嵌套文档(和父/子)
all about elasticsearch filter bitsets涵盖and
与bool
的对比。