在TairSearch中使用bool进行组合条件查询

TairSearch是Tair团队完全自研的全文搜索数据结构,采用和Elasticsearch相似的查询语法。本文介绍如何在TairSearch中使用bool语法,实现复杂场景的查询。

bool语法详解

bool是TairSearch中支持复杂、组合查询的语法,支持如下3种子句类型:

  • must:类似AND的语义,在must数组中的条件均为必要条件,查询结果集必须命中must数组中的查询条件。

  • must_not:类似NOT的语义,查询结果集必须不包含must_not数组中的查询条件。

  • should:类似OR的语义,在should数组中的条件均为可选条件。可搭配minimum_should_match参数使用,该参数表示至少需匹配多少个should查询子句,若bool语句中只存在should语句,则该参数默认为1;若bool语句中还存在mustmust_not语句,则该参数默认为0。

    mustshould语句同时命中某文档,则该文档会因为多次命中而增加文档score值,并影响结果排名。

TairSearch_boolbool语句的查询优先级为must_not > must > should,同时,bool语句中可嵌套任何类型的子查询语句,包含bool语句,可由此实现复杂场景的查询。更多关于TairSearch的信息,请参见Search

操作样例

  1. 创建索引。

    TFT.CREATEINDEX key '{
        "mappings": {
            "properties": {
                "A": { "type": "keyword" },
                "B": { "type": "keyword" },
                "C": { "type": "keyword" }
            }
        }
    }'
  2. 添加文档数据。

    TFT.ADDDOC key '{
        "A": "a",
        "B": "b",
        "C": "c"
    }'
  3. 查询示例。

    示例1:SELECT A = a and B = b

    TFT.SEARCH key '{
        "query": {
            "bool" : {
                 "must": [
                     { "term": { "A": "a" } },
                     { "term": { "B": "b" } }
                 ]
             }
        }
    }'

    示例2:SELECT A = a or B = b

    TFT.SEARCH key '{
        "query": {
            "bool": {
                 "should": [
                     { "term": { "A": "a" } },
                     { "term": { "B": "b" } }
                 ]
             }
        }
    }'

    示例3:SELECT A = a and B != b

    TFT.SEARCH key '{
        "query": {
            "bool": {
                "must": [
                     { "term": { "A": "a" } }
                ],
                "must_not": [
                     { "term": { "B": "b" } }
                ]
            }
        }
    }'

    示例4:SELECT (A = a and B = b) or C = c

    TFT.SEARCH key '{
        "query": {
            "bool" : {
                "should": [
                    {
                        "bool": {
                            "must": [
                                 { "term": { "A": "a" } },
                                 { "term": { "B": "b" } }
                             ]
                        }
                    },
                    { "term": { "C": "c" }  }
                ]
            }
        }
    }'