1. 程式人生 > >python ElasticSearch 組合查詢

python ElasticSearch 組合查詢

{
  "query": {
    "bool": {
      "must":     { "match": { "title": "quick" }},
      "must_not": { "match": { "title": "lazy"  }},
      "should": [
                  { "match": { "title": "brown" }},
                  { "match": { "title": "dog"   }}
      ]
    }
  }
}
  • must: 文件必須完全匹配條件
  • should: should下面會帶一個以上的條件,至少滿足一個條件,這個文件就符合should
  • must_not: 文件必須不匹配條件
  • match

    最簡單的一個match例子:

    查詢和"我的寶馬多少馬力"這個查詢語句匹配的文件。

    {
      "query": {
        "match": {
            "content" : {
                "query" : "我的寶馬多少馬力"
            }
        }
      }
    }

    上面的查詢匹配就會進行分詞,比如"寶馬多少馬力"會被分詞為"寶馬 多少 馬力", 所有有關"寶馬 多少 馬力", 那麼所有包含這三個詞中的一個或多個的文件就會被搜尋出來。
    並且根據lucene的評分機制(TF/IDF)來進行評分。

    match_phrase

    比如上面一個例子,一個文件"我的保時捷馬力不錯"也會被搜尋出來,那麼想要精確匹配所有同時包含"寶馬 多少 馬力"的文件怎麼做?就要使用 match_phrase 了

    {
      "query": {
        "match_phrase": {
            "content" : {
                "query" : "我的寶馬多少馬力"
            }
        }
      }
    }

    完全匹配可能比較嚴,我們會希望有個可調節因子,少匹配一個也滿足,那就需要使用到slop。

    {
      "query": {
        "match_phrase": {
            "content" : {
                "query" : "我的寶馬多少馬力",
                "slop" : 1
            }
        }
      }
    }

    multi_match

    如果我們希望兩個欄位進行匹配,其中一個欄位有這個文件就滿足的話,使用multi_match

    {
      "query": {
        "multi_match": {
            "query" : "我的寶馬多少馬力",
            "fields" : ["title", "content"]
        }
      }
    }

    但是multi_match就涉及到匹配評分的問題了。

  • 控制精度編輯

    所有 must 語句必須匹配,所有 must_not 語句都必須不匹配,但有多少 should 語句應該匹配呢? 預設情況下,沒有 should 語句是必須匹配的,只有一個例外:那就是當沒有 must 語句的時候,至少有一個 should 語句必須匹配。

    就像我們能控制 match 查詢的精度 一樣,我們可以通過 minimum_should_match 引數控制需要匹配的 should 語句的數量, 它既可以是一個絕對的數字,又可以是個百分比:

    GET /my_index/my_type/_search
    {
      "query": {
        "bool": {
          "should": [
            { "match": { "title": "brown" }},
            { "match": { "title": "fox"   }},
            { "match": { "title": "dog"   }}
          ],
          "minimum_should_match": 2 
        }
      }
    }
  • 參考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/bool-query.html
  • https://www.cnblogs.com/yjf512/p/4897294.html