通过elasticSearch实现输入框输入字母或者部分词条联想查询
例如:在百度搜索框我们输入小字,就会联想出相关字段属性一样,我们也正是想通过elasticSearch实现该功能。首先要把MySql中的数据导入到elasticSearch中去:这里我们就不详细描述了,去我的另外一篇文章有专门的详细描述链接:把MySql中的数据导入elasticSearch中去,并构建相关联想约束.下面的代码的前提是我们已经建立好了索引----------》对应到我们的关系型数据
·
例如:在百度搜索框我们输入小字,就会联想出相关字段属性一样,我们也正是想通过elasticSearch实现该功能。
首先要把MySql中的数据导入到elasticSearch中去:
这里我们就不详细描述了,去我的另外一篇文章有专门的详细描述
链接:把MySql中的数据导入elasticSearch中去,并构建相关联想约束.
下面的代码的前提是我们已经建立好了索引----------》对应到我们的关系型数据库也就是表。
1、效果展示:
输入拼音或者部分品牌或者分类信息会联想出来内容
2、后台Controller 代码:
其中关联数据不是从MySql中所查询的,是从elasticSearch中所查询的
3.Service中的代码:
前端以及elasticSearch中实现比对
附上代码:
Controller层:
@RestController
@RequestMapping("search")
public class SearchController {
@Autowired
private SearchService searchService;
@GetMapping("suggestion")
public List<String> getSuggestion(@RequestParam("key") String key){
return searchService.getSuggestion(key);
}
}
Service层:
@Override
public List<String> getSuggestion(String key) {
try {
SearchRequest request =new SearchRequest("hmall");
//构造联想查询的条件
request.source().suggest(new SuggestBuilder()
.addSuggestion("my_suggest",
SuggestBuilders
.completionSuggestion("suggestion")
.skipDuplicates(true)
.size(20)
.prefix(key)));
//开始查询
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析结果
CompletionSuggestion my_suggest = response.getSuggest().getSuggestion("my_suggest");
List<CompletionSuggestion.Entry.Option> options = my_suggest.getOptions();
List<String> list = new ArrayList<>();
if(options!=null && options.size()>0){
for (CompletionSuggestion.Entry.Option option : options) {
String string = option.getText().string();
list.add(string);
}
}
return list;
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
更多推荐
已为社区贡献5条内容
所有评论(0)