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语法基本一致,唯一不同的就是把表名换成了 ...
 
随机推荐
- 微服务管理平台nacos虚拟ip负载均衡集群模式搭建
			
一.Nacos简介 Nacos是用于微服务管理的平台,其核心功能是服务注册与发现.服务配置管理. Nacos作为服务注册发现组件,可以替换Spring Cloud应用中传统的服务注册于发现组件,如:E ...
 - js 防抖、截流
			
突发奇想,在触发事件的时候,一些会频繁触发的事件会不会造成资源的浪费或者大量的计算造成页面卡顿,比如onresize,onscroll,onmousemove等事件. 然后就引出了一个新知识点:防抖. ...
 - Docker学习-jenkins+github实现持续集成和部署
			
上一篇介绍了docker环境搭建,本篇继续深入,结合jenkins利用docker-compose容器编排简单介绍下如何实现个人学习的持续集成/部署. 本篇学习曲线: 1.安装/运行jenkins容器 ...
 - USB3.0之高速视频传输测试 双目相机(mt9p031、mt9m001)带宽高达300M测试 配合isensor测试   500万像素15fps
			
最近完善了下USB3.0的视频开发测试,主要优化了FPGA程序和固件,及其同步方式.对带宽和图像效果进行了仔细的测试 开发板架构(2CMOS+FPGA+2DDR2+USB3.0) 评估板底板配合2个M ...
 - 【CuteJavaScript】Angular6入门项目(3.编写服务和引入RxJS)
			
本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...
 - Orleans[NET Core 3.1] 学习笔记(三)( 1 )本地开发配置
			
本地开发配置 本地开发和调试的时候,我们可能不需要去关注集群和网络ip端口.所以对于本地开发模式,Orleans给了我们比较简单的配置方式. Silo配置 在本地开发的配置模式下,Orleans会默认 ...
 - jvm调优、常用工具
			
ps -ef | grep java查出进程id jmap -heap ID 查出jvm配置信息 加入参数:打印Gc日志,分析 GC日志分析工具: GCeasy 降低minor gc 和 full g ...
 - Vue-router的实现原理
			
参考博客:https://www.jianshu.com/p/4295aec31302 参考博客:https://segmentfault.com/a/1190000015123061
 - linux  各目录 常用用处
			
/bin : 存储常 用用户指令 /boot : 存储 核心.模块 映像等启 动用文件/dev : 存储 设备文件/etc : 存储 系统. 服 务的配置目录 与 文件/home : 存放 个人主目录 ...
 - 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener
			
[Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...