个人名片:
博主:酒徒ᝰ.
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:三人行,必有我师焉。
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看
Elasticsearch的高亮(Highlight)是搜索结果中高亮显示匹配关键词或短语的位置。
高亮的主要作用是突出显示搜索结果中与查询关键词或短语匹配的部分,以便用户可以更快速、准确地找到所需内容。高亮还可以帮助搜索引擎理解查询意图,提高搜索的准确性和效率。
Elasticsearch的高亮优势有以下几点:
- 高亮方式在处理大字段时有较大优势,占用空间较小。
- 高亮方式在实时分词速度小于磁盘读随机取速度时具有明显优势。
- 高亮方式可以支持多段高亮。
- 高亮方式可以自定义标签和样式。
- 高亮方式可以设置高亮位置。
在Elasticsearch中,可以使用高亮功能对搜索结果进行高亮显示,以突出匹配的关键词或短语。下面是一些关于Elasticsearch中高亮处理的介绍:
高亮字段 高亮字段是在搜索结果中高亮显示匹配关键词或短语的位置。可以通过在查询中指定高亮字段来实现。
高亮标识 高亮标识用于指定高亮字段的前缀和后缀,以标识匹配的关键词或短语。可以通过在查询中的highlight参数中指定pre_tags和post_tags来实现。
我们使用< em>标签作为高亮标识的前缀,使用< /em>标签作为高亮标识的后缀。查询结果将使用这些标签对匹配字段进行高亮显示。高亮排序 高亮排序用于指定高亮字段在搜索结果中的排序方式。可以通过在查询中的highlight参数中指定order来实现。使用score作为高亮排序方式,即按照与关键词的匹配程度对高亮字段进行排序。Elasticsearch默认使用score作为排序方式。
除了上述高亮处理的功能外,Elasticsearch还提供了其他高级的高亮功能,例如多段高亮、高亮片段、高亮聚合等。
修改buildBasicQuery
private void buildBasicQuery(RequestParams params, SearchRequest request) {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
String key = params.getKey();
if (key == null || "".equals(key)) {
boolQuery.must(QueryBuilders.matchAllQuery());
}else {
boolQuery.must(QueryBuilders.matchQuery("all", key));
}
String city = params.getCity();
if (city != null && !"".equals(city)){
boolQuery.filter(QueryBuilders.termQuery("city", city));
}
String brand = params.getBrand();
if (brand != null && !"".equals(brand)){
boolQuery.filter(QueryBuilders.termQuery("brand", brand));
}
String starName = params.getStarName();
if (starName != null && !"".equals(starName)){
boolQuery.filter(QueryBuilders.termQuery("starName", starName));
}
Integer maxPrice = params.getMaxPrice();
Integer minPrice = params.getMinPrice();
if (maxPrice != null && minPrice != null) {
boolQuery.filter(QueryBuilders.rangeQuery("price")
.gte(minPrice)
.lte(maxPrice));
}
String location = params.getLocation();
if (location != null && !"".equals(location)){
request.source().sort(SortBuilders
.geoDistanceSort("location", new GeoPoint(location))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
);
}
String sortBy = params.getSortBy();
if (sortBy.equals("score")){
request.source().sort(sortBy, SortOrder.DESC);
}else if (sortBy.equals("price")){
request.source().sort(sortBy, SortOrder.ASC);
}
FunctionScoreQueryBuilder functionScoreQuery =
QueryBuilders.functionScoreQuery(
boolQuery,
new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("isAD", true),
ScoreFunctionBuilders.weightFactorFunction(10)
)
}
);
request.source().query(functionScoreQuery);
int page = params.getPage(), size = params.getSize();
request.source().
from((page-1)*page).size(size);
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
}
总结:
Elasticsearch高亮功能详解:原理、应用与优化
一、高亮功能简介
在Elasticsearch中,高亮功能是一种用于突出显示搜索结果中关键词或短语位置的方法。通过高亮,用户可以快速识别文档中与搜索查询相关的内容,提高搜索效率和准确性。高亮功能还能帮助搜索引擎理解用户查询意图,从而为用户提供更相关的搜索结果。
二、高亮原理与实现
高亮功能在Elasticsearch中通过高亮查询(Highlight Query)实现。高亮查询会在搜索过程中对匹配的词进行高亮显示,并允许用户自定义高亮标签和样式。
"query"部分指定了搜索的查询语句,"highlight"部分则指定了高亮相关设置。通过设置"pre_tags"和"post_tags"来定义高亮标签,使用"fragment_size"来指定片段大小。
三、高亮功能应用场景
高亮功能在Elasticsearch中有广泛的应用场景。以下是几个常见的应用场景:
商品搜索:在电商平台上,用户搜索商品时,高亮功能可以帮助用户快速找到与搜索关键词匹配的商品,提高用户体验。
文档搜索:在企业内部文档搜索中,高亮功能能够突出显示与搜索关键词相关的文档段落,方便用户快速定位关键信息。
代码搜索:在代码搜索中,高亮功能可以将搜索关键词所在的代码片段高亮显示,帮助开发者更快地找到所需代码。
四、高亮功能优化
虽然高亮功能在Elasticsearch中已经非常强大,但在实际应用中,可能还需要针对特定场景进行优化。以下是一些常见的优化方法:精确匹配与模糊匹配:在设置高亮查询时,可以根据需要使用精确匹配或模糊匹配。精确匹配更准确,但可能忽略某些相关内容;模糊匹配则可以匹配更多内容,但可能存在一定误差。
高亮位置自定义:可以自定义高亮位置,例如仅高亮关键词所在句子或段落,以减少高亮结果的干扰。 高亮标签与样式:可以自定义高亮标签和样式,使其更符合网站或应用程序的主题和风格。
缓存优化:对高亮查询结果进行缓存,以提高搜索效率。可以考虑使用Elasticsearch缓存机制或自定义缓存实现。 处理大型文本字段:当处理大型文本字段时,可以调整高亮查询的片段大小,以避免消耗过多内存和带宽。
五、高亮功能常见问题与解决方案
在使用高亮功能时,可能会遇到一些常见问题。以下是一些问题的解决方案:高亮结果过多或不准确:可以尝试调整高亮查询的设置,如精确匹配与模糊匹配、高亮标签与样式等,以提高高亮结果的准确性和相关性。同时,还可以对搜索词进行过滤和去重,以避免过多干扰结果。
高亮查询性能问题:高亮查询可能会增加搜索时间。可以考虑使用缓存优- 化方法来提高性能,如缓存高亮查询结果、使用布隆过滤器等。此外,还可以对文本字段进行分词处理,以降低高亮查询的复杂度。