Spring Boot 集成Elasticsearch实现自动补全

598 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

前言

自动补全:自动补全就是输入一部分字符,下面的下拉框会自动联想出包含字符的词语,例如我们在jd搜索框中输入java,则下面的提示框会自动联想出包含java的相关词语。

图片.png

前期准备

安装pinyin分词

1.进入下载链接,下载相关的插件的安装文件

github.com/medcl/elast…

2.elasticsearch的plugins目录下新增pinyin文件夹,并将拼音的安装包解压到此目录

图片.png

说明:Ik:此目录为中文分词插件 pinyin:此目录为pinyin分词插件

3.分词测试

发送请求:post:localhost:9200/_analyze

{
  "text": "java",
  "analyzer": "pinyin"
}

4.输出结果:

{
    "tokens": [
        {
            "token": "ja",
            "start_offset": 0,
            "end_offset": 0,
            "type": "word",
            "position": 0
        },
        {
            "token": "java",
            "start_offset": 0,
            "end_offset": 0,
            "type": "word",
            "position": 0
        },
        {
            "token": "v",
            "start_offset": 0,
            "end_offset": 0,
            "type": "word",
            "position": 1
        },
        {
            "token": "a",
            "start_offset": 0,
            "end_offset": 0,
            "type": "word",
            "position": 2
        }
    ]
}

说明:拼音分词分为:pinyin。

  • pinyin:会将拼音做最细粒度的拆分。

具体实现

字段定义

@CompletionField(analyzer="ik_smart",searchAnalyzer="ik_smart", maxInputLength = 100)
  private Completion suggest;

类型:字段设置为:Completion类型,且需要添加@CompletionField

新增数据

 @GetMapping("/addProductSuggest")
    public Result addProductSuggest() throws IOException 
    {
        IndexRequest indexRequest =new IndexRequest("goods");
        Product product =new Product();
        indexRequest.id(product.getId());
        List<String> list =new ArrayList<String>();
        list.add("java编程思想");
        Completion  completion =new Completion(list.toArray(new String[list.size()]));
        product.setSuggest(completion);
        String jsonString=JSON.toJSONString(product);
        indexRequest.source(jsonString,XContentType.JSON);
        IndexResponse response = client.index(indexRequest,RequestOptions.DEFAULT);
        return Result.success(response);
    }

Controller实现

    @GetMapping("/autoCompleteSearch")
    public Result autoCompleteSearch(String indexName,String fieldName, String prefix) throws IOException 
    {
        SearchRequest request =new SearchRequest(indexName);
        SearchSourceBuilder sourceBuilder =new SearchSourceBuilder();
         //对于某个字段自动补全查询
        CompletionSuggestionBuilder completionSuggestionBuilder=SuggestBuilders.completionSuggestion(fieldName).prefix(prefix)
        //重复过滤
        .skipDuplicates(true)
        .size(10);
        //关键字过滤
        SuggestBuilder suggestBuilder=new SuggestBuilder();
        suggestBuilder.addSuggestion("customer_suggest",completionSuggestionBuilder);
        sourceBuilder.suggest(suggestBuilder);
        //不符合条件的去除
        sourceBuilder.fetchSource(false);
        request.source(sourceBuilder);
        SearchResponse response =client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        SearchHit[] searchHits = hits.getHits();
        //输出结果
        CompletionSuggestion suggest = response.getSuggest().getSuggestion("customer_suggest");
        logger.info("suggest:"+JSON.toJSONString(suggest));
        
        List<CompletionSuggestion.Entry.Option> options = suggest.getOptions();
        
        List<String> list =new ArrayList<>();
        for(CompletionSuggestion.Entry.Option option:options)
        {
          logger.info("search data:{}",option.getText());
          list.add(JSON.toJSONString(option.getText().string()));
        }
        return Result.success(list);
    }

说明:自能补全需要采用SuggestBuilder的方式来进行处理. fieldName:字段名称 prefix:匹配字段前缀

输出结果

c.s.f.e.c.RestHightController - search Id:12,hit data:{"createDate":1655132070891,"id":"12","price":110.0,"skuNo":"sku0012","title":"java设计模式"}c.s.f.e.c.RestHightController - search Id:10,hit data:{"createDate":1655132070891,"id":"10","price":105.0,"skuNo":"sku0011","title":"Effive java"}
c.s.f.e.c.RestHightController - search Id:11,hit data:{"createDate":1655132070891,"id":"11","price":100.0,"skuNo":"sku0011","title":"java架构设计"}
c.s.f.e.c.RestHightController - search Id:2,hit data:{"createDate":1655132070891,"id":"2","price":99.0,"skuNo":"sku0002","title":"java从入门到精通"}
c.s.f.e.c.RestHightController - search Id:3,hit data:{"createDate":1655132070891,"id":"3","price":89.0,"skuNo":"sku0003","title":"java编程思想"}

总结

本文讲解了Spring Boot 集成Elasticsearch实现自动补全实现自动补全功能,如有疑问请随时反馈。