如何在同一嵌套下的多个字段上进行“必须”“匹配”查询?这是可复制的ES索引,其中“用户”字段定义为“嵌套”类型。
PUT my_index
{
"mappings": {
"properties": {
"user": {
"type": "nested",
"properties": {
"firstname": {"type": "text"}
}
}
}
}
}
这是2个文档:
PUT my_index/_doc/1
{
"user" : [
{
"firstname" : "John"
},
{
"firstname" : "Alice"
}
]
}
PUT my_index/_doc/2
{
"user" : [
{
"firstname" : "Alice"
}
]
}
对于该索引,如何查询同时存在“ John”和“ Alice”的文档?使用上面定义的索引,我希望获得文档1,而不是文档2。到目前为止,我已经尝试了以下代码,但未返回任何匹配结果:
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{"match": {"user.firstname": "John"}},
{"match": {"user.firstname": "Alice"}}
]
}
}
}
}
}
答案 0 :(得分:0)
下面的查询是必需的。
POST my_index/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "user",
"query": {
"match": {
"user.firstname": "alice"
}
}
}
},
{
"nested": {
"path": "user",
"query": {
"match": {
"user.firstname": "john"
}
}
}
}
]
}
}
}
请注意,我是如何在单个must子句中使用两个嵌套查询的。这是因为,如果您注意到拥有alice
和john
的文档都被视为two different documents
。
如果您的文档结构如下所示,则查询将起作用:
POST my_index/_doc/3
{
"user" : [
{
"firstname" : ["Alice", "John"]
}
]
}
尝试阅读this (nested datatype)和this (nested query)链接以了解它们的工作原理,从第二个链接中,您可以看到以下信息:
嵌套查询搜索嵌套字段对象,就像它们已被索引一样 作为单独的文件。
希望有帮助!