ElasticSearch构建分词与自动补全功能

ElasticSearch构建分词与自动补全功能

什么是分词功能呢(Analyzer)?
举一个分词简单的例子:比如你输入:Auto Suggestion,会自动帮你分成两个单词,一个是auto,另一个是suggestion,可以看出单词也是被转换成小写的。
如图:
在这里插入图片描述

standard analyzer是ElasticSearch自带的分词器,可以看出该分词器对大小写不敏感,你输入大写最后也会被转换成小写

也可以安装一些第三方插件比如说:ik分词器/pinyin分词器
pinyin分词器
顾名思义,看到他的名字就知道他是根据字母来进行补全的
如图:
在这里插入图片描述

pinyin分词器地址:
https://github.com/medcl/elasticsearch-analysis-pinyin

了解了在ElasticSearch如果进行分词功能的使用,那么在使用Java中Spring Data ElasticSearch又该如何操作呢?

  1. 首先新建一个spring boot项目,在xml文件中引入相关依赖
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. application.yml文件中写入以下配置:
# elasticsearch ip地址
spring:
  elasticsearch:
    uris: elasticsearch地址
  1. 接下来就是分词功能的实现了
    1. 目前我们只能通过原生API的方式来进行分词功能的实现,过程比较繁琐,但编写方式统一。
    2. 首先要引入RestHighLevelClient 这个对象,是通过这个对象来发送分词请求的
    3. 分词功能步骤主要分为三步:

    • 创建分词请求
    • 发送分词请求获取响应结果
    • 处理响应结果
      • 举个例子:例如你输入ik analyzer,会分成两个单词,所以返回的结果集肯定是一个泛型为String类型的集合
  2. 在发送分词请求的时候会抛出一个异常,这里选择lombok下的@SneakyThrows会抛出已检查异常

    代码如下:

	@Autowired
    private RestHighLevelClient highLevelClient;
	@SneakyThrows // 抛出已检查异常
    public List<String> analyze(String text,String analyzer){
        // 创建分词请求
        AnalyzeRequest analyzeRequest = AnalyzeRequest.withIndexAnalyzer("goods", analyzer, text);
        // 发送分词请求获取响应结果
        AnalyzeResponse response = highLevelClient.indices().analyze(analyzeRequest, RequestOptions.DEFAULT);
        // 处理响应结果
        List<String> words = new ArrayList();
        List<AnalyzeResponse.AnalyzeToken> tokens = response.getTokens();
        for (AnalyzeResponse.AnalyzeToken token : tokens) {
            String tokenTerm = token.getTerm();
            words.add(tokenTerm);
        }
        return words;
    }

测试效果如图:
在这里插入图片描述

什么是自动补全功能呢?
当用户在搜索框输入字符时,我们应该提示出与该字符相关的搜索项。
我们举一个很常见的例子:当我们在百度中输入字符时,会有一个下拉列表来给出用户提示,这个功能就是自动补全
在这里插入图片描述
在ElasticSearch中该如何操作呢?
如图:
当输入iph时就可以查询出iphone
在这里插入图片描述
通过Spring Data ElasticSearch实现自动补全功能,该功能同分词一样,使用的是原生API的方式,过程较繁琐,但比较统一
过程分为三步:

  1. 创建补全请求
  2. 发送补全请求,获取响应结果
  3. 处理结果(该过程比较繁琐)
    代码如下:
    处理结果集采用jdk8的stream流的形式
    上图
@Autowired
private ElasticsearchRestTemplate template;
@Override
    public List<String> autoSuggest(String keyword) {
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        SuggestionBuilder suggestionBuilder = SuggestBuilders
                .completionSuggestion("tags") // 查找的域
                .prefix(keyword) // 关键词前缀
                .skipDuplicates(true) // 去除重复项
                .size(10);// 最多显示10条数据
        suggestBuilder.addSuggestion("prefix_suggestion",suggestionBuilder);
        SearchResponse response = template.suggest(suggestBuilder, IndexCoordinates.of("goods"));
        // 处理响应结果
        List<String> stringList = response
                .getSuggest()
                .getSuggestion("prefix_suggestion")
                .getEntries()
                .get(0)
                .getOptions()
                .stream()
                .map(Suggest.Suggestion.Entry.Option::getText)
                .map(Text::toString)
                .collect(Collectors.toList());
        return stringList;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿晓晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值