lucene 如何查找数组中没有与某个值匹配的嵌套对象的文档?

quhf5bfb  于 2022-11-07  发布在  Lucene
关注(0)|答案(3)|浏览(243)

在这里,您可以看到ES中文档的一小部分。在详细信息数组中,可能有许多具有不同ID和值的不同对象。我必须创建一个查询,以查找不包含ID为“SR_Middle_Name”或“SR_Middle_Name”且值为“Aron”的对象的所有文档:

"details":[  
   {  
      "id":"SR_Name",
      "value":"Elvis"
   },
   {  
      "id":"SR_Middle_Name",
      "value":"Aron"
   }
]
o8x7eapl

o8x7eapl1#

您尝试查询的对象是嵌套对象。首先确保为嵌套对象提供了正确的索引Map。然后,您可以对该对象进行嵌套查询。例如-

GET /_search
{
    "query": {
        "nested" : {
            "path" : "details",            
            "query" : {
                "bool" : {
                    "must" : [
                    { "match_not" : {"details.id" : "SR_Middle_Name"} },                    
                    ]
                }
            }
        }
    }
}
lb3vh1jj

lb3vh1jj2#

为了能够执行find documents-with out nested document-with specific values,您应该使用组合must_not(nested(terms(value)))示例:

{
  "bool" : {
    "must_not" : [
      {
        "nested" : {
          "query" : {
            "term" : {
              "details.id" : {
                "value" : "SR_Middle_Name"
              }
            }
          },
          "path" : "details"
        }
      }
    ]
  }
}

要能够添加
或具有ID“SR_Middle_Name”和值“Aron”
将第一个查询 Package 在should子句中并添加其他should子句
最后一个示例:

{
  "bool" : {
    "should" : [
      {
        "bool" : {
          "must_not" : [
            {
              "nested" : {
                "query" : {
                  "term" : {
                    "details.id" : {
                      "value" : "SR_Middle_Name"
                    }
                  }
                },
                "path" : "details"
              }
            }
          ]
        }
      },
      {
        "nested" : {
          "query" : {
            "bool" : {
              "filter" : [
                {
                  "term" : {
                    "details.id" : {
                      "value" : "SR_Middle_Name"
                    }
                  }
                },
                {
                  "term" : {
                    "details.value" : {
                      "value" : "Aron"
                    }
                  }
                }
              ]
            }
          },
          "path" : "details"
        }
      }
    ]
  }
}
i2loujxw

i2loujxw3#

也许这对你有帮助:
第1种情况:where id = "SR_Middle_Name" and value = "Aron"

curl -XGET 'localhost:9200/yourindex/yourtypes/_search?pretty' -H 'Content-Type: application/json' -d'
{
    "query" : {
        "bool" : {
            "must" : [
                { "match_phrase" : {"details.id" : "SR_Middle_Name"}},
                { "match_phrase" : {"details.value" : "Aron"}}
            ]
        }
    }
}'

第二种情况:where id != "SR_Middle_Name" and value = "Aron"

curl -XGET 'localhost:9200/yourindex/yourtypes?pretty' -H 'Content-Type: application/json' -d'
{
    "query" : {
        "bool" : {
            "must_not" : { "match_phrase" : {details.id" : "SR_Middle_Name"}},
            "must" : { "match_phrase" : {"details.value" : "Aron"}}                        
        }
    }
}'

相关问题