{“id”:3,“name”:“王五”,“age”:25,“description”:“王五是个运维工程师”,“createtm”:“2016-8-21 06:11:32”}
进行全文查询请求
进行全文查询请求
http://localhost:8086/api/user?searchContent=工程师
返回
[{“id”:2,“name”:“李四”,“age”:14,“description”:“李四是个测试工程师”,“createtm”: “1980-2-15 19:01:32”},
{“id”:1,“name”:“张三”,“age”:20,“description”:“张三是个Java开发工程师”, “createtm”: “2018-4-25 11:07:42”},
{“id”:3,“name”:“王五”,“age”:25,“description”:“王五是个运维工程师”,“createtm”: “2016-8-21 06:11:32”}]
进行分页查询请求
http://localhost:8086/api/user?pageNumber=0&pageSize=2&searchContent=工程师
返回
[{“id”:2,“name”:“李四”,“age”:14,“description”:“李四是个测试工程师”},{“id”:1,“name”:“张三”,“age”:20,“description”:“张三是个Java开发工程师”}]
进行权重查询请求
http://localhost:8086/api/user2?searchContent=李四
返回
[{“id”:2,“name”:“李四”,“age”:24,“description”:“李四是个测试工程师”,“createtm”:“1980-2-15 19:01:32”}]
权重查询打印的语句:
查询的语句:{{
“function_score” : {
“functions” : [ {
“filter” : {
“bool” : {
“should” : {
“match” : {
“name” : {
“query” : “李四”,
“type” : “boolean”
}
}
}
}
},
“weight” : 10.0
}, {
“filter” : {
“bool” : {
“should” : {
“match” : {
“description” : {
“query” : “李四”,
“type” : “boolean”
}
}
}
}
},
“weight” : 100.0
} ],
“min_score” : 2.0
}
}
注:测试中,因为设置了setMinScore最小权重分为2的,所以无关的数据是不会显示出来的。如果想显示的话,在代码中去掉即可。
新增完数据之后,可以在浏览器输入:http://localhost:9200/_plugin/head/ 然后点击基本查询,便可以查看添加的数据。如果想用语句查询,可以将程序中控制台打印的查询语句粘贴到查询界面上进行查询!
注:这里的ElasticSearch是我在windows上安装的,并安装了ES插件head,具体安装步骤在文章末尾。
除了SpringData之外,其实还有其它的方法操作ElasticSearch的。比如使用原生ElasticSearch的Api,使用TransportClient类实现。或者使用由Spring封装,只需在Service层,进行注入Bean即可。示例:
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
但是,上述方法中都有其局限性,也就是随着ElasticSearch的版本变更,相关的Java API也在做不断的调整,就是ElasticSearch服务端版本进行更改之后,客户端的代码可能需要重新编写。因此介绍一个相当好用的第三方工具JestClient,它对ElasticSearch进行封装,填补了 ElasticSearch HttpRest接口 客户端的空白,它适用于ElasticSearch2.x以上的版本,无需因为ElasticSearch服务端版本更改而对代码进行更改!
JestClient
首先在Maven中添加如下依赖:
io.searchbox jest 5.3.3然后编写相关的测试代码。代码中的注释应该很完整,所以这里就不再对代码过多的讲述了。
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import com.pancm.pojo.User;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.JestResult;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.core.Bulk;
import io.searchbox.core.BulkResult;
import io.searchbox.core.Delete;
import io.searchbox.core.DocumentResult;
import io.searchbox.core.Index;
import io.searchbox.core.Search;
import io.searchbox.indices.CreateIndex;
import io.searchbox.indices.DeleteIndex;
import io.searchbox.indices.mapping.GetMapping;
import io.searchbox.indices.mapping.PutMapping;
public class JestTest {
private static JestClient jestClient;
private static String indexName = “userindex”;
// private static String indexName = “userindex2”;
private static String typeName = “user”;
private static String elasticIps=“http://192.169.2.98:9200”;
// private static String elasticIps=“http://127.0.0.1:9200”;
public static void main(String[] args) throws Exception {
jestClient = getJestClient();
insertBatch();
serach1();
serach2();
serach3();
jestClient.close();
}
private static JestClient getJestClient() {
JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(new HttpClientConfig.Builder(elasticIps).connTimeout(60000).readTimeout(60000).multiThreaded(true).build());
return factory.getObject();
}
public static void insertBatch() {
List objs = new ArrayList();
objs.add(new User(1L, “张三”, 20, “张三是个Java开发工程师”,“2018-4-25 11:07:42”));
objs.add(new User(2L, “李四”, 24, “李四是个测试工程师”,“1980-2-15 19:01:32”));
objs.add(new User(3L, “王五”, 25, “王五是个运维工程师”,“2016-8-21 06:11:32”));
boolean result = false;
try {
result = insertBatch(jestClient,indexName, typeName,objs);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(“批量新增:”+result);
}
/**
- 全文搜索
*/
public static void serach1() {
String query =“工程师”;
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.queryStringQuery(query));
//分页设置
searchSourceBuilder.from(0).size(2);
System.out.println(“全文搜索查询语句:”+searchSourceBuilder.toString());
System.out.println(“全文搜索返回结果:”+search(jestClient,indexName, typeName, searchSourceBuilder.toString()));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
- 精确搜索
*/
public static void serach2() {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery(“age”, 24));
System.out.println(“精确搜索查询语句:”+searchSourceBuilder.toString());
System.out.println(“精确搜索返回结果:”+search(jestClient,indexName, typeName, searchSourceBuilder.toString()));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
- 区间搜索
*/
public static void serach3() {
String createtm=“createtm”;
String from=“2016-8-21 06:11:32”;
String to=“2018-8-21 06:11:32”;
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.rangeQuery(createtm).gte(from).lte(to));
System.out.println(“区间搜索语句:”+searchSourceBuilder.toString());
System.out.println(“区间搜索返回结果:”+search(jestClient,indexName, typeName, searchSourceBuilder.toString()));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
- 创建索引
- @param indexName
- @return
- @throws Exception
*/
public boolean createIndex(JestClient jestClient,String indexName) throws Exception {
JestResult jr = jestClient.execute(new CreateIndex.Builder(indexName).build());
return jr.isSucceeded();
}
/**
- 新增数据
- @param indexName
- @param typeName
- @param source
- @return
- @throws Exception
*/
public boolean insert(JestClient jestClient,String indexName, String typeName, String source) throws Exception {
PutMapping putMapping = new PutMapping.Builder(indexName, typeName, source).build();
JestResult jr = jestClient.execute(putMapping);
return jr.isSucceeded();
}
/**
- 查询数据
- @param indexName
- @param typeName
- @return
- @throws Exception
*/
public static String getIndexMapping(JestClient jestClient,String indexName, String typeName) throws Exception {
GetMapping getMapping = new GetMapping.Builder().addIndex(indexName).addType(typeName).build();
JestResult jr =jestClient.execute(getMapping);
return jr.getJsonString();
}
/**
- 批量新增数据
- @param indexName
- @param typeName
- @param objs
- @return
- @throws Exception
*/
public static boolean insertBatch(JestClient jestClient,String indexName, String typeName, List objs) throws Exception {
Bulk.Builder bulk = new Bulk.Builder().defaultIndex(indexName).defaultType(typeName);
for (Object obj : objs) {
Index index = new Index.Builder(obj).build();
bulk.addAction(index);
}
BulkResult br = jestClient.execute(bulk.build());
return br.isSucceeded();
}
/**
- 全文搜索
- @param indexName
- @param typeName
- @param query
- @return
- @throws Exception
*/
public static String search(JestClient jestClient,String indexName, String typeName, String query) throws Exception {
Search search = new Search.Builder(query)
.addIndex(indexName)
.addType(typeName)
.build();
JestResult jr = jestClient.execute(search);
// System.out.println(“–”+jr.getJsonString());
// System.out.println(“–”+jr.getSourceAsObject(User.class));
return jr.getSourceAsString();
}
/**
- 删除索引
- @param indexName
- @return
- @throws Exception
*/
public boolean delete(JestClient jestClient,String indexName) throws Exception {
JestResult jr = jestClient.execute(new DeleteIndex.Builder(indexName).build());
return jr.isSucceeded();
}
/**
- 删除数据
- @param indexName
- @param typeName
- @param id
- @return
- @throws Exception
*/
public boolean delete(JestClient jestClient,String indexName, String typeName, String id) throws Exception {
DocumentResult dr = jestClient.execute(new Delete.Builder(id).index(indexName).type(typeName).build());
return dr.isSucceeded();
}
注:测试之前先说明下,本地windows系统安装的是ElasticSearch版本是2.3.5,linux服务器上安装的ElasticSearch版本是6.2。
测试结果
全文搜索
全文搜索查询语句:{
“from” : 0,
“size” : 2,
“query” : {
“query_string” : {
“query” : “工程师”
}
}
}
全文搜索返回结果:{“id”:1,“name”:“张三”,“age”:20,“description”:“张三是个Java开发工程师”,“createtm”:“2018-4-25 11:07:42”},{“id”:2,“name”:“李四”,“age”:24,“description”:“李四是个测试工程师”,“createtm”:“1980-2-15 19:01:32”}
匹配搜索
匹配搜索
精确搜索查询语句:{
“query” : {
“term” : {
“age” : 24
}
}
}
精确搜索返回结果:{“id”:2,“name”:“李四”,“age”:24,“description”:“李四是个测试工程师”,“createtm”:“1980-2-15 19:01:32”}
Spring全套教学资料
Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。
目录:
部分内容:
Spring源码
- 第一部分 Spring 概述
- 第二部分 核心思想
- 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
- 第四部分 Spring IOC 高级应用
基础特性
高级特性 - 第五部分 Spring IOC源码深度剖析
设计优雅
设计模式
注意:原则、方法和技巧 - 第六部分 Spring AOP 应用
声明事务控制 - 第七部分 Spring AOP源码深度剖析
必要的笔记、必要的图、通俗易懂的语言化解知识难点
脚手框架:SpringBoot技术
它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。
Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。
- SpringBoot入门
- 配置文件
- 日志
- Web开发
- Docker
- SpringBoot与数据访问
- 启动配置原理
- 自定义starter
微服务架构:Spring Cloud Alibaba
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
- 微服务架构介绍
- Spring Cloud Alibaba介绍
- 微服务环境搭建
- 服务治理
- 服务容错
- 服务网关
- 链路追踪
- ZipKin集成及数据持久化
- 消息驱动
- 短信服务
- Nacos Confifig—服务配置
- Seata—分布式事务
- Dubbo—rpc通信
Spring MVC
目录:
部分内容:
- 链路追踪
- ZipKin集成及数据持久化
- 消息驱动
- 短信服务
- Nacos Confifig—服务配置
- Seata—分布式事务
- Dubbo—rpc通信
[外链图片转存中…(img-oCKCSZc7-1721834537832)]
[外链图片转存中…(img-RvvbQAK9-1721834537832)]
Spring MVC
目录:
[外链图片转存中…(img-ZdqHmkrT-1721834537832)]
[外链图片转存中…(img-zX2Wp8hR-1721834537833)]
[外链图片转存中…(img-1Jo3KFO7-1721834537833)]
部分内容:
[外链图片转存中…(img-AdxIFLwu-1721834537833)]
[外链图片转存中…(img-kc0bcv4n-1721834537833)]