引言
之前已经介绍了如何搭建elasticsearch服务端和简单的索引创建,和中文分词的支持。今天我们来说一说如何实现elasticsearch同时实现中文分词和pinyin分词。并且实现类似百度搜索栏的搜索建议的功能。
混合查询
实现混合查询有很多方式,这里介绍我认为是一个偷懒的方法,就是为你要拼音搜索的字段提供两个额外的字段,一个是全拼字段,一个是首字母缩写字段。我这里用的是官网的Employee的例子:
public class Employee implements Serializable {
private String firstName;
private String lastName;
private String pinyin;//firstName全拼
private String header;//firstName首字母缩写
private int age;
private String about;
private List<String> interests;
....省略getter setter
接下来为index添加setting和mapping
XContentBuilder settings = XContentFactory.jsonBuilder();
settings.startObject()
.startObject("analysis")
.startObject("analyzer")
.startObject("ik_analyzer").field("tokenizer","ik_smart")
.endObject()
.endObject()
.endObject().endObject();
CreateIndexRequest createIndexRequest = new CreateIndexRequest(index).settings(settings);
CreateIndexResponse createIndexResponse = esClient.admin().indices().create(createIndexRequest).get();
logger.info("Index:{} created,response:{}", index, JSON.toJSON(createIndexResponse));
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject()
.startObject(type)
.startObject("properties")
.startObject("firstName").field("type", "string").field("analyzer","ik_smart")
/* .field("search_analyzer","ik_smart").field("preserve_separators",false)
.field("preserve_position_increments",false)*/
.endObject()
.startObject("lastName").field("type", "string").field("analyzer","ik_smart")
.endObject()
.startObject("pinyin").field("type","string").field("analyzer","pinyin")
.startObject()
.startObject("header").field("type",