elasticsearch - 具有多个 and and or 条件的 Elasticsearch 嵌套查询
问题描述
我正在尝试在 elasticsearch 中生成嵌套must
和should
查询以模仿以下条件:
( (brandsvisited ilike '%adidas%' or brandsvisited ilike '%skechers%' ) or( placecategory ilike '%Pizza Restaurant Visitors%' or placecategory ilike '%Grocery Store Visitors%' ) and( gender='Male' ) ) and polygonid = '1465'
我在 elasticsearch 中创建了以下查询。
"query": {
"bool": {
"must": [
{"term": {"polygonid": "1465"}},
{"term": {"gender": "Male"}},
{
"bool": {
"should": [
{"term": {"brandsvisited": "adidas"}},
{"term": {"brandsvisited": "skechers"}}
],"minimum_should_match": 1
}
},
{
"bool": {
"should": [
{"term": {"placecategory": "Pizza Restaurant Visitors"}},
{"term": {"placecategory": "Grocery Store Visitors"}}
],"minimum_should_match": 1
}
}
]
}
}
上述查询返回零个结果。但是,如果我删除最后一个布尔值应该查询,它会返回结果。不知道我哪里出错了。
解决方案
假设该placecategory
字段是文本类型。您需要将其替换为placecategory.keyword
字段(如果您尚未定义任何显式索引映射)
术语查询返回在提供的字段中包含确切术语的文档。如果您尚未定义任何显式索引映射,则需要将 .keyword 添加到该字段。这使用关键字分析器而不是标准分析器。
修改您的查询,如下所示
{
"query": {
"bool": {
"must": [
{
"term": {
"polygonid": "1465"
}
},
{
"term": {
"gender": "Male"
}
},
{
"bool": {
"should": [
{
"term": {
"brandsvisited": "adidas"
}
},
{
"term": {
"brandsvisited": "skechers"
}
}
],
"minimum_should_match": 1
}
},
{
"bool": {
"should": [
{
"term": {
"placecategory.keyword": "Pizza Restaurant Visitors"
}
},
{
"term": {
"placecategory.keyword": "Grocery Store Visitors"
}
}
],
"minimum_should_match": 1
}
}
]
}
}
}
如果要在中搜索确切的术语,placecategory
则可以使用带有should
子句的术语查询或术语查询,否则,如果要匹配placecategory
字段中的短语,则可以使用match_phrase查询
推荐阅读
- excel - 使用 win32com 和 Excel 和 Python 将所有数字设置为具有 General DisplayFormat
- javascript - 检测元素内的文本是否已经达到最大宽度
- angular - 带有链接的导航菜单栏
- python - 熊猫中的where,mask和df [S> 0]有什么区别?
- json - json 文件对于 clob 字段来说太大了。如何使用 Oracle 11g 和 plsql 阅读它?
- c# - Pythonnet ModuleNotFoundError 与第三方 PORTABLE 库
- android - 试图强制用户按回车
- python - Kivy - 显示实时传感器数据的标签
- python - 跳过生成器表达式中的条目
- android - Android Kotlin 字节移位 +=