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

文章说明:

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

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

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

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

一、java连接elasticsearch工具类

public class ESClientConnectionUtil {
public static TransportClient client=null;
public final static String HOST = "192.168.200.200"; //服务器部署ip 根据自己ip进行更改
public final static Integer PORT = 9301; //端口 public static TransportClient 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(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
} catch (Exception ex) {
ex.printStackTrace(); System.out.println(ex.getMessage());
}
}
}
return client;
}
public static TransportClient 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(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
} catch (Exception ex) {
ex.printStackTrace();
System.out.println(ex.getMessage());
}
}
return client;
}
//判断索引是否存在
public static boolean judgeIndex(String index){
client= getESClientConnection();
IndicesAdminClient adminClient;
//查询索引是否存在
adminClient= client.admin().indices();
IndicesExistsRequest request = new IndicesExistsRequest(index);
IndicesExistsResponse responses = adminClient.exists(request).actionGet(); if (responses.isExists()) {
return true;
}
return false;
}
}

二、实体类

(一)分页实体总类

public class KnowledgeTopicListDTO {
private Long totalCount;//总条数
private Integer page;//页数
private Integer limit;//每页查询条数
private List<KnowledgeTopicDTO> topicDTOList;//每页显示数据的对象集合 public Long getTotalCount() {
return totalCount;
} public void setTotalCount(Long totalCount) {
this.totalCount = totalCount;
} public Integer getPage() {
return page;
} public void setPage(Integer page) {
this.page = page;
} public Integer getLimit() {
return limit;
} public void setLimit(Integer limit) {
this.limit = limit;
} public List<KnowledgeTopicDTO> getTopicDTOList() {
return topicDTOList;
} public void setTopicDTOList(List<KnowledgeTopicDTO> topicDTOList) {
this.topicDTOList = topicDTOList;
}
}

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

public class KnowledgeTopicDTO {
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;//数据量
private String _id;
private String ids; public String getIds() {
return ids;
} public void setIds(String ids) {
this.ids = ids;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Boolean getActive() {
return active;
} public void setActive(Boolean active) {
this.active = active;
} public String getActiveString() {
return activeString;
} public void setActiveString(String activeString) {
this.activeString = activeString;
} public Boolean getNoSubscription() {
return noSubscription;
} public void setNoSubscription(Boolean noSubscription) {
this.noSubscription = noSubscription;
} public String getNoSubscriptionString() {
return noSubscriptionString;
} public void setNoSubscriptionString(String noSubscriptionString) {
this.noSubscriptionString = noSubscriptionString;
} public Long getQuantity() {
return quantity;
} public void setQuantity(Long quantity) {
this.quantity = quantity;
} public String get_id() {
return _id;
} public void set_id(String _id) {
this._id = _id;
}
}

三、后台service层代码

 public KnowledgeTopicListDTO selectTopicByName(String name, Integer page, Integer limit) {
SearchResponse searchResponse=null;
Map<String,Object> 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<KnowledgeTopicDTO> list = new ArrayList<KnowledgeTopicDTO>();
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 = new KnowledgeTopicListDTO();
knowledgeTopicListDTO.setLimit(limit);
knowledgeTopicListDTO.setPage(page);
knowledgeTopicListDTO.setTopicDTOList(list);
return knowledgeTopicListDTO;
}

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

public class ESGroupByUtil {

    /**
*@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 static Terms 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);
return terms;
} }

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

 /**
*@description:将查询的总数合并到list中
*@author:cyb
*@date: 2018-11-16 17:51
*@param: list
*@param: terms
*@return: java.util.List<com.yjlc.platform.bsKnowledge.KnowledgeTopicDTO>
*/
public List<KnowledgeTopicDTO> groupList(List<KnowledgeTopicDTO> list,Terms terms){
List<BsKnowledgeInfoDTO> lists = new ArrayList<>();
for(int i=0;i<terms.getBuckets().size();i++){
//statistics
String id =terms.getBuckets().get(i).getKey().toString();//id
Long sum =terms.getBuckets().get(i).getDocCount();//数量
BsKnowledgeInfoDTO bsKnowledgeInfoDTO1 = new BsKnowledgeInfoDTO();
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<lists.size();i++){
for(int j=0;j<list.size();j++){
if(lists.get(i).getId().equals(list.get(j).getId())){
list.get(j).setQuantity(lists.get(i).getSum());
}
}
} return list;
}

总结:以上代码是本人的亲自测试通过的,分页后期建议大家不用使用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);

java使用elasticsearch进行模糊查询之must使用-项目中实际使用的更多相关文章

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

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

