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. ADNI数据和样例

    ADNI临床数据集: 由各个学科的临床信息组成,包括招募.人口统计特征.体格检查和认知评估数据 所收集的临床数据: 基因数据: ILLUMINA SNP基因分型检测 ADNI的一个关键目标就是为研究人 ...

  2. Spring-mvc登录方法及JSP的拦截

    添加登录拦截器:LoginInterceptor import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Htt ...

  3. (转)mssql sp_addextendedproperty 用法,作用

    sp_addextendedproperty [ @name = ] { 'property_name' } [ , [ @value = ] { 'value' } [ , [ @level0typ ...

  4. spring-bean实例化三种方式

    在spring中,bean的示例化有三种方式. 1.使用类的无参构造函数创建 2.使用静态工厂方式创建 3.使用实例化工厂方式创建. 具体代码如下 静态工厂方式: Bean2.java package ...

  5. 微信小程序 发现之旅(三)—— 组件之间的参数传递

    一.URL 传参 当使用 navigateTo() 方法跳转页面的时候,可以在 url 后面接 query 参数 然后在 Page 页面的生命周期函数 onLoad 中可以接收到这些参数 这种方式只能 ...

  6. 设计模式(16)--Iterator(迭代器模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 迭代模式又叫游标(Cursor)模式,是对象的行为模式.迭代模式可以顺序地访问一个聚集中的元素而不 ...

  7. vue-scroller记录滚动位置

    问题描述: 列表页进入详情页,或者tab页切换,然后再返回列表页,希望能切换到之前滚动位置 解决问题思路: 切换到其他页面前记录位置,返回列表页的时候返回位置.这就需要借助vue-router的bef ...

  8. 31:字符串p型编码

    31:字符串p型编码 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出s ...

  9. 【读书笔记】iOS-自定义视图的创建

    静态创建自定义视图就是以拖动的方法来创建. 动态创建自定义视图可以理解为使用代码来创建自定义视图. 参考资料:<iOS7开发快速入门>

  10. 在Ubuntu 14.04 LTS系统中设置Apache虚拟主机(一IP多访问)

    参考资料:http://os.51cto.com/art/201406/441909.htm