1. 程式人生 > >elasticsearch的term query與match query區別

elasticsearch的term query與match query區別

看官方提供的例子

curl -XPUT localhost:9200/my_index -d  '{
  "mappings": {
    "my_type": {
      "properties": {
        "full_text": {
          "type":  "string"  
        },
        "exact_value": {
          "type":  "string",
          "index": "not_analyzed"  
        }
      }
    }
  }
}'

1.首先設定索引名稱為my_index,型別為my_type的對映,設定該索引的full_text欄位型別為String,exact_value欄位型別為String, "index": "not_analyzed"表示該欄位不分詞

不清楚對映與分詞的請看這裡:https://github.com/looly/elasticsearch-definitive-guide-cn/blob/master/052_Mapping_Analysis/40_Analysis.md

2.新增一條資料

curl -XPUT localhost:9200/my_index/my_type/1 -d '{
  "full_text":   "Quick Foxes!",  
  "exact_value": "Quick Foxes!"   
}'


索引名為my_index,型別為my_type,id為1

full_text欄位的值為Quick Foxes!

exact_value欄位的值為Quick Foxes!

注:

String欄位可以分詞,也可以不分詞,分詞的時候,預設的標準分析器可以將一句話中的單詞劃分開,然後轉為小寫,比如Quick Brown Fox!,標準分析器將會將它轉換為quick , brown , fox,


由於full_text欄位分詞,因此在倒排索引中被預設標準分析器分為quick , foxes

exact_value欄位不分詞,在倒排索引中該欄位的值仍為QuickFoxes!

3.執行查詢
(1)使用term查詢exact_value,搜尋內容為Quick Foxes!

curl -XGET localhost:9200/my_index/my_type/_search -d '{
  "query": {
    "term": {
      "exact_value": "Quick Foxes!"  
    }
  }
}'


由於exact_value不分詞,Quick Foxes!與exact_value的值QuickFoxes!匹配,因此可以匹配

(2)使用term查詢full_text,搜尋內容為Quick Foxes!

curl -XGET localhost:9200/my_index/my_type/_search -d '{
  "query": {
    "term": {
      "full_text": "Quick Foxes!"  
    }
  }
}'


由於full_text欄位預設使用標準分析器分詞,在倒排索引中被分為quick和foxes,因此使用Quick Foxes!匹配不到內容

(3)使用term查詢full_text,搜尋內容為foxes

curl -XGET localhost:9200/my_index/my_type/_search -d '{
  "query": {
    "term": {
      "full_text": "foxes"  
    }
  }
}'


由於full_text欄位預設使用標準分析器分詞,在倒排索引中被分為quick和foxes,因此使用foxes可以匹配到


(4)使用match查詢full_text,查詢內容為Quick Foxes!

curl -XGET localhost:9200/my_index/my_type/_search -d '{
  "query": {
    "match": {
      "full_text": "Quick Foxes!"  
    }
  }
}'


使用match搜尋,先分析搜尋字串Quick Foxes!,對它分詞,然後搜尋full_text中含有quick或者foxes或者兩者都包含的文件,由於full_text字在倒排索引中被分為quick和foxes,因此可以匹配到.


總結:

match query搜尋的時候,首先會解析查詢字串,進行分詞,然後查詢,而term query,輸入的查詢內容是什麼,就會按照什麼去查詢,並不會解析查詢內容,對它分詞。