1. 程式人生 > >es match和term的區別

es match和term的區別

條件 doc cts pre electric arch ping 直接 cluster

(一)text字段和keyword字段的區別

以下給出一個例子:

首先建立一個索引和類型,引入一個keywork的字段:

PUT my_index
{
  "mappings": {
    "products": {
      "properties": {
        "name": {
          "type": "keyword"
        }
      }
    }
  }
}

然後查詢是否有索引:

GET _cluster/state

可以看到已經創建成功:

技術分享圖片

添加一條數據:

POST my_index/products
{
  "name":"washing machin
" }

然後查詢:

GET my_index/products/_search
{
  "query": {
    "term": {
      "name": "washing"
    }
  }
}

可以看到沒有匹配到任何數據:
技術分享圖片

然後查詢:

GET my_index/products/_search
{
  "query": {
    "term": {
      "name": "washing machine"
    }
  }
}

可以看到成功匹配到了數據:

技術分享圖片

所以將字段設置成keyword的時候查詢的時候已有的值不會被分詞。

現在添加一個text類型的字段:

PUT my_index/_mapping/products?update_all_types
{
  
"properties": { "tag": { "type": "text" } } }

可以看到添加成功:

技術分享圖片

往之前已經創建的doc之中添加tag的數據:

POST my_index/products/AWf9f66WV8yLH435XhgI
{
  "name":"washing machine",
  "tag":"electric household"
}

查詢一下,可以看到:

技術分享圖片

然後對tag字段進行查詢:

POST  /my_index/products/_search
{
  "query": {
    "term": {
      
"tag": "household" } } }

可以看到雖然沒有全部輸入,但是已經查詢到了:
技術分享圖片

現在輸入全部的查詢:

POST  /my_index/products/_search
{
  "query": {
    "term": {
      "tag": "electric household"
    }
  }
}

發現現在已經查詢不到了:

技術分享圖片

說明text類型的字段會被分詞,查詢的時候如果用拆開查可以查詢的到,但是要是直接全部查,就是查詢不到。

(二)match和term的區別

term是對查詢條件裏的詞不做分詞。

match是對查詢條件裏的詞做分詞,然後目標有包含即可其中一個即可。

match_phrase是對查詢條件裏的詞做分詞,然後必須包含所有的詞。

es match和term的區別