java使用elasticsearch进行模糊查询之must使用-项目中实际使用
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使用-项目中实际使用的更多相关文章
- java使用elasticsearch进行模糊查询-已在项目中实际应用
java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...
- java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...
- java操作elasticsearch实现条件查询(match、multiMatch、term、terms、reange)
1.条件match query查询 //条件查询match query @Test public void test10() throws UnknownHostException { //1.指定e ...
- Java数据库学习之模糊查询(like )
Java数据库学习之模糊查询(like ): 第一种方式:直接在SQL语句中进行拼接,此时需要注意的是parm在SQL语句中需要用单引号拼接起来,注意前后单引号之间不能空格 String sql = ...
- java操作elasticsearch实现聚合查询
1.max 最大值 //max 求最大值 @Test public void test30() throws UnknownHostException{ //1.指定es集群 cluster.name ...
- java之mybatis之模糊查询
1.在 mybatis 中,模糊查询可以有以下方式 (1).第一种,直接将封装好的条件传给 sql 语句 <select id="findByName" parameterT ...
- mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能
接着上一篇说,上一篇的TOPIC是写死的,然而在实际项目中要给不同用户 也就是不同的topic进行推送 所以要写活 package com.fh.controller.information.push ...
- elasticsearch的模糊查询
https://blog.csdn.net/a772304419/article/details/78951561
- java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用
java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...
随机推荐
- [转]MSSQL中利用TOP提高IF EXISTS查询语句的性能
本文转自:https://blog.csdn.net/f_r_e_e_x/article/details/51704784 --有可能返回一条或多个结果集,其实我们只需要知道是否 --有数据即可,这样 ...
- 在ASP.NET MVC应用程序中随机获取一个字符串
在开发ASP.NET MVC应用程序时,有可能需要一个随机字符串,作为密码或是验证码等. 如果你需要的是SQL版本,可以参考<密码需要带特殊字符(二)>http://www.cnblogs ...
- ADO.NET 【实体类】【数据访问类】
认识分层结构,分层式结构是最常见,也是最重要的一种结构. 三层架构(3-tier architecture) 界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回, ...
- thinkphp 网址后台典型页面
知识点: 1.select a提交后 返回选中项 选中项 value是id 但是要显示name b遍历和列举两种形式 <select name="class_id" clas ...
- Java集合类源码解析:LinkedHashMap
前言 今天继续学习关于Map家族的另一个类 LinkedHashMap .先说明一下,LinkedHashMap 是继承于 HashMap 的,所以本文只针对 LinkedHashMap 的特性学习, ...
- Spring Cloud学习笔记--Spring Boot初次搭建
1. Spring Boot简介 初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好.所以很久以来我的Spring学习都 ...
- WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错
WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错 当我们在客户端添 ...
- 用node.js模拟服务器和客户端
服务器 代码 var net = require("net") var server = net.createServer(); server.listen(12306," ...
- 从零开始学习html(十二)CSS布局模型——下
五.什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样, 每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧. ...
- 令人血脉喷张的animate.css
都说html5.css3是大局是潮流,尽管css3也不难,学起来比较简单,但我还是喜欢他的轻量级集大成者的animate.css框架,初学的小伙伴们加油啦 下面我分析一下animate.css框架里面 ...