[英]Elasticsearch Nested Query with Must and Must Not with same fields
[英]Elasticsearch: “must” query on nested fields
如何对同一嵌套下的多个字段进行“必须”“匹配”查询? 这是一个可重现的 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”的文档? 使用上面定义的索引,我希望得到 Document 1 但不是 Document 2。到目前为止,我已经尝试了以下代码,但它没有返回任何命中:
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{"match": {"user.firstname": "John"}},
{"match": {"user.firstname": "Alice"}}
]
}
}
}
}
}
下面的查询是必需的。
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"]
}
]
}
尝试阅读此(嵌套数据类型)和此(嵌套查询)链接以了解有关它们如何工作的更多信息,从第二个链接中,您可以看到以下信息:
嵌套查询搜索嵌套字段对象,就好像它们被索引为单独的文档一样。
希望有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.