  2. java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询

    1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...

  3. java操作elasticsearch实现条件查询(match、multiMatch、term、terms、reange)

    1.条件match query查询 //条件查询match query @Test public void test10() throws UnknownHostException { //1.指定e ...

  4. Java数据库学习之模糊查询(like )

    Java数据库学习之模糊查询(like ): 第一种方式:直接在SQL语句中进行拼接,此时需要注意的是parm在SQL语句中需要用单引号拼接起来,注意前后单引号之间不能空格 String sql = ...

  5. java操作elasticsearch实现聚合查询

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

  6. java之mybatis之模糊查询

    1.在 mybatis 中,模糊查询可以有以下方式 (1).第一种,直接将封装好的条件传给 sql 语句 <select id="findByName" parameterT ...

  7. mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能

    接着上一篇说,上一篇的TOPIC是写死的,然而在实际项目中要给不同用户 也就是不同的topic进行推送 所以要写活 package com.fh.controller.information.push ...

  8. elasticsearch的模糊查询

    https://blog.csdn.net/a772304419/article/details/78951561

  9. java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...

随机推荐

  1. niftynet Demo分析 -- brain_parcellation

    brain_parcellation 论文详细介绍 通过从脑部MR图像中分割155个神经结构来验证该网络学习3D表示的效率 目标:设计一个高分辨率和紧凑的网络架构来分割体积图像中的精细结构 特点:大多 ...

  2. 微信开发(一)基于Wx-java的微信分享功能

    最近在做微信服务号开发,简单总结一下,便于自己学习积累和分享给大家: 环境介绍: Spring+ Spring MVC +Mybatis 开发语言: JAVA 微信公众平台的开发中,微信只公布了一个基 ...

  3. WPF--模板选择

               典型的,把模板关联到一块特定的数据上,不过通常希望动态的确定使用哪个模板---既可以基于一个属性值,也可以是一个全局状态.当真正需要大规模替换模板时,也可以使用DataTempl ...

  4. Linux中用HttpWebRequest或WebClient访问远程https路径

    要想在Linux中用HttpWebRequest或WebClient访问远程https路径,需要作如下处理: 1,更新linux根证书(只需一次,在安装mono或安装jexus独立版后执行) sudo ...

  5. C#基础知识回顾:2.使用DbProviderFactory实现多数据库访问

    ADO.Net 2.0中,在System.Data.Common中引入了一系列抽象基类,使得开发人员能够在不依赖具体数据库操作的情况下进行编写数据访问代码,它们分别是DbConnection.DbCo ...

  6. thinkphp save() 跟新失败

    一.失败案例 $data = I(); $rs = $this->typeModel->data($data)->save(); 二.正确案例 正确一 $rs=$this->t ...

  7. [日常] Go语言圣经--复数,布尔值,字符串习题

    go语言圣经-复数 1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位.两种精度的复数类型:complex64和complex128,分别对应float3 ...

  8. [javaSE] 集合框架(体系概述)

    为什么出现集合类 为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式 数组和集合的不同 数组是固定长度的,集合是可变长度的 数组可以存储基本数据类型,集合只能存储对象 数组只能 ...

  9. Java学习第二篇 — 时间类的使用

    package DateTest; import java.util.Date; public class Date1 { public static void main(String[] args) ...

  10. BestCoder Round #29——A--GTY's math problem(快速幂(对数法))、B--GTY's birthday gift(矩阵快速幂)

    GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...