持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
前言
自动补全:自动补全就是输入一部分字符,下面的下拉框会自动联想出包含字符的词语,例如我们在jd搜索框中输入java,则下面的提示框会自动联想出包含java的相关词语。
前期准备
安装pinyin分词
1.进入下载链接,下载相关的插件的安装文件
2.elasticsearch的plugins目录下新增pinyin文件夹,并将拼音的安装包解压到此目录
说明: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实现自动补全实现自动补全功能,如有疑问请随时反馈。