我正在将弹性搜索集成到我们正在构建的应用程序中。我遇到嵌套查询和过滤器的问题。这是我们映射的一个例子:
"index": {
"mappings": {
"users": {
"properties": {
"membership": {
"type": "nested",
"properties": {
"membership": {
"type": "string"
},
"start date": {
"type": "date"
},
"end date date": {
"type": "date"
}
}
}
}
}
}
}
现在,我想找到所有用户"会员资格" " foo bar",没有结束日期。问题是,当我使用标准分析仪时," foo bar"在索引中被分成两个单词,所以我不能使用术语过滤来查找" foo bar"。我们可以通过使用不同的分析仪来解决这个问题,但这有其他缺点,例如上/下案例等问题。
此外:通过" foo bar"很容易找到所有人。使用查询而不是过滤器的成员资格。问题是找不到带有"结束日期"的嵌套文档的查询。 =失踪。有一个过滤器,但我似乎无法结合查询"会员资格" =" foo bar"使用过滤器"结束日期" =在同一嵌套文档中丢失。
所以,我可以找到所有人"结束日期" =失踪,我可以找到所有会员资格" foo bar",但不是每个没有特定结束日期的会员资格" foo bar"。
有没有关于如何解决这个问题的建议?
答案 0 :(得分:1)
这似乎是这样做的:
POST /test_index/_search
{
"query": {
"nested": {
"path": "membership",
"query": {
"bool": {
"must": [
{
"match": {
"membership.membership": {
"query": "foo bar",
"operator": "and"
}
}
},
{
"filtered": {
"filter": {
"not": {
"filter": {
"exists": {
"field": "membership.end_date"
}
}
}
}
}
}
]
}
}
}
}
}
以下是我用来设置它的代码(ES 1.5.1):
http://sense.qbox.io/gist/20a12a71178f0aac4369f52ab0c4c811ba803122