java使用elasticsearch进行多个条件模糊查询

文章说明:

1、本篇文章,本人会从java连接elasticsearch到查询结果生成并映射到具体实体类(涵盖分页功能)

2、代码背景:elasticsearch版本为:5.2.0;

3、本人以下代码是分别从两个索引中查询数据,再将两个数据进行整合,如果大家只需要分组查询,那么则选取文章中的分组查询部分代码

4、本人的实体类主要是按照layUI分页框架进行设计;实体大家可以根据自己的具体需求进行设计

一、java连接elasticsearch工具类

public classESClientConnectionUtil {public static TransportClient client=null;public final static String HOST = "192.168.200.200"; //服务器部署ip 根据自己ip进行更改

public final static Integer PORT = 9301; //端口

public staticTransportClient getESClient(){

System.setProperty("es.set.netty.runtime.available.processors", "false");if (client == null) {synchronized (ESClientConnectionUtil.class) {try{//设置集群名称

Settings settings = Settings.builder().put("cluster.name", "es5").put("client.transport.sniff", true).build();//创建client

client = new PreBuiltTransportClient(settings).addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName(HOST), PORT));

}catch(Exception ex) {

ex.printStackTrace();

System.out.println(ex.getMessage());

}

}

}returnclient;

}public staticTransportClient getESClientConnection(){if (client == null) {

System.setProperty("es.set.netty.runtime.available.processors", "false");try{//设置集群名称

Settings settings = Settings.builder().put("cluster.name", "es5").put("client.transport.sniff", true).build();//创建client

client = new PreBuiltTransportClient(settings).addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName(HOST), PORT));

}catch(Exception ex) {

ex.printStackTrace();

System.out.println(ex.getMessage());

}

}returnclient;

}//判断索引是否存在

public static booleanjudgeIndex(String index){

client=getESClientConnection();

IndicesAdminClient adminClient;//查询索引是否存在

adminClient=client.admin().indices();

IndicesExistsRequest request= newIndicesExistsRequest(index);

IndicesExistsResponse responses=adminClient.exists(request).actionGet();if(responses.isExists()) {return true;

}return false;

}

}

二、实体类

(一)分页实体总类

public classKnowledgeTopicListDTO {private Long totalCount;//总条数

private Integer page;//页数

private Integer limit;//每页查询条数

private List topicDTOList;//每页显示数据的对象集合

publicLong getTotalCount() {returntotalCount;

}public voidsetTotalCount(Long totalCount) {this.totalCount =totalCount;

}publicInteger getPage() {returnpage;

}public voidsetPage(Integer page) {this.page =page;

}publicInteger getLimit() {returnlimit;

}public voidsetLimit(Integer limit) {this.limit =limit;

}public ListgetTopicDTOList() {returntopicDTOList;

}public void setTopicDTOList(ListtopicDTOList) {this.topicDTOList =topicDTOList;

}

}

(二)页面显示数据对象实体

