Elasticsearch实现复合查询,高亮结果等技巧
一.Es的配置
实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法.
public TransportClient esClient() throws UnknownHostException{
Settings settings = Settings.builder()
.put("cluster.name", "my-application") //节点的名字
.put("client.transport.sniff", true)
.build();
InetSocketTransportAddress iAddress = new InetSocketTransportAddress( //连接es的ip地址和端口号
InetAddress.getByName("127.0.0.1"),9300
);
//根据先前的配置生成client,后面的操作基本都是基于这个
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(iAddress);
return client;
}
二.功能的实现
以下是全文检索的核心代码,包括我遇到的错误以及解决,包括如何对高亮失效,高亮不全等的解决.
1.查询条件
TransportClient esClient = esClient(); //获取先前生成的client
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //生成复合查询构造器 boolQuery.mustNot(
QueryBuilders.matchQuery("",) //字段必须不包含啥
); boolQuery.should(
QueryBuilders.matchQuery(, ) //字段可以包含啥,相当于或者
); boolQuery.must(
QueryBuilders.matchQuery(,) //字段必须包含啥
);
2.高亮条件
//配置标题高亮显示
HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查询器
highlightBuilder.field(title); //高亮查询字段
highlightBuilder.field(content); //高亮查询字段
highlightBuilder.requireFieldMatch(false); //如果要多个字段高亮,这项要为false
highlightBuilder.preTags("<span style=\"color:red\">"); //高亮设置
highlightBuilder.postTags("</span>");
//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
highlightBuilder.fragmentSize(800000); //最大高亮分片数
highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段
3.查询配置
// 根据字段进行排序,这里我根据时间进行倒排
FieldSortBuilder timeSort = SortBuilders.fieldSort("time").order(SortOrder.DESC); //查询请求生成
SearchRequestBuilder requestBuilder = esClient.prepareSearch(indexname)//索引名字
.setTypes(indextype) //索引类型
.setQuery(boolQuery) //配置查询条件
.addSort(new ScoreSortBuilder()) //根据查询相关度进行排序
.addSort(timeSort) //再根据时间进行排序
.setTrackScores(true) //避免分页之后相关性乱了
.highlighter(highlightBuilder) //配置高亮
.setFrom(from) //设置分页
.setSize();
4.获取查询结果对其高亮
//获取查询结果
SearchResponse searchResponse = requestBuilder.get(); List<Map<String, Object>> course = new ArrayList<>();
if(searchResponse.status() != RestStatus.OK){
return course;
}
for(SearchHit hit:searchResponse.getHits()){ //获取高亮字段
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField titleField = highlightFields.get("");
HighlightField contentField = highlightFields.get(""); Map<String, Object> source = hit.getSource(); //千万记得要记得判断是不是为空,不然你匹配的第一个结果没有高亮内容,那么就会报空指针异常,这个错误一开始真的搞了很久
if(titleField!=null){
Text[] fragments = titleField.fragments();
String name = "";
for (Text text : fragments) {
name+=text;
}
source.put("", name); //高亮字段替换掉原本的内容
} course.add(source);
}
esClient.close(); //用完记得关闭
return course;
三.结语
这样前端所获取结果的搜索内容将会被<span style="color:red;"></span>所包含,比如我前端是微信小程序,所以直接获取内容进行渲染的话,就是一堆字符串,所以用的是小程序的富文本标签<rich-text>.
如果你觉得文章内容对你有用的话,不用忘记评论,点赞.
Elasticsearch实现复合查询,高亮结果等技巧的更多相关文章
- Elasticsearch(7) --- 复合查询
Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...
- Elasticsearch(5) --- Query查询和Filter查询
Elasticsearch(5) --- Query查询和Filter查询 这篇博客主要分为 :Query查询和Filter查询.有关复合查询.聚合查询也会单独写篇博客. 一.概念 1.概念 一个查询 ...
- java使用elasticsearch进行模糊查询-已在项目中实际应用
java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...
- Elasticsearch 常用基本查询
安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch 为了介绍Elasticsearch中的不同查询类型,我们将对带有下列字段的文 ...
- Elasticsearch——QueryBuilder简单查询
elasticsearch中存储的全部文档 1.matchAllQuery() matchAllQuery()方法用来匹配全部文档 public class QueryTest { pub ...
- 014-elasticsearch5.4.3【五】-搜索API【三】复合查询boolQuery、constantScoreQuery、disMaxQuery
一.概述 复合查询包装其他复合或叶子查询,以组合其结果和分数,更改其行为,或从查询切换到筛选器上下文. 1.1.constantScoreQuery 包含另一个查询但在过滤器上下文中执行的查询.所有匹 ...
- Elasticsearch系列---聚合查询原理
概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...
- elasticsearch GIS空间查询问题解决
在GIS行业的应用越来越广泛,GIS最常用根据区域进行空间数据查询 我定义了两个方法,一起来看一下: /** * geodistance filter * 一个过滤器来过滤基于一个特定的距离从 ...
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
随机推荐
- 谁说微服务是Spring Cloud的独角戏?Service Mesh了解一下?
Service Mesh 的概念自 2017 年初提出之后,受到了业界的广泛关注,作为微服务的下一代发展架构在社区迅速发酵,并且孵化出了诸如 Istio 等广受业界关注的面向于云原生 (Cloud N ...
- ActiveMQ配置策略
1.消息发送 1.异步发送 消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个确认消息给生产者,这个确认消息暗 ...
- IPV6-ONLY
1.ipv4地址已经耗尽,未来可能只支持ipv6-only. 2.在一个纯IPV6环境下,路由器会自动将IPV4地址转成IPv6地址. 苹果这样要求,对于大多数开发者而言,并不困难.目前大多数应用无需 ...
- ARTS-S docker里程序通过ip访问外部数据库
要先确保外部数据库能通过ip访问,然后启动docker的时间加参数--network host,如 docker run \ --name fcheck_async_worker \ -it \ -v ...
- 167. 两数之和 II - 输入有序数组
给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值( ...
- Spring boot 集成 阿里 Mqtt
因为公司业务需求,需要接入 阿里Mqtt,自己基于Spring写了一个小demo,记录下来,已备以后需要. 第一步 创建一个实体bean用来装载 MqttClient private MqttClie ...
- 【Hybird】274-Hybird App 应用开发中 5 个必备知识点复习
前言 我们大前端团队内部 ?每周一练 的知识复习计划还在继续,本周主题是 <Hybird APP 混合应用专题> ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多. 之前分享的每周 ...
- 《Java知识应用》Java压缩文件和解压缩
今天通过Java实现一下:文件的压缩和解压缩. 1. 压缩 准备文件: 准备代码:(压缩) import java.io.BufferedInputStream; import java.io.Buf ...
- 《Java算法》排序算法-快速排序
排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...
- 分享一篇关于C#大文件上传的整个过程
简单写个小例子,记录一下此次大文件上传遇到的所有问题. 一.客户端(使用winform窗体实现) 具体功能: 点击“选择”按钮,选择要上传的文件 点击“上传文件”按钮,上传该文件调用UpLoad_Re ...