一.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实现复合查询高亮结果功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月15日
2024年11月15日
- 陈奕迅《黑·白·灰》台湾版[WAV+CUE][400M]
- 张尕怂.2024-甘肃娃娃【FLAC分轨】
- 张惠妹.2011-A.MEI.ACOUSTIC.BEST.2CD【丰华】【WAV+CUE】
- ZEN.1996-珍惜所有【华纳】【WAV+CUE】
- 群星《环球国语元素》香港首版[WAV+CUE][1G]
- 周慧敏《玉女天后》原音母版1:1直刻[WAV+CUE][1G]
- 谭咏麟《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- 炉石传说40轮盘术最新卡组代码在哪找 标准40轮盘术卡组代码分享
- 炉石传说亲王贼怎么玩 2024亲王贼最新卡组代码分享
- 炉石传说30.6.2补丁后有什么卡组 30.6.2最强卡组最新推荐
- 模拟之声慢刻CD《蔡琴名曲回顾遇听》[原抓WAV+CUE]
- BruceLiu-WAVES(MusicbySatie)(2024)2CD[24Bit-96kHz]FLAC
- KonstantinKrimmel-MythosSchubertLoewe(2024)[24Bit-96kHz]FLAC
- 2024雷蛇高校挑战赛 嘤式分解助力收官之战
- 海信发布110吋世俱杯官方定制AI电视 引领智能观赛