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存储 查询到结果也需要自己 ...
随机推荐
- [系统安全] 十六.PE文件逆向基础知识(PE解析、PE编辑工具和PE修改)
[系统安全] 十六.PE文件逆向基础知识(PE解析.PE编辑工具和PE修改) 文章来源:https://masterxsec.github.io/2017/05/02/PE%E6%96%87%E4%B ...
- WCF学习笔记——Day1:一个WCF demo
Visual Studio2017,使用IIS托管.文中涉及一些WCF的基本概念,e.g.服务契约.托管等.可以先阅读<WCF服务编程>第一章. 1.新建一个WCF服务库(WCF Serv ...
- CVE-2022-22947 Spring Cloud Gateway SPEL RCE复现
目录 0 环境搭建 1 漏洞触发点 2 构建poc 3 总结 参考 0 环境搭建 影响范围: Spring Cloud Gateway 3.1.x < 3.1.1 Spring Cloud Ga ...
- 如何在win server中更改服务器密码长度最小值
转至:https://jingyan.baidu.com/article/3aed632e65c7843111809122.html windows server 2008是一种服务器的操作系统,有较 ...
- anaconda及jupyter notebook的使用之numpy模块的用法(2)
今日内容概要 numpy模块结束 ndarray创建 numpy内置方法 索引与切片(花式索引.布尔索引) 常用函数 统计方法 随机数 numpy的内置方法 import numpy as np 1. ...
- Linux CentOS7.X-安装mysql5.7数据库(安装包tar.gz)
一.下载对应版本的mysql 1.官网下载压缩安装包. 进入到mysql官网下载自己对应版本的mysql,下载地址:https://dev.mysql.com/downloads/mysql/5.7. ...
- winform中更新UI控件的方案介绍
这是一个古老的话题...直入主题吧! 对winfrom的控件来说,多线程操作非常容易导致复杂且严重的bug,比如不同线程可能会因场景需要强制设置控件为不同的状态,进而引起并发.加锁.死锁.阻塞等问题. ...
- laravel 7 H_ui ajax添加入库及前端jQuery Validate验证+后端验证
1:引入 H-ui 用户添加页面,并修改script对应的src,添加input框的name属性值 <!DOCTYPE HTML> <html> <head> &l ...
- Laravel 报错: Dotenv values containing spaces must be surrounded by quotes.
报错信息如下: 原因: .env文件配置中欧冠包含空格的配置信息,用双引号""引起来即可
- C++ STL vector扩容原理分析
扩容特点: 1)新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素: 2)对vector的 ...