• 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-复杂查询的更多相关文章

  1. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  2. Elasticsearch学习笔记一

    Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...

  3. elasticsearch学习笔记——相关插件和使用场景

    logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格 ...

  4. ElasticSearch学习笔记(超详细)

    文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...

  5. Redis:学习笔记-04

    Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...

  6. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  7. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)

    机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...

  8. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

  9. SaToken学习笔记-04

    SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...

  10. 031 Spring Data Elasticsearch学习笔记---重点掌握第5节高级查询和第6节聚合部分

    Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的 需要自己把对象序列化为json存储 查询到结果也需要自己 ...

随机推荐

  1. RHEL6搭建网络yum源仓库

    RHEL的更新包只对注册用户生效,所以需要自己手动改成Centos的更新包 一.查看rhel本身的yum安装包 rpm -qa | grep yum 二.卸载这些软件包 rpm -qa | grep ...

  2. c# $ @特殊字符

    c# @ 停止字符串中的转义字符,让字符串内的转义字符当正常字符输入. 因此,如果你需要类似"所见所得"效果的赋值,逐字字符串赋值方式会是你的首选!此外,需要注意的是,当使用符号 ...

  3. Oracle之非关系数据库

    什么是非关系型数据库? 非关系型数据库它的全称是Not Only SQL(简称 NoSQL数据库)是用于存储和检索数据的非关系数据库系统.在当今世界,我们不应该只以没有预定义固定模式的表格式存储所有数 ...

  4. js和C# 编码 解码

    C#中对URL编码的方法... 编码:Server.UrlEncode(string) 解码:Server.UrlDecode(string) HttpUtility.UrlEncode(string ...

  5. Windows原理深入学习系列-特权

    这是[信安成长计划]的第 21 篇文章 0x00 目录 0x01 介绍 0x02 结构分析 0x03 进程注入测试 0x04 参考文章 0x01 介绍 在 Token 当中还存在一个特别重要的内容-- ...

  6. 如何从头到脚彻底解决一个MySQL Bug

    摘要:为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例. 说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL. 华为云数据库新版本在发布之前,会 ...

  7. 【NLP】

  8. html2canvas滚动截图

    滚动截图 项目需求要进行动态的滚动截图搜索一下发现html2canvas可以实现截图,但是滚动截图网上搜罗了一遍发现不是很完善所以记录下 首先npm一下安装依赖: npm install html2c ...

  9. 关于SQL Server 各种安装失败均失败,报错“等待数据库引擎恢复句柄失败”的经验分享

    最近安装SQL 2019遇到这个问题,试过自己合网上几乎所有办法,怎么都安装不上,最后在微软社区解决了,由于这个问题比较特殊,并且网上几乎没有正确的决绝方案,因此将我的解决过程及经验记录分享一下,也为 ...

  10. pd.merge操作的on参数解释

    # 同时传入两个Key,此时会进行以['key1','key2']列表的形式进行对应,left的keys列表是:[['K0', 'K0'],['K0', 'K1'],['K1', 'K0'],['K2 ...