elasticsearch查询仅在字段存在时才需要匹配

时间:2016-09-21 11:08:03

标签: json elasticsearch

我使用json查询运行elasticsearch版本2.3.3(通过hibernate搜索5.6)。我正在进行常规搜索,我想添加一个意外情况。我有一个字段,portraitOf,人口稀少,我想知道,首先是否填充了字段,如果是,那么必须在字段中的某处找到搜索字词才能使其成为命中。

我找到了这个答案,但无法理解如何使其适应我的问题:ElasticSearch only query nested if it exists

当portrait为true时,此查询查找wallenstein,但不检查portraitOf字段。

{  
    "query":{  
      "filtered":{  
         "query":{  
            "multi_match":{  
               "query":"wallenstein",
               "fields":[  
                  "scannedText",
                  "keyWords",
                  "portraitOf"
               ]
            }
         },
         "filter":{  
            "bool":{  
               "must":[  
                  {  
                     "term":{  
                        "portrait":"true"
                     }
                  }
               ]
            }
         }
      }
   }
}

此查询返回结果,但接受不包含portraitOf的条目和portraitOf字段中没有wallenstein的条目。

{
   "query":{
      "bool":{
         "should":[
            {
               "multi_match":{
                  "query":"wallenstein",
                  "fields":[
                     "scannedText", "keyWords","portraitOf"
                  ],
                  "type":"cross_fields",
                  "operator":"and"
               }
            },
            {
              "query":{
                 "filtered":{
                    "query":{
                       "match":{
                           "portraitOf":"wallenstein"
                       }
                    },
                    "filter":{
                       "exists":{
                          "field":"portraitOf"
                       }
                    }
                 }
              }
            }
         ]
      }
   }
}

当我修补时,这是一个只在portraitOf存在并且portraitOf中存在wallenstein时返回匹配的查询。但是,重申一下,我想要的是,肖像是真实的,只有当肖像存在时,华伦斯坦才会出现肖像!

{
   "query":{
      "bool":{
         "must":[
            {
               "multi_match":{
                  "query":"wallenstein",
                  "fields":[
                     "scannedText", "keyWords","portraitOf"
                  ],
                  "type":"cross_fields",
                  "operator":"and"
               }
            },
            {
                "query":{
                    "filtered":{
                        "query":{
                            "match":{
                                "portrait":"true"
                            }
                        }
                    }
                }
            },
            {
              "query":{
                 "filtered":{
                    "query":{
                       "match":{
                           "portraitOf":"wallenstein"
                       }
                    },
                    "filter":{
                       "exists":{
                          "field":"portraitOf"
                       }
                    }
                 }
              }
            }
         ]
      }
   }
}

感谢您的帮助!

0 个答案:

没有答案