Elasticsearch 多索引搜索 多条件筛选
先看结构 分别是索引media_data_es,live_room_es
search_type :dfs_query_then_fetch 不重复
复合查询
复合查询就是把一些简单查询组合在一起实现更复杂的查询需求,除此之外,复合查询还可以控制另外一个查询的行为。
bool query
bool 查询可以把任意多个简单查询组合在一起,使用 must、should、must_not、filter 选项来表示简单查询之间的逻辑,每个选项都可以出现 0 次到多次,它们的含义如下:
must 文档必须匹配 must 选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
should 文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。
must_not 与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
filter 和 must 一样,匹配 filter 选项下的查询条件的文档才会被返回,但是 filter 不评分,只起到过滤功能,与 must_not 相反。
{
"index": "media_data_es,live_room_es",
"from": 0,
"size": 15,
"preference": "media_data_es,live_room_es",
"search_type": "dfs_query_then_fetch",
"body": {
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"bool": {
"must": [
{
"term": {
"_index": {
"value": "media_data_es"
}
}
},
{
"match": {
"key_text": "看看就好了"
}
}
],
"filter": [
{
"term": {
"status": 1
}
},
{
"term": {
"audit_status": 1
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"_index": {
"value": "live_room_es"
}
}
},
{
"match": {
"key_text": "看看就好了"
}
}
]
}
}
]
}
}
}
}
我这里用的是SDK
“hyperf/elasticsearch”: “~2.2.0”,
如果是HTTP
POST请求
地址
/media_data_es%2Clive_room_es/_search
params数据
Array
(
[from] => 0
[size] => 15
[preference] => media_data_es,live_room_es
[search_type] => dfs_query_then_fetch
)
Body数据
Array
(
[query] => Array
(
[bool] => Array
(
[minimum_should_match] => 1
[should] => Array
(
[0] => Array
(
[bool] => Array
(
[must] => Array
(
[0] => Array
(
[term] => Array
(
[_index] => Array
(
[value] => media_data_es
)
)
)
[1] => Array
(
[match] => Array
(
[key_text] => 看看就好了
)
)
)
[filter] => Array
(
[0] => Array
(
[term] => Array
(
[status] => 1
)
)
[1] => Array
(
[term] => Array
(
[audit_status] => 1
)
)
)
)
)
[1] => Array
(
[bool] => Array
(
[must] => Array
(
[0] => Array
(
[term] => Array
(
[_index] => Array
(
[value] => live_room_es
)
)
)
[1] => Array
(
[match] => Array
(
[key_text] => 看看就好了
)
)
)
)
)
)
)
)
)
Options 数据
Array
(
)