ElasticSearch-学习笔记04-复杂查询
- service
package com.huarui.service; import com.huarui.entity.SearchEntity;
import com.huarui.exection.JestExcetion;
import io.searchbox.client.JestResult;
import org.elasticsearch.index.query.QueryBuilder; import java.util.List; /**
* Created by lihui on 2019/1/30.
*/
public interface JestClientService { <T extends SearchEntity> JestResult index(T t, String indexKey) throws JestExcetion; JestResult delete(String id)throws JestExcetion; <T extends SearchEntity> T get(String id, Class<T> clazz) throws JestExcetion; JestResult deleteIndex() throws JestExcetion; /*********************我是分割线************************/ <T extends SearchEntity> JestResult indexBatch(List<T> t) throws JestExcetion; <T extends SearchEntity> List<T> pageSearch(int from, int size, QueryBuilder queryBuilder,Class<T> clazz)
throws JestExcetion; <T extends SearchEntity> List<T> search(QueryBuilder queryBuilder,Class<T> clazz) throws JestExcetion; Double count(QueryBuilder queryBuilder) throws JestExcetion; }
JestClientService.java
package com.huarui.service.impl; import com.huarui.entity.SearchEntity;
import com.huarui.exection.JestExcetion;
import com.huarui.service.JestClientService;
import com.sun.org.apache.bcel.internal.generic.NEW;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.*;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List; /**
* Created by lihui on 2019/1/30.
* JestClient 操作类
*/
@Service
public class JestClientServiceImpl implements JestClientService { private static Logger LOGGER = LoggerFactory.getLogger(JestClientServiceImpl.class); @Autowired
private JestClient jestClient; private String indexName = "test";//索引名称
private String indexType = "books";//文档类型 /**
* 创建索引
* @param t
* @param indexKey
* @param <T>
* @return
* @throws JestExcetion
*/
@Override
public <T extends SearchEntity> JestResult index(T t, String indexKey) throws JestExcetion{
JestResult jestResult = null;
Index index = new Index
.Builder(t)//文档
.index(indexName)//索引
.type(indexType)//文档类型
.id(indexKey)//key
.build();
try {
jestResult = jestClient.execute(index);
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return jestResult;
} /**
* 删除索引
* @param id
* @return
* @throws JestExcetion
*/
@Override
public JestResult delete(String id) throws JestExcetion{
JestResult jestResult = null;
Delete delete = new Delete.Builder(id)
.index(indexName)
.type(indexType)
.build();
try {
jestResult = jestClient.execute(delete);
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return jestResult;
} /**
* 查询索引
* @param id
* @param clazz
* @param <T>
* @return
* @throws JestExcetion
*/
@Override
public <T extends SearchEntity> T get(String id, Class<T> clazz) throws JestExcetion{
JestResult jestResult = null;
Get get = new Get.Builder(indexName, id)
.type(indexType)
.build();
try {
jestResult = jestClient.execute(get);
if (jestResult.isSucceeded()){
return jestResult.getSourceAsObject(clazz);
}
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return null;
} @Override
public JestResult deleteIndex() throws JestExcetion{
JestResult jestResult = null;
Delete delete = new Delete.Builder(indexName).build();
try {
jestResult = jestClient.execute(delete);
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return jestResult;
} /**
* 批量新增索引
* @param t
* @param <T>
* @return
* @throws JestExcetion
*/
@Override
public <T extends SearchEntity> JestResult indexBatch(List<T> t) throws JestExcetion {
JestResult jestResult = null;
Bulk.Builder bulk = new Bulk.Builder().defaultIndex(indexName).defaultType(indexType);
for (T obj : t) {
Index index = new Index.Builder(obj).build();
bulk.addAction(index);
}
try {
jestResult = jestClient.execute(bulk.build());
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return jestResult;
} /**
* 分页查询索引
* @param from 第一页
* @param size 每页几条
* @param queryBuilder 查询条件
* @param clazz
* @param <T>
* @return
* @throws JestExcetion
*/
@Override
public <T extends SearchEntity> List<T> pageSearch(int from, int size, QueryBuilder queryBuilder, Class<T> clazz) throws JestExcetion { List<T> books = null; SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from(from);
searchSourceBuilder.size(size);
searchSourceBuilder.query(queryBuilder); Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(indexName)
.addType(indexType)
.build();
try {
JestResult jestResult = jestClient.execute(search);
if (jestResult.isSucceeded()){
books = jestResult.getSourceAsObjectList(clazz);
}
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return books;
} @Override
public <T extends SearchEntity> List<T> search(QueryBuilder queryBuilder, Class<T> clazz) throws JestExcetion { List<T> books = null; SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder); Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(indexName)
.addType(indexType)
.build(); try {
JestResult jestResult = jestClient.execute(search);
if (jestResult.isSucceeded()){
books = jestResult.getSourceAsObjectList(clazz);
}
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
return books;
} @Override
public Double count(QueryBuilder queryBuilder) throws JestExcetion { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder); Count count = new Count.Builder()
.addIndex(indexName)
.addType(indexType)
.query(searchSourceBuilder.toString())
.build();
try {
CountResult results = jestClient.execute(count);
return results.getCount();
} catch (IOException e) {
LOGGER.info(e.getMessage());
throw new JestExcetion(e.getMessage());
}
} }
JestClientServiceImpl.java
- junt
package com.huarui.youxiu326; import com.huarui.entity.Book;
import com.huarui.exection.JestExcetion;
import com.huarui.service.JestClientService;
import com.huarui.service.impl.JestClientServiceImpl;
import io.searchbox.client.JestResult;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List; @RunWith(SpringRunner.class)
@SpringBootTest
public class ComplexSearchTest { private static Logger LOGGER = LoggerFactory.getLogger(ComplexSearchTest.class); @Autowired
private JestClientService jestService; /**
* 批量创建索引
* @throws JestExcetion
*/
@Test
public void testIndexBatch() throws JestExcetion { List<Book> books = new ArrayList<>();
for (int i=327;i<=337;i++){
Book book = new Book(i+"",new Date(),"youxiu"+i,"创建一个索引"+i,3.26F);
books.add(book);
}
JestResult jestResult = jestService.indexBatch(books);
if (jestResult.isSucceeded()){
LOGGER.info("创建成功");
}else{
LOGGER.info("创建失败");
} } /**
* Term 精准查询 并分页
* @throws JestExcetion
*/
@Test
public void testPageSearchUseTerm() throws JestExcetion {
int from = 0;
int size = 2;
//精确搜索
//TermQueryBuilder age = QueryBuilders.termQuery("code", "youxiu326");
//一次匹配多个值
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("code", Arrays.asList("youxiu326", "youxiu327", "youxiu328", "youxiu329", "youxiu330", "youxiu331"));
//匹配多个字段
QueryBuilders.multiMatchQuery("匹配值","name","code"); List<Book> books = jestService.pageSearch(from, size, termsQueryBuilder, Book.class);
if (books!=null && books.size()>0){
books.stream().forEach(it-> System.out.println(it));
}else{
LOGGER.info("未查询到匹配的数据");
} } /**
* Wildcard 通配符查询 并分页 (支持 *,避免* 开始避免检索大量内容造成效率缓慢)
* @throws JestExcetion
*/
@Test
public void testPageSearchUseWildcard() throws JestExcetion {
int from = 0;
int size = 2; WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("code", "youxiu*"); List<Book> books = jestService.pageSearch(from, size, wildcardQueryBuilder, Book.class);
if (books!=null && books.size()>0){
books.stream().forEach(it-> System.out.println(it));
}else{
LOGGER.info("未查询到匹配的数据");
}
} /**
* 区间搜索
* @throws JestExcetion
*/
@Test
public void testPageSearchUseRange() throws JestExcetion { RangeQueryBuilder RangeQueryBuilder = QueryBuilders.rangeQuery("price")
.from(0.9F)
.to(3.26F)
.includeLower(true) // 包含上界
.includeUpper(true); // 包含下界 List<Book> books = jestService.search(RangeQueryBuilder, Book.class);
if (books!=null && books.size()>0){
books.stream().forEach(it-> System.out.println(it));
}else{
LOGGER.info("未查询到匹配的数据");
}
} /**
* 组合查询
* must(QueryBuilders) : AND
* mustNot(QueryBuilders) : NOT
* should: : OR
* @throws JestExcetion
*/
@Test
public void testPageSearchUseBool() throws JestExcetion {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("code", "youxiu336"))
.mustNot(QueryBuilders.termQuery("name", "创建一个索引332"))
.should(QueryBuilders.termQuery("name", "创建一个索引337")); List<Book> books = jestService.search(boolQueryBuilder,Book.class);
if (books!=null && books.size()>0){
books.stream().forEach(it-> System.out.println(it));
}else{
LOGGER.info("未查询到匹配的数据");
} } /**
* count查询
* @throws JestExcetion
*/
@Test
public void testCount() throws JestExcetion { WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("code", "youxiu*");
Double count = jestService.count(wildcardQueryBuilder);
System.out.println("查询到"+count+"个"); } }
ElasticSearch-学习笔记04-复杂查询的更多相关文章
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- Elasticsearch学习笔记一
Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...
- elasticsearch学习笔记——相关插件和使用场景
logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格 ...
- ElasticSearch学习笔记(超详细)
文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- mybatis学习笔记(10)-一对一查询
mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...
- SaToken学习笔记-04
SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...
- 031 Spring Data Elasticsearch学习笔记---重点掌握第5节高级查询和第6节聚合部分
Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的 需要自己把对象序列化为json存储 查询到结果也需要自己 ...
随机推荐
- Pandas:plot相关函数
0.注意事项 及 各种错误 1)绘制bar图时,如果出现重复的x值被合并到一个情况(导致X轴应该显示内容有缺失),可能是由于Pandas版本太低: 2)无法设置中文title,在代码中加入两句话: p ...
- c# 去除TextBox的获取焦点事件
/// <summary> /// 去除TextBox的获取焦点事件 /// </summary> /// <param name="sender"& ...
- Ghost:凛冬散尽,长夜终明
你须领先于一切离别,仿佛它们全在你身后 像刚刚逝去的冬天 因为许多冬天中有一个无尽的冬天 使你过冬之心终究捱[ái]过 ...
- AT1219题解
题意 设 \(a\) 的价值为 \(a \times cnt_a\)(\(cnt_a\) 为 \(a\) 在区间中出现的次数),求区间种某种元素,使得这种元素的价值最大. 因为设计出现元素的次数,所以 ...
- python 关于heapq模块的随笔
heapq模块提供了很多高级功能可以通过help(heapq)查看详细文档: 要点: 1优先级队列让我们可以按照重要程度来处理元素,而不是先进先出 2使用heapq可以应对长列表,因为heap不是复杂 ...
- 使用Python 模拟RSA 加密与解密
一.关于 RSA具体原理请移步其他文章,本文主要使用Python 来模拟RSA 算法的实现过程 二.简要分析 在RSA算法中,存在以下几个参数: 1.大素数p.q 2.n = p *q 3.Phi_n ...
- 在Windows 10 上安装使用binwalk
Windows 10 推出的WSL 功能可以协助我们直接使用binwalk 分析Windows 内的文件 文章更新时间:2020年3月11日 一.WSL 准备 1.打开控制面板→程序和功能→启动或关闭 ...
- springcloud报错-Ribbon整合Eureka,出现 No instances available for XXX 异常
RestTemplate注入有问题 新版的需要这样注入: @Bean @LoadBalanced RestOperations restTemplate(RestTemplateBuilder bui ...
- js中的函数嵌套和闭包
小编已经有一段时间没有更新文章了,最近一直在考虑接下来要更新什么内容.接下来,小编会围绕以下三个方面更新文章.实际项目中遇到的问题和解决方案.Vue源码解析.代码重构.关于数据可视化.小编也会按照这个 ...
- Java基础——自动装箱与拆箱
装箱:把基本数据类型转换为对应的包装类类型 //装箱Integer i=Integer.ValuesOf(100);//自动装箱integer i1=100;//能够直接赋值成功的称为自动装箱,也调用 ...