public classKnowledgeTopicDTO {private Long id;//知识主题id

private String name;//知识主题名称

private Boolean active;//有效无效 true,false

private String activeString;//有效无效

private Boolean noSubscription;//是否需要订阅 true,false

private String noSubscriptionString;//是否需要订阅

private Long quantity;//数据量

privateString _id;privateString ids;publicString getIds() {returnids;

}public voidsetIds(String ids) {this.ids =ids;

}publicLong getId() {returnid;

}public voidsetId(Long id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicBoolean getActive() {returnactive;

}public voidsetActive(Boolean active) {this.active =active;

}publicString getActiveString() {returnactiveString;

}public voidsetActiveString(String activeString) {this.activeString =activeString;

}publicBoolean getNoSubscription() {returnnoSubscription;

}public voidsetNoSubscription(Boolean noSubscription) {this.noSubscription =noSubscription;

}publicString getNoSubscriptionString() {returnnoSubscriptionString;

}public voidsetNoSubscriptionString(String noSubscriptionString) {this.noSubscriptionString =noSubscriptionString;

}publicLong getQuantity() {returnquantity;

}public voidsetQuantity(Long quantity) {this.quantity =quantity;

}publicString get_id() {return_id;

}public voidset_id(String _id) {this._id =_id;

}

}

三、后台service层代码

publicKnowledgeTopicListDTO selectTopicByName(String name, Integer page, Integer limit) {

SearchResponse searchResponse=null;

Map map = new HashMap<>();

TransportClient transportClient=ESClientConnectionUtil.getESClientConnection();

SearchRequestBuilder requestBuilder= client.prepareSearch("knowledge").setTypes("knowledge_theme");//声明where条件

BoolQueryBuilder qbs =QueryBuilders.boolQuery();/**此处使用模糊匹配查询 类比数据库中 like*/QueryBuilder qb1= QueryBuilders.matchPhraseQuery("name", name);

BoolQueryBuilder bqb1=QueryBuilders.boolQuery().must(qb1);

qbs.must(bqb1);

requestBuilder.setQuery(qbs);int num=limit*(page-1);

SearchResponse response= requestBuilder.setFrom(0).setSize(10).execute().actionGet();//获取总条数//long totalCount = searchResponse.getHits().getTotalHits();

List list = new ArrayList();for(SearchHit hit : response.getHits().getHits()) {//获取到当前页的数据

JSONObject obj = new JSONObject().fromObject(hit.getSourceAsString());//将json字符串转换为json对象

KnowledgeTopicDTO topic = (KnowledgeTopicDTO) JSONObject.toBean(obj, KnowledgeTopicDTO.class);//将建json对象转换为Person对象

list.add(topic);

}//查询主题总数

Terms terms= ESGroupByUtil.GroupByOne(client,"hottopic","hot","sum","tasktitleid");

list= groupList(list,terms);//调用组合主题总数方法

KnowledgeTopicListDTO knowledgeTopicListDTO = newKnowledgeTopicListDTO();

knowledgeTopicListDTO.setLimit(limit);

knowledgeTopicListDTO.setPage(page);

knowledgeTopicListDTO.setTopicDTOList(list);returnknowledgeTopicListDTO;

}

五、根据单个字段分组查询

public classESGroupByUtil {/***@description: 根据单个字段分组求和

*@author:cyb

*@date: 2018-11-16 17:31

*@param: client ES连接

*@param: indices 索引

*@param: types 类型

*@param: alias 分组求和别名

*@param: DomName 分组目标字段名

*@return: org.elasticsearch.search.aggregations.bucket.terms.Terms*/

public staticTerms GroupByOne(TransportClient client,String indices,String types,String alias,String DomName){

SearchRequestBuilder sbuilder=client.prepareSearch(indices).setTypes(types);

TermsAggregationBuilder termsBuilder=AggregationBuilders.terms(alias).field(DomName);

sbuilder.addAggregation(termsBuilder);

SearchResponse responses=sbuilder.execute().actionGet();

Terms terms=responses.getAggregations().get(alias);returnterms;

}

}

六 、将分组查询的数据进行整合到已查询到的集合中

/***@description:将查询的总数合并到list中

*@author:cyb

*@date: 2018-11-16 17:51

*@param: list

*@param: terms

*@return: java.util.List*/

public List groupList(Listlist,Terms terms){

List lists = new ArrayList<>();for(int i=0;i

String id =terms.getBuckets().get(i).getKey().toString();//id

Long sum =terms.getBuckets().get(i).getDocCount();//数量

BsKnowledgeInfoDTO bsKnowledgeInfoDTO1 = newBsKnowledgeInfoDTO();

bsKnowledgeInfoDTO1.setId(id);

bsKnowledgeInfoDTO1.setSum(sum);

lists.add(bsKnowledgeInfoDTO1);

System.out.println("=="+ terms.getBuckets().get(i).getDocCount()+"------"+terms.getBuckets().get(i).getKey());

}for(int i=0;i

list.get(j).setQuantity(lists.get(i).getSum());

}

}

}returnlist;

}

总结:以上代码是本人的亲自测试通过的,分页后期建议大家不用使用from,size格式,当数据量超过1w的时候,速度会越来越慢,并可能造成宕机。

精准条件查询

MatchPhraseQueryBuilder mpq1 =QueryBuilders

.matchPhraseQuery("id",knowledgeId);

qbs.must(mpq1);//主题id

模糊条件查询

