1.相关性常用手段
- 相关性排名
- 引导用户选择更好的搜索查询、向用户推荐其他相关搜索
- 通过拼写检查纠正用户的搜索错误
- 突出显示文档之所以对用户而言有相关性的原因
- 向用户解释搜索的过程
- 允许用户从结果集中过滤掉无关内容
2.搜索框相关性反馈
2.1即输即搜
搜索引擎再用户进行输入的同时,及时主动提供匹配的文档。传统的方式是“用户输入完关键词后,通过点击查询按钮触发查询操作,然后搜索引擎后台根据检索关键词向用户展现相关查询内容”,同传统的方式相比,即输即搜具有如下两个方面好处:
1)通过“即输即搜”得到的结果,用户可以及时对输入关键词的有效性就行更正。如果查询到的结果过于宽泛,则用户可以通过继续增加搜索词的方式,缩小检索范围以做到查询的进一步精确化;如果查询的结果不是期望的,则可以对检索关键词进行修正。
2)快速响应,最快速度将相关性文档返回给用户
ES提供查询:match_phrase_prefix
2.2搜索补全
引导用户获得更优质的搜索查询和关键词,需要两方面保证:一个是速度、另一个是相关度。常用的方式包括:
1)根据用户过往输入产生补全
【使用的问题】
在过往搜索关键词可能存在过时问题;同时如果过往搜索有存在检索匹配结果为0的查询,如果将该查询关键词推荐给用户,容易造成用户迷惑不解。
2)根据被搜索文档产生补全
利用被搜索内容的文本进行补全,确保推荐给用户的不全建议都是与文档集中出现的文字紧密关联。
3)借用专用索引快速产生搜索补全项
利用Elasticsearch提供的部件-completion suggester,允许用户自定义补全结果的排序规则。该组件是一种特殊的索引,与普通索引一同被存储起来,支撑其工作的是一种压缩数据结构(一种有穷状态转换器,finaite state trasnducer),该结构提供一种快速前缀查找能力。配置completion suggester很简单,只需要将某个字段声明为completion类型,如下图所示:
....(other fields)....
"name": {
"analyzer": "ikIndexAnalyzer",
"type": "text",
"fields": {
"ngram": {
"analyzer": "ngramIndexAnalyzer",
"type": "text"
},
suggest":{
"type": "completion",
"analyzer": "standard",
"preserve_separators": false,
"preserve_position_increments": true,
"max_input_length": 50
}
}
},
....(other fields)....
字段设置完毕后,可以通过如下编码实现自动补全:
@Override
public List<String> autoComplete(String keyWord) {
try {
if (StringUtils.isBlank(keyWord)){
return null;
}
keyWord = keyWord.toLowerCase();
//构造搜索建议语句
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("name.suggest")
.prefix(keyWord, Fuzziness.AUTO);
//根据
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
new SuggestBuilder().addSuggestion("my-suggest",completionSuggestionFuzzyBuilder), AppInfoForES.class);
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("my-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
logger.info("相关补全建议关键词个数={}", options.size());
//获取结果
List<String> suggestList = new ArrayList<>();
options.forEach(item ->{ suggestList.add(item.getText().toString()); });
return suggestList;
}catch (Exception ex){
throw new BusinessException(CoreConstants.REQUEST_ERROR_PARAMS, "更新相关APP信息出错!"+ex, false);
}
}
【特别说明】
本人使用的是spring-boot-starter-data-elasticsearch,底层使用的是spring-data-elasticsearch
Maven配置:
<!-- ElasticSearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.3搜索建议
上一节讲的搜索补全,是在用户输入时为其提供建议。而本部分的“搜索建议”是在用户提交了查询请求后向用户提供有关该查询的修改和改进建议。如:
这里我们可以利用ES的phrase suggester实现“搜索建议”,利用“你是不是打算”这样的建议来纠正用户的错误
//TODO 这里的实践例子,需要后续补充上。
3搜索结果相关性反馈
针对搜索结果常用的提升相关性反馈的手段有如下几种:
3.1文本高亮
检索查询出的匹配文档高亮显示匹配的关键词,突出显示呈现给用户。
3.2对搜索结果中的相似文档进行分组
3.3在用户搜不到结果时给予帮助
将用户查询条件替换成最佳建议项,或者将用户输入的查询条件进行宽松处理。