(一)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類型的字段會被分詞,查詢的時候如果用拆開查可以查詢的到,但是要是直接全部查,就是查詢不到。
注意“1, 2”會被拆分成[1, 2],但是"1,2"是不拆分的,少了個空格。
(二)match和term的區別
1.term
1)term查詢keyword字段。
term不會分詞。而keyword字段也不分詞。需要完全匹配才可。
成功。
但是如果:
則查詢失敗。
2)term查詢text字段。
因為text字段會分詞,而term不分詞,所以term查詢的條件必須是text字段分詞后的某一個。
查詢成功。
查詢失敗,因為現在tag已經被分詞了,存儲的是[he, is, silly, man]。
這樣查詢:
也是失敗了,道理跟上面的是一樣的。
2.
1)match查詢keyword字段
match會被分詞,而keyword不會被分詞,match的需要跟keyword的完全匹配可以。
其他的不完全匹配的都是失敗的。
2)match查詢text字段
match分詞,text也分詞,只要match的分詞結果和text的分詞結果有相同的就匹配。
成功。如果都不相同就失敗了。
3.
1)match_phrase匹配keyword字段。
這個同上必須跟keywork一致才可以。
只有這種情況才是成功的。
2)match_phrase匹配text字段。
match_phrase是分詞的,text也是分詞的。match_phrase的分詞結果必須在text字段分詞中都包含,而且順序必須相同,而且必須都是連續的。
這是成功的。
如果不是連續的,就會失敗。
4.
1)query_string查詢key類型的字段,試過了,無法查詢。
失敗的,無法查詢。
2)query_string查詢text類型的字段。
和match_phrase區別的是,不需要連續,順序還可以調換。
成功。
這樣也是可以的。