全部產品
Search
文件中心

ApsaraDB for Redis:在TairSearch中使用bool進行組合條件查詢

更新時間:Jul 30, 2024

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" }  }
                ]
            }
        }
    }'