es的自动补全查询——DSL语句java代码实现
创始人
2024-03-24 20:22:41
0

 1、DSL语句

elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。

为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  • 参与补全查询的字段必须是completion类型。

  • 字段的内容一般是用来补全的多个词条形成的数组。

查询的DSL语句如下:

// 自动补全查询
GET /test/_search
{"suggest": {//表示是自动补全查询,固定写法"title_suggest": {//给查询起的名字,自定义"text": "s", // 关键字,查询s开头的数据"completion": {"field": "title", // 补全查询的字段,在哪个字段查询"skip_duplicates": true, // 跳过重复的"size": 10 // 获取前10条结果}}}
}

2、java实现

步骤:

1.确认索引库结构和使用的分词器,建议:创建倒排索引时,使用ik和拼音分词器,查询时使用ik分词器

示例:

// 酒店数据索引库
PUT /hotel
{"settings": {"analysis": {"analyzer": {"text_anlyzer": {"tokenizer": "ik_max_word","filter": "py"},"completion_analyzer": {"tokenizer": "keyword","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"id":{"type": "keyword"},"name":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart","copy_to": "all"},"address":{"type": "keyword","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword"},"starName":{"type": "keyword"},"business":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart"},"suggestion":{"type": "completion","analyzer": "completion_analyzer","search_analyzer": "keyword"}}}
}

2.索引库添加一个新字段suggestion,类型为completion类型

3.在对应的实体类中添加suggestion字段

4.代码实现

自动补全查询的DSL对应的JavaAPI

 自动补全的结果的DSL对应的JavaAPI

 根据前端的请求,完善controller层接口:

@GetMapping("suggestion")
public List getSuggestions(@RequestParam("key") String prefix) {return hotelService.getSuggestions(prefix);
}

service层:

List getSuggestions(String prefix);

serviceimpl层:

@Override
public List getSuggestions(String prefix) {try {// 1.准备RequestSearchRequest request = new SearchRequest("hotel");// 2.准备DSLrequest.source().suggest(new SuggestBuilder().addSuggestion("suggestions",// 查询的名称,自定义SuggestBuilders.completionSuggestion("suggestion")//自动补全的字段名.prefix("北京")//关键字,查询以北京开头的数据.skipDuplicates(true)// 跳过重复词条.size(10)//显示的词条数量));// 3.发起请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析结果Suggest suggest = response.getSuggest();// 4.1.根据补全查询名称,获取补全结果CompletionSuggestion suggestions = suggest.getSuggestion("suggestions");// 4.2.获取optionsList options = suggestions.getOptions();// 4.3.遍历List list = new ArrayList<>(options.size());for (CompletionSuggestion.Entry.Option option : options) {String text = option.getText().toString();list.add(text);}return list;} catch (IOException e) {throw new RuntimeException(e);}
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...