我的使用總結的,不必定全面和正確,僅供參考api
ElasticSearch版本:5.1
march 對輸入進行分詞
term 不對輸入進行分詞,直接搜索app
字段類型:
text:會對字段進行處理,分詞,造成分詞表,轉換成小寫
keyword:保持不變spa
對text和keyword的搜索支持(僅僅是手動設定了mapping的基礎上).net
text | keyword | |
march | 若在分詞表中,匹配輸入的關鍵詞,無需轉換大小寫 | 能夠匹配輸入的關鍵詞,無需轉換大小寫 |
term | 能夠匹配輸入的關鍵詞,把原英文字符轉換成小寫後,若在分詞表中,就能夠匹配 |
輸入的關鍵詞必需要和字段內容、大小寫徹底一致才能匹配 |
實例:
mapping:
blog
PUT test { "mappings":{ "doc":{ "properties":{ "content":{ "type":"text", "store": true, "analyzer": "ik_max_word" }, "title":{ "type":"keyword" }, "tags":{ "type":"keyword" } } } } }
插入的數據:(由於試驗方便,輸入插入的比較零散)
ci
POST test/doc { "content":"美國留給伊拉克的是個爛攤子嗎", "title":"標題", "tags":["美國","伊拉克","爛攤子"] } POST test/doc { "content":"中國是世界上人口最多的國家", "title":"中國", "tags":["中國","人口"] } POST test/doc { "content":"中國是世界上人口最多的國家", "title":"中國 的人口", "tags":["中國","人口"] } POST test/doc { "content":"Xixi Haha xixihaha", "title":"Xixi Haha", "tags":["xixi","haha"] } POST _bulk {"index":{"_index":"test","_type":"doc"}} {"content":"同一個世界同一個夢想","title":"北京奧運","tags":["和平"]} {"index":{"_index":"test","_type":"doc"}} {"content":"杭州是一個美麗的城市,歡迎來到杭州","title":"宣傳","tags":["旅遊","城市"]}
重點操做term
term中文下對text的查詢:it
GET test/doc/_search { "query":{ "term": { "content":"同一個世界" } } }
沒有結果table
term中文下對keyword的查詢:ast
GET test/doc/_search { "query":{ "term": { "title":"北京奧運" } } }
結果搜索到了
關鍵詞變成「北京」,就不行
term對text字段的查詢:
輸入的文字,在分詞表中:
GET test/doc/_search { "query":{ "term": { "content":"美麗" } } }
能夠匹配
若:
GET test/doc/_search { "query":{ "term": { "content":"美" } } }
就沒有結果
緣由是:美麗在分詞表中,美這個字不在。這種狀況match和term都不行
網上看到了一篇文章,是在沒有指定mapping的狀況下,解決方案,以資參考。
http://blog.csdn.net/SunnyYoona/article/details/51842221
沒有指定mapping的狀況下,Elasticsearch會自動建立一個mapping.
可是這個maping感受有點小複雜...
爲嘛一個字段,既有text,又有keyword類型....