最近做的项目有一个功能是要精确查找某个关键字,和另一个搜索功能公用一套ES搜索服务,但是遇到一个问题就是中文的精确查找,用es的termquery()去查只能查出英文和数字,查了很多资料终于搞定了。在这做一个记录和大牛们讨论:
首先要装一下IK分词插件,这个对于中文搜索很重要,当然中文分词插件还有其他许多,es默认对中文是按字来分的。
其次是建索引的时候指定每列的属性,如下:
client.admin().indices().prepareCreate(index).execute().actionGet();
XContentBuilder builder = null;
if(index.equals("finplanner")){
builder = XContentFactory
.jsonBuilder()
.startObject()
.startObject(type)
.startObject("properties")
.startObject("areaofexpertise")
.field("type", "string")
.field("store", "yes")
// .field("analyzer","ik")
.field("index","analyzed")
.endObject()
.startObject("company")
.field("type", "string")
.field("store", "yes")
.field("analyzer","ik")
.field("index","not_analyzed")
.endObject()
.startObject("province")
.field("type", "string")
.field("store", "yes")
.field("analyzer","ik")
.field("index","not_analyzed")
.endObject()
.endObject()
.endObject()
.endObject();
PutMappingRequest mapping = Requests.putMappingRequest(index).type(type).source(builder);
client.admin().indices().putMapping(mapping).actionGet();
最后插入数据的时候会按照每列的设置,是否分词,分词类型等进行搜索查询,如field("index","analyzed")表示该字段可以分词查询,等等。
最后注意的是建索引的时候,每个属性类型一定要定好,否则以后修改数据类型必须删除索引重建,数据要重导!!!