百度es的or查询,大多数的博客会告诉你用should,但是should应该加在哪儿,有很多的谬误,导致query和实际查询语义不一样。
例如实现"name"=="a" and ("city" == "b" or "city" == "c")
,是不是以为这样就可以?
{
"query": {
"bool": {
"must": [{
"match_phrase": {
"name": "a"
}
}],
"should": [{
"match_phrase": {
"city": "b"
}
},
{
"match_phrase": {
"city": "c"
}
}]
}
}
}
是不可以的,当must和should同级时,should只影响评分_score,而不具备过滤功能,查询结果见图1,city=='d'的doc也返回了,只不过评分低一些。
图1
怎么办呢?有两种解决方案。
1、将should放到must中,表示or条件必须成立,像这样,看图2,结果和我们语义是一致的。
{
"query": {
"bool": {
"must": [
{
"term": {
"name": "a"
}
},
{
"bool": {
"should": [
{
"term": {
"city": "b"
}
},
{
"term": {
"city": "c"
}
}
]
}
}
]
}
}
}
图2
2、指定 "minimum_should_match"。
图3扩展.
等价于 year==2020 and learn_season in (2,20,21,22,...) and main_grade in (1,2,3) and lesson_stop_time >=1598244100 and lesson_assistant_status ==1 and (assistant_preclass_live_duration > 0 or assistant_postclass_live_duration > 0)
{
"index": "idl_assistant_lesson_all_action",
"type": "_doc",
"query": {
"bool": {
"filter": [
{
"term": {
"year": 2020
}
},
{
"terms": {
"learn_season": [
"2",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"210",
"211",
"212",
"213",
"214",
"215"
]
}
},
{
"terms": {
"main_grade": [
"2",
"3",
"4"
]
}
},
{
"terms": {
"main_subject": [
"1",
"2",
"3"
]
}
},
{
"range": {
"lesson_stop_time": {
"lte": "1598244100"
}
}
},
{
"term": {
"lesson_assistant_status": 1
}
},
{
"bool": {
"should": [
{
"range": {
"assistant_preclass_live_duration": {
"gt": "0"
}
}
},
{
"range": {
"assistant_postclass_live_duration": {
"gt": "0"
}
}
}
]
}
}
]
}
},
"_source": {
"includes": [
"course_id",
"course_name",
"lesson_id",
"lesson_name",
"assistant_uid",
"lesson_start_time",
"lesson_stop_time"
]
},
"sort": [
{
"lesson_start_time": {
"order": "desc"
}
},
{
"lesson_id": {
"order": "asc"
}
},
{
"assistant_uid": {
"order": "asc"
}
}
],
"from": 0,
"size": 20,
"search_after": [
"1598232600",
"368801",
"2366998326"
]
}
扩展之又.
or 查询中有不等于怎么办?百度会告诉你 用must_not,
例如 city== a or city != c
,ES 不支持不等于运算符, must_not是和bool同级使用的,怎么办呢?
转变思路,city != c
是不是就是等价于 city > c or city < c
,query就可以这么写。
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"term": {
"city": "a"
}
},
{
"range": {
"city": {
"lt": "c"
}
}
},
{
"range": {
"city": {
"gt": "c"
}
}
}
]
}
}
]
}
}
}
图4
that's all,enjoy~
网友评论