es复合查询java实现_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(""); //高亮设置

highlightBuilder.postTags("");

//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等

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> course = new ArrayList<>();

if(searchResponse.status() != RestStatus.OK){

return course;

}

for(SearchHit hit:searchResponse.getHits()){

//获取高亮字段

Map highlightFields = hit.getHighlightFields();

HighlightField titleField = highlightFields.get("");

HighlightField contentField = highlightFields.get("");

Map 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;

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

三.结语

这样前端所获取结果的搜索内容将会被所包含,比如我前端是微信小程序,所以直接获取内容进行渲染的话,就是一堆字符串,所以用的是小程序的富文本标签.

如果你觉得文章内容对你有用的话,不用忘记评论,点赞.

Elasticsearch&lpar;7&rpar; --- 复合查询

Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...

Elasticsearch&lpar;5&rpar; --- 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&period;4&period;3【五】-搜索API【三】复合查询boolQuery、constantScoreQuery、disMaxQuery

一.概述 复合查询包装其他复合或叶子查询,以组合其结果和分数,更改其行为,或从查询切换到筛选器上下文. 1.1.constantScoreQuery 包含另一个查询但在过滤器上下文中执行的查询.所有匹 ...

Elasticsearch系列---聚合查询原理

概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...

elasticsearch GIS空间查询问题解决

在GIS行业的应用越来越广泛,GIS最常用根据区域进行空间数据查询     我定义了两个方法,一起来看一下: /** * geodistance filter * 一个过滤器来过滤基于一个特定的距离从 ...

Hibernate的几种查询方式-HQL&comma;QBC&comma;QBE&comma;离线查询&comma;复合查询&comma;分页查询

HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

随机推荐

PHP5&period;6启动失败

PHP编译安装完毕,启动失败,提示 1 [23-Jun-2014 12:27:02] ERROR: failed to open configuration file '/usr/local/php/ ...

浅谈负载均衡之【tomcat分布式session共享】

1)整理集成所需jar kryo-1.0.3.jar kryo-serializers-0.8.jar memcached-2.4.2.jar memcached-session-manager-1. ...

jvm003 类加载的过程

类加载的过程 一.加载 在加载阶段虚拟机需要完成以下三件事: 通过一个类的全限定名称来获取此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的 ...

关于makefile中变量的多次赋值以及override指令

1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影 ...

UVA-818 dfs &plus; 位运算

暴力枚举一些圆环,将这些圆环解开,看能否成为单链.判断单链的三个条件: 除了这些删除的圆环之外,其他圆环还连接着的圆环不能超过两个. 剩下的环没有连成圈. 剩下的圆环共分成m堆,每堆之间无连接,m必须 ...

Bank方案SQL

用于演示的Bank方案对应的SQL: /* 1.branch 开展银行交易业务的场所 */ DROP TABLE IF EXISTS branch; CREATE TABLE branch -- 开展 ...

WinForm 窗体圆角实现

找了很多资料最后找到了, 表示感谢  为了扩散, 决定复制一份并加上自己尝试的一些方法…… 圆角窗体参考地址:https://blog.csdn.net/lllljz/article/details/ ...

Python-Unittest

TestCase——> Test Fixure测试固件 | TestSuite测试套件——>TestRunner测试运行器 | TestReport 测试断言 verbosity=2 0代 ...

Spring Cloud Stream如何处理消息重复消费?

最近收到好几个类似的问题:使用Spring Cloud Stream操作RabbitMQ或Kafka的时候,出现消息重复消费的问题.通过沟通与排查下来主要还是用户对消费组的认识不够.其实,在之前的博文 ...

PHP性能分析——xhprof(window 安装xhporf)

1 下载xhprof的php扩展 因为官方的xhprof不支持php7,所以采用tideways版本的xhprof 下载地址:windows版tideways_xhprof 将windows版的dll ...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值