多条件检索,结果高亮处理 (业务场景 索引库设计 实现流程)
场景:
当我们输入关键字搜索时,搜索结果中包含关键字的字段要用其他颜色标记出来
索引库设计:
默认情况下搜索字段要与高亮字段保持一致,若搜索字段为all,则需要加required_field_match=false属性
实现流程:
// 1.准备RequestSearchRequest request = new SearchRequest("hotel");// 2.准备DSL// 2.1.queryrequest.source().query(QueryBuilders.matchQuery("all", "如家"));// 2.2.高亮request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));// 3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit searchHit : searchHits) {Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();if (!CollectionUtils.isEmpty(highlightFields)) {HighlightField name = highlightFields.get("name");String s = name.getFragments()[0].string();if (s!=null){hotelDoc.setName(s);}}}
按距离排序 查询离我最近的XXX (业务场景 索引库设计 实现流程)<br />业务场景:<br />当用户点击距离优先时,显示按照距离排序,并显示距离多远<br />索引库设计:<br />无<br />实现流程:
// 1排序
String location = params.getLocation();
if (location != null && !location.equals("")) {
request.source().sort(SortBuilders
.geoDistanceSort("location", new GeoPoint(location))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
);
}
// 2发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit searchHit : searchHits) {
Object[] sortValues = searchHit.getSortValues();
if (sortValues!=null&&sortValues.length>0) {
System.out.println(sortValues.length);
hotelDoc.setDistance(sortValues[0]);
}
}
XXX竞价排名? (业务场景 索引库设计 实现流程)<br />业务场景:<br />当用户交了广告费之后,想让自己的品牌出现在前列<br />索引库设计:<br />在索引库中添加是否缴纳广告费字段 isAD:boolean类型<br />实现流程
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
// 关键字搜索
String key = params.getKey();
if (key == null || "".equals(key)) {
boolQueryBuilder.must(QueryBuilders.matchAllQuery());
} else {
boolQueryBuilder.must(QueryBuilders.matchQuery("all", key));
//高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder field = highlightBuilder.field("name").requireFieldMatch(false);
field.preTags("<em>");
field.postTags("</em>");
source.highlighter(highlightBuilder);
}
//对品牌多虑
if (!StringUtils.isBlank(params.getBrand())) {
TermQueryBuilder query = QueryBuilders.termQuery("brand", params.getBrand());
boolQueryBuilder.filter(query);
}
//对城市过滤
if (!StringUtils.isBlank(params.getCity())) {
TermQueryBuilder query = QueryBuilders.termQuery("city", params.getCity());
boolQueryBuilder.filter(query);
}
//对星级过滤
if (!StringUtils.isBlank(params.getStarName())) {
TermQueryBuilder query = QueryBuilders.termQuery("starName", params.getStarName());
boolQueryBuilder.filter(query);
}
//对价格过滤,
if (params.getMaxPrice() != null && params.getMinPrice() != null) {
RangeQueryBuilder query = QueryBuilders.rangeQuery("price").gt(params.getMinPrice()).lt(params.getMaxPrice());
boolQueryBuilder.filter(query);
}
//对价格过滤,
if (params.getMaxPrice() != null && params.getMinPrice() == null) {
RangeQueryBuilder query = QueryBuilders.rangeQuery("price").lt(params.getMaxPrice());
boolQueryBuilder.filter(query);
}
//对价格过滤,
if (params.getMaxPrice() == null && params.getMinPrice() != null) {
RangeQueryBuilder query = QueryBuilders.rangeQuery("price").gt(params.getMinPrice());
boolQueryBuilder.filter(query);
}
source.query(boolQueryBuilder);
//是否投入广告,投入则排名靠前
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
boolQueryBuilder,
new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
// 过滤条件
QueryBuilders.termQuery("isAD", true),
// 算分函数
ScoreFunctionBuilders.weightFactorFunction(100000)
)
}).scoreMode(FunctionScoreQuery.ScoreMode.SUM);
source.query(functionScoreQueryBuilder);
聚合查询搜索条件? (业务场景 索引库设计 实现流程)<br /> 自动补全及拼音查询? (业务场景 索引库设计 实现流程)<br />业务场景:<br />当用户输入关键字,或拼音时,能够给予提示<br /> es和mysql数据同步思路?<br />通过RabbitMQ消息队列<br /> es如何保证高可用?(集群介绍)<br /> es集群中分片和副本介绍?<br /> es集群中的脑裂现象?<br /> es集群中的故障转移? (集群容错)
1.数据聚合
聚合的种类
聚合常见的有三类:
- 桶(Bucket)聚合:用来对文档做分组
- TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
- Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
- 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
- Avg:求平均值
- Max:求最大值
- Min:求最小值
- Stats:同时求max、min、avg、sum等
- 管道(pipeline)聚合:其它聚合的结果为基础做聚合
参加聚合的字段必须是keyword、日期、数值、布尔类型
