TairSearch是Tair自主研发的高性能、低延时、基于内存的实时全文搜索数据结构,采用和Elasticsearch相似(ES-LIKE)的查询语法。一些用户在使用过程中会咨询到复杂联合查询语句的用法,本篇文章主要介绍如何在tairsearch中使用bool联合条件查询实现一些复杂场景的查询。
bool语句详解
bool是TairSearch中支持复杂联合查询的常用语法,主要支持有3种特性:
- must:类似
AND
的语义,在must
数组中的语句均为必要条件,结果集合中的文档均需命中must
数组里的查询条件。 should: 类似
OR
的语义,在should
数组中的语句均为可选条件。命中should
数组的条件语句可增加该文档的score值,影响文档的排名。 有以下几种匹配该数组的情况:- must数组为空时,结果集合中的文档需命中至少一个should数组中的条件呢。
- must语句不为空时,不需要命中should数组中的条件。
- 配置了minimum_should_match, 那么结果集合中的文档则必须命中should数组中minimum_should_match个数的条件。
- must_not:类似
NOT
的语义,要求结果集合中的文档均不可命中must_not
数组中的查询条件。
bool 语句这三种特性的优先级排序为must_not
>must
>should
。
这三种特性的数组中均为查询语句,支持任意类型的查询语句,包括bool类型,即bool类型的查询语句中的数组子句可以再嵌套bool类型,由此实现复杂场景的查询。
bool联合查询实践
假设schema中有几个字段:A、B、C,每个字段的类型为keyword。keyword的语义是搜索该类型的字段时要求与查询条件参数全字符串匹配。
创建key:
redis-cli tft.createindex key '{
"mappings": {
"properties": {
"A": { "type": "keyword" },
"B": { "type": "keyword" },
"C": { "type": "keyword" }
}
}
}'
写入文档:
redis-cli tft.adddoc key '{
"A": "a",
"B": "b",
"C": "c"
}'
查询1:select A=a and B=b
redis-cli tft.search key '{
"query": {
"bool" : {
"must": [
{ "term": { "A": "a" } },
{ "term": { "B": "b" } }
]
}
}
}'
查询2:select A=a or B = b
redis-cli tft.search key '{
"query": {
"bool" : {
"should": [
{ "term": { "A": "a" } },
{ "term": { "B": "b" } }
]
}
}
}'
查询3:select A=a and B != b
redis-cli tft.search key '{
"query": {
"bool": {
"must": [
{ "term": { "A": "a" } }
],
"must_not": [
{ "term": { "B": "b" } }
]
}
}
}'
查询4:select (A=a and B = b) or C = c
redis-cli tft.search key '{
"query": {
"bool" : {
"should": [
{
"bool": {
"must": [
{ "term": { "A": "a" } },
{ "term": { "B": "b" } }
]
}
},
{ "term": { "C": "c" } }
]
}
}
}'