我使用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"
}
}
}
}
}
]
}
}
}
感谢您的帮助!