elasticsearch实现中文分词和拼音分词混合查询+CompletionSuggestion

引言

之前已经介绍了如何搭建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",
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值