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,輸入的查詢內容是什麼,就會按照什麼去查詢,並不會解析查詢內容,對它分詞。