我的使用总结的,不必定全面和正确,仅供参考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类型....