QueryBuilder qb1 = QueryBuilders.matchPhraseQuery("title", keyword);

qbs.must(qb1);

requestBuilder.setQuery(qbs);

es java 模糊查询_java使用elasticsearch进行模糊查询之must使用-项目中实际使用相关推荐

  1. es java 模糊查询_java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  2. java对es做聚合查询_java操作elasticsearch实现聚合查询

    1.max 最大值 //max 求最大值 @Test public void test30() throws UnknownHostException{ //1.指定es集群 cluster.name ...

  3. java web数据库查询_Java Web开发之信息查询方式总结

    本文实例讲述了Java Web开发之信息查询方式总结.分享给大家供大家参考.具体如下: 这里介绍的查询方式有: ① 根据某个特定的字段查询: ② 在多个字段中查询: ③ 根据任意字段查询: ④ 任意字 ...

  4. java 拼音模糊查询_java实现首字母模糊查询的功能

    ①,要实现首字母模糊匹配,首先我们需要得到你要搜索内容的首字母,对于java来说,有一个非常实用的包:pinyin4j.jar. 这个拼音包中的PinyinHelper 方法可以得到String的首字 ...

  5. java 图像锐化_Java实现图像的模糊与锐化实例

    时间:2018-09-28 概述:图片模糊 锐化 Java 图像处理的一个例子,实现图片的模糊和锐化,在PhotoShop中,这是一个很常用的滤镜效果,用Java同样也可实现这些强大的功能,图像锐化效 ...

  6. java二级下拉列表_java map实现二级联动查询(省市区下拉列表查询)

    1.Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省市级联选择框,当选择省份信息 ...

  7. java域名查询_Java技巧: 根据网址/域名查询DNS/IP地址

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...

  8. java红包雨_Java升职加薪课开发企业年会红包雨场景项目实战视频教程

    04-统计用的基础视图.mp4 │  │      05-字典及中奖数统计报表设计.mp4 │  │      06-中奖统计视图及操作日志.mp4 │  │      07-数据库建模回顾与总结.m ...

  9. idea上java接口自动化_Java接口自动化之IDEA创建及运行maven项目

    本文2564字 阅读约需7分钟第195次推送 Maven作为一个项目管理工具,是一组标准集合,一个项目的生命周期.一个依赖管理系统,以下主要介绍IDEA创建及运行maven项目. 01创建maven项 ...

  10. java 模块 分工_Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

最新文章

  1. HDU2093 考试排名
  2. 做乘法c语言,【code】C语言_实现输入的矩阵的乘法运算
  3. PHP的chunk_split() 函数把字符串分割为一连串更小的部分
  4. One year ago begininginginginging!
  5. java泛型区间_JAVA 14(泛型)
  6. 实操长文|评估风控策略效果(全)
  7. Spark SQL External DataSource外部数据源
  8. ARCGIS下载及安装
  9. Alexa Top 1000000
  10. 基于multisim的电子秒表
  11. 冯诺依曼计算机流程图,基本流程图综述
  12. TFS2010新建项目失败
  13. NOTE【数据分析】置信水平/置信区间
  14. mysql数据库技术思考题5_Mysql课后思考题
  15. 服务器上自动备份数据库突然不备份了
  16. java 从已知日期计算干支纪日_根据公历日期计算当日干支(详解)
  17. 美国计算机科学专业申请条件,美国CS计算机科学专业申请条件
  18. 自创文字小游戏《人类末日·丧尸危机》
  19. htc 8x android,htc 8x的usb驱动下载
  20. python去除图片多余的白色边框

热门文章

  1. 格林第一季/全集Grimm迅雷下载
  2. 使用d3.js绘制曲线图
  3. 11年22部!漫威宇宙剧情与电影时间线梳理
  4. Web2.0是什么:下一代软件的业务模式与设计模式
  5. 新元宇宙奇科幻小说《地球人奇游天球记》第十一回水星冲浪
  6. 【寒江雪】空间中的点线和面
  7. 代码自动删除QQ空间里的说说
  8. QQ空间批量删除留言
  9. 论文笔记:SAIN: Self-Attentive Integration Network for Recommendation(SIGIR 2019)
  10. 新美域杂志新美域杂志社新美域编辑部2022年第6期目录