此处将为大家介绍关于Spring中的ElasticsearchHTTP认证的详细内容,并且为您解答有关spring.elasticsearch.rest.uris的相关问题,此外,我们还将为您介绍关于
此处将为大家介绍关于Spring中的Elasticsearch HTTP认证的详细内容,并且为您解答有关spring.elasticsearch.rest.uris的相关问题,此外,我们还将为您介绍关于006-spring-data-elasticsearch 3.0.0.0 使用【四】-spring-data 之 Elasticsearch Repositories、02. ElasticSearch (Spring Data ElasticSearch)、ElasticSearch (2)---SpringBoot 整合 ElasticSearch、ElasticSearch - 学习笔记 02-springboot 整合 jestclient 操作 elasticSearch的有用信息。
本文目录一览:- Spring中的Elasticsearch HTTP认证(spring.elasticsearch.rest.uris)
- 006-spring-data-elasticsearch 3.0.0.0 使用【四】-spring-data 之 Elasticsearch Repositories
- 02. ElasticSearch (Spring Data ElasticSearch)
- ElasticSearch (2)---SpringBoot 整合 ElasticSearch
- ElasticSearch - 学习笔记 02-springboot 整合 jestclient 操作 elasticSearch
Spring中的Elasticsearch HTTP认证(spring.elasticsearch.rest.uris)
如何解决Spring中的Elasticsearch HTTP认证?
Spring Data Elasticsearch基于官方的Elasticsearch Java客户端,该客户端使用二进制Transport协议(而不是像PHP那样的REST HTTP协议)。
如果您使用Shield保护Elasticsearch,则可以在Transport客户端/ Transport协议上设置用户/密码
TransportClient client = TransportClient.builder()
.addplugin(Shieldplugin.class)
.settings(Settings.builder()
.put("cluster.name", "yourcluster")
.put("shield.user", "youruser:yourpassword")
...
.build())
如果您不想使用Java代码中的HTTP协议,则可以使用社区客户端:
- 支持HTTP认证的Jest
- Elasticsearch HTTP这是很新的
但是这些解决方案与Spring Data不兼容
解决方法
我想访问受用户名和密码保护的远程Elasticsearch。https:// [用户名]:[密码] @ aws-eu-
west-1-portal1.dblayer.com:11109 /
在spring,使用XML配置,我能够访问我的本地主机弹性,如下所示
<!-- ElasticSearch -->
<elasticsearch:repositories base-package="be.smartsearch.service.repository.elasticsearch" />
<elasticsearch:transport-client id="esClient" cluster-nodes="localhost:9300" />
<bean id="elasticsearchTemplate">
<constructor-arg name="client" ref="esClient" />
</bean>
到目前为止,我发现的唯一有用的文档是关于PHP的:https :
//www.elastic.co/guide/en/elasticsearch/client/php-
api/current/_security.html
如何使用XML配置使用Spring数据中的凭据连接到远程Elasticsearh?
更新1
在Mongo中,我可以通过以下方法进行操作
<!-- Mongo -->
<mongo:mongo host="${mongo.host}" port="${mongo.port}"/>
<mongo:db-factory dbname="SmartSearchAfterDemo" mongo-ref="mongo" username="${mongo.user}" password="${mongo.password}"/>
<!--<mongo:db-factory dbname="${mongo.dbname}" mongo-ref="mongo"/> -->
<bean id="mongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>
<mongo:repositories base-package="be.smartsearch.service.repository.mongo"/>
006-spring-data-elasticsearch 3.0.0.0 使用【四】-spring-data 之 Elasticsearch Repositories
续
二、Elasticsearch Repositories
2.1、简介
2.1.1、Spring 命名空间
Spring Data Elasticsearch 模块包含一个允许定义存储库 bean 的自定义名称空间以及用于实例化 ElasticsearchServer 的元素。使用 repositories 元素查找 Spring Data 存储库
示例、使用名称空间设置 Elasticsearch 存储库


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:repositories base-package="com.acme.repositories" />
</beans>
使用传输客户端或节点客户端元素在上下文中注册 Elasticsearch 服务器的实例。
传输客户端使用命名空间


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:transport-client id="client" cluster-nodes="localhost:9300,someip:9300" />
</beans>
节点客户端使用命名空间


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:node-client id="client" local="true"" />
</beans>
2.1.2、基于注释的配置
Spring Data Elasticsearch 存储库支持不仅可以通过 XML 命名空间激活,还可以通过 JavaConfig 使用注释。
示例、使用 JavaConfig 激活 Elasticsearch 数据储存库


@Configuration
@EnableElasticsearchRepositories(basePackages = "org/springframework/data/elasticsearch/repositories")
static class Config {
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchTemplate(nodeBuilder().local(true).node().client());
}
}
上面的配置设置了 ElasticsearchTemplate 使用的嵌入式 Elasticsearch 服务器。Spring Data Elasticsearch Repositories 使用 @EnableElasticsearchRepositories 注释来激活,它本质上具有与 XML 名称空间相同的属性。如果没有配置基础软件包,它将使用配置类所在的软件包。
2.1.3、Elasticsearch 使用 CDI 进行存储
Spring Data Elasticsearch 存储库也可以使用 CDI 功能进行设置。
示例


class ElasticsearchTemplateProducer {
@Produces
@ApplicationScoped
public ElasticsearchOperations createElasticsearchTemplate() {
return new ElasticsearchTemplate(nodeBuilder().local(true).node().client());
}
}
class ProductService {
private ProductRepository repository;
public Page<Product> findAvailableBookByName(String name, Pageable pageable) {
return repository.findByAvailableTrueAndNameStartingWith(name, pageable);
}
@Inject
public void setRepository(ProductRepository repository) {
this.repository = repository;
}
}
2.2、查询方法
2.2.1、查询策略
Elasticsearch 模块支持所有基本的查询构建功能,如 String,Abstract,Criteria 或从方法名派生。
声明的查询
从方法名称派生查询并不总是足够的和 / 或可能导致不可读的方法名称。在这种情况下,可以使用 @Query 注解(请参阅使用 @Query 注释)。
2.2.2、query 创建
示例
public interface BookRepository extends Repository<Book, String>{
List<Book> findByNameAndPrice(String name, Integer price);
}
上面的方法名称将被转换为以下 Elasticsearch json 查询
{ "bool" :
{ "must" :
[
{ "field" : {"name" : "?"} },
{ "field" : {"price" : "?"} }
]
}
}
下面显示了 Elasticsearch 支持的关键字列表。
Keyword | Sample | Elasticsearch Query String |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.2.3、使用 @Query 注解
public interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")
Page<Book> findByName(String name,Pageable pageable);
}
三、其他 Elasticsearch 操作支持
无法通过存储库接口直接访问的 Elasticsearch 操作的额外支持。建议将这些操作添加为自定义实现,如 Spring Data 存储库的自定义实现中所述。
3.1、Filter Builder


private ElasticsearchTemplate elasticsearchTemplate;
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withFilter(boolFilter().must(termFilter("id", documentId)))
.build();
Page<SampleEntity> sampleEntities =
elasticsearchTemplate.queryForPage(searchQuery,SampleEntity.class);
3.2、使用 Scan And Scroll 查看大结果集
Elasticsearch 具有扫描和滚动功能,可以获取大块结果集。 ElasticsearchTemplate 具有可用于以下的扫描和滚动方法。


SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withIndices("test-index")
.withTypes("test-type")
.withPageable(new PageRequest(0,1))
.build();
String scrollId = elasticsearchTemplate.scan(searchQuery,1000,false);
List<SampleEntity> sampleEntities = new ArrayList<SampleEntity>();
boolean hasRecords = true;
while (hasRecords){
Page<SampleEntity> page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultsMapper<SampleEntity>()
{
@Override
public Page<SampleEntity> mapResults(SearchResponse response) {
List<SampleEntity> chunk = new ArrayList<SampleEntity>();
for(SearchHit searchHit : response.getHits()){
if(response.getHits().getHits().length <= 0) {
return null;
}
SampleEntity user = new SampleEntity();
user.setId(searchHit.getId());
user.setMessage((String)searchHit.getSource().get("message"));
chunk.add(user);
}
return new PageImpl<SampleEntity>(chunk);
}
});
if(page != null) {
sampleEntities.addAll(page.getContent());
hasRecords = page.hasNextPage();
}
else{
hasRecords = false;
}
}
}
整体 spring 配置参看
02. ElasticSearch (Spring Data ElasticSearch)
1. 概述
-
Spring Data Elasticsearch 对原生的 Elasticsearch 简化
-
特点:
- 基于Configuration配置,只要在yml文件中配置,项目就可以使用
- 工具类 ElasticsearchTemplate ES模板,类似于通用mapper,通过对象操作ES
- 提供持久层接口 Repository,无需编写基本操作代码(类似于mybatis,根据接口自动得到实现),也支持自定义查询
2. 环境搭建
-
步骤一: 修改pom.xml文件,导入坐标
-
步骤二: 修改yml文件,添加Elasticsearch配置信息
-
步骤三: 创建一个配置类,项目启动时时,设置一个参数,防止运行时异常
-
步骤四: 编写测试方法
-
步骤一: 修改pom.xml文件,导入坐标
<dependencies> <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!--测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>com.czxy</groupId> <artifactId>changgou_common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--es--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> </dependencies>
-
步骤二: 修改yml文件,添加Elasticsearch配置信息
spring: redis: database: 1 #确定使用库 host: 127.0.0.1 #redis服务地址 port: 6379 #redis 端口号 data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 127.0.0.1:9300
-
步骤三: 创建一个配置类,项目启动时时,设置一个参数,防止运行时异常
package com.czxy.config; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; /** * Created by Pole丶逐. */ @Configuration public class ESConfig { /** * 项目启动时,设置一个参数 */ @PostConstruct public void init() { System.setProperty("es.set.netty.runtime.available.processors", "false"); } }
-
步骤四: 编写测试方法
package com.czxy.test; import com.czxy.TestApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; /** * [@Author](https://my.oschina.net/arthor) Pole丶逐 * [@Date](https://my.oschina.net/u/2504391) 2020/4/13 20:39 * [@E-mail](https://my.oschina.net/rosolio) */ @RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class) public class Demo01 { @Test public void test(){ System.out.println("AAA"); } }
3. 索引操作
3.1 创建映射类
-
映射类: 用于表示java数据和Elasticsearch中数据对应关系.在Spring Data Elasticsearch使用注解完成
名称 修饰位置 参数 @Document 表示java数据和Elasticsearch中数据对应关系 indexName: 对应索引名称<br/>type: 对应索引库中的类型 <br/>shards: 分片数量 <br/>replicas: 副本数量 @Id 唯一标识 无 @Field java属性和es字段的对应关系 type: 字段类型<br/>analyzer: 分词器名称<br/>index: 是否索引,默认为true<br/>store: 是否存储,默认为false -
实现类:
package com.czxy.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; /** * @Author Pole丶逐 * @Date 2020/4/13 20:55 * @E-mail */ @NoArgsConstructor @AllArgsConstructor @Data @Document(indexName = "czxy56",type = "book",shards = 4,replicas = 2) public class ESBook { @Id private Long id; @Field(type = FieldType.Text,analyzer = "ik_max_word") private String title; @Field(type = FieldType.Keyword) private String images; @Field(type = FieldType.Float) private Double price; }
3.2 创建索引,添加映射,删除索引
-
ElasticsearchTemplate工具类提供对应方法完成以下功能
-
步骤一: 直接注入ElasticsearchTemplate,spring容器中自动创建
-
步骤二: 调用对应API操作
package com.czxy.test; import com.czxy.TestApplication; import com.czxy.vo.ESBook; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** * @Author Pole丶逐 * @Date 2020/4/13 21:00 * @E-mail */ @RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class) public class TestES { @Resource private ElasticsearchTemplate elasticsearchTemplate; @Test public void test1(){ // 创建索引 elasticsearchTemplate.createIndex(ESBook.class); } @Test public void test2(){ //创建映射 elasticsearchTemplate.putMapping(ESBook.class); } @Test public void test3(){ //删除索引 elasticsearchTemplate.deleteIndex(ESBook.class); } }
4. 文档操作(增删改)
-
实现接口: ElasticsearchRepository,实现了所有功能
-
只需要继承 **ElasticsearchRepository **接口即可,Spring Data 自动加载
-
参数类型: 泛型
-
第一个: 映射类(ESBook)
-
第二个: 映射类唯一标识的类型(Id)
package com.czxy.repository; import com.czxy.vo.ESBook; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import java.util.List; /** * @Author Pole丶逐 * @Date 2020/4/13 21:15 * @E-mail */ public interface ESBookRepository extends ElasticsearchRepository<ESBook,Long> { }
-
4.1 添加数据
方法名 | 描述 |
---|---|
save() | 添加一个数据 |
saveAll() | 添加一组数据 |
package com.czxy.test;
import com.czxy.TestApplication;
import com.czxy.repository.ESBookRepository;
import com.czxy.vo.ESBook;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
/**
* @Author Pole丶逐
* @Date 2020/4/13 21:14
* @E-mail
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class TestESData {
@Resource
private ESBookRepository esBookRepository;
@Test
public void test1(){
//添加一个数据
esBookRepository.save(new ESBook(1L,"时间简史","01.jpg",35.0));
}
@Test
public void test2(){
ArrayList<ESBook> eslist = new ArrayList<>();
eslist.add(new ESBook(1L,"时间简史","01.jpg",35.0));
eslist.add(new ESBook(2L,"三体","02.jpg",40.0));
eslist.add(new ESBook(3L, "人类简史","03.jpg",35.5));
//添加一个集合
esBookRepository.saveAll(eslist);
}
}
4.2 修改数据
-
修改和添加使用的是一个方法
- 如果id存在则为修改
- 如果id不存在则为添加
@Test public void test1(){ //修改数据,id必须存在,否则为添加 esBookRepository.save(new ESBook(1L,"空间简史","01.jpg",35.0)); }
4.2 删除数据
@Test
public void test3(){
// 根据对象删除
//esBookRepository.delete();
// 根据id删除
//esBookRepository.deleteById(1L);
// 删除所有
//esBookRepository.deleteAll();
}
5. 查询
5.1 基本查询
方法 | 描述 |
---|---|
findAll() | 查询所有 |
findById() | 根据id查询 |
@Test
public void test4(){
//查询所有
Iterable<ESBook> iterable = esBookRepository.findAll();
Iterator<ESBook> iterator = iterable.iterator();
while (iterator.hasNext()){
ESBook esBook = iterator.next();
System.out.println(esBook);
}
}
@Test
public void test5(){
//根据id查询
Optional<ESBook> optional = esBookRepository.findById(1L);
ESBook esBook = optional.get();
System.out.println(esBook);
}
5.2 自定义方法
-
Spring Data 根据约定的方法名进行自动查询
- 要求: findBy字段 | 关键字
-
实例:
package com.czxy.repository; import com.czxy.vo.ESBook; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import java.util.List; /** * @Author Pole丶逐 * @Date 2020/4/13 21:15 * @E-mail */ public interface ESBookRepository extends ElasticsearchRepository<ESBook,Long> { //根据title查询 List<ESBook> findByTitle(String title); //根据price查询区间 List<ESBook> findByPriceBetween(Double start, Double end); //查询大于等于price List<ESBook> findByPriceGreaterThanEqual(Double price); }
5.3 自定义查询
5.3.1 关键字查询: match
-
查询条件构造器: NativeSearchQueryBuilder
-
查询: queryBuilder.withQuery( ... )
-
match条件: QueryBuilders.matchQuery("字段","值")
-
查询: esBookRepository.search( 条件 )
-
返回值: Page,容器,可以直接遍历获取数据
package com.czxy.test; import com.czxy.TestApplication; import com.czxy.repository.ESBookRepository; import com.czxy.vo.ESBook; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** * @Author Pole丶逐 * @Date 2020/4/14 15:55 * @E-mail */ @RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class) public class TestData { @Resource private ESBookRepository esBookRepository; @Test public void test1(){ //创建条件构造器器 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); //把条件查询match放到查询条件中 queryBuilder.withQuery(QueryBuilders.matchQuery("title","简史")); //创建构造对象并查询 Page<ESBook> page = esBookRepository.search(queryBuilder.build()); System.out.println("总条数: " + page.getTotalElements()); System.out.println("总页数: " + page.getTotalPages()); for (ESBook esBook : page) { System.out.println(esBook); } } }
5.3.2 多条件查询: bool -- must/mustNot(交集)
-
多条件拼凑: BoolQueryBuilder对象
- QueryBuilders.boolQuery()
-
并集操作: must()/mustNot()
@Test public void test2(){ // 创建条件查询构建器 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 获得bool查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 拼接查询条件 boolQueryBuilder.must(QueryBuilders.matchQuery("title","简史")); boolQueryBuilder.mustNot(QueryBuilders.matchQuery("title","时间")); // 把条件放入查询条件中 queryBuilder.withQuery(boolQueryBuilder); // 构建对象并查询 Page<ESBook> page = esBookRepository.search(queryBuilder.build()); // 循环遍历 page.forEach( esBook -> { System.out.println(esBook); }); }
5.3.3 多条件查询: bool -- should (并集)
-
交集操作: boolQueryBuilder.should()
@Test public void test3(){ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.should(QueryBuilders.matchQuery("title","人类")); boolQueryBuilder.should(QueryBuilders.matchQuery("title","简史")); queryBuilder.withQuery(boolQueryBuilder); Page<ESBook> page = esBookRepository.search(queryBuilder.build()); page.forEach( esBook -> { System.out.println(esBook); }); }
5.3.4 精准查询: term
-
精准查询: QueryBuilders.termQuery( 字段,值 )
@Test public void test4(){ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withQuery(QueryBuilders.termQuery("title","简史")); Page<ESBook> page = esBookRepository.search(queryBuilder.build()); page.forEach(esBook -> { System.out.println(esBook); }); }
5.3.5 区间查询: range
-
区间查询: QueryBuilders.rangeQuery( 字段 )
- lt(): 小于
- lte(): 小于等于
- gt(): 大于
- gte(): 大于等于
@Test public void test5(){ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withQuery(QueryBuilders.rangeQuery("price").gte(35.5).lte(40.0)); Page<ESBook> page = esBookRepository.search(queryBuilder.build()); page.forEach(esBook -> { System.out.println(esBook); }); }
5.3.6 分页查询:
-
分页查询: queryBuilder.withPageable()
- 分页工具类: PageRequest.of(pageNum,pageSIze)
@Test public void test6(){ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withPageable(PageRequest.of(1,2)); Page<ESBook> page = esBookRepository.search(queryBuilder.build()); page.forEach(esBook -> { System.out.println(esBook); }); }
5.3.7 排序查询:
-
排序查询: queryBuilder.withSort()
- 排序工具类: SortBuilders.fieldSort(排序字段)
- 排序方式: order(SortOrder.DESC | SortOrder.ASC)
@Test public void test7(){ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC)); Page<ESBook> page = esBookRepository.search(queryBuilder.build()); page.forEach(esBook -> { System.out.println(esBook); }); }
6. 总结
- 查询条件构造器: NativeSearchQueryBuilder
- 查询条件: queryBuilder.withQuery()
- 分页条件: queryBuilder.withPageable()
- 排序条件: queryBuilder.withSort()
- 构造: build()
- 查询条件,通过工具类QueryBuilders 获得
- 关键字查询: matchQuery(字段,值)
- 多条件查询: boolQuery()
- 必须有: must()
- 必须没有; mustNot()
- 并集: should()
- 精准查询: termQuery(字段,值)
- 区间查询: rangeQuery(字段)
- 大于: gt()
- 大于等于: gte()
- 小于: lt()
- 小于等于: lte()
- 分页条件: 工具类PageRequest
- 设置分页参数: PageRequest.of(pageNum,pageSize)
- 排序字段,通过工具类SortBuilders
- 排序字段: SortBuilders.fieldSort("字段")
- 排序方式: order(SortOrder.DESC | SortOrder.ASC)
- 查询结果: Page对象
- 总条数: getTotalElements()
- 总页数: getTotalPages()
- 第几页: getNumber()
- 每页个数: getSize()
- 过得内容: getContent()
- Page 对象可以直接遍历
ElasticSearch (2)---SpringBoot 整合 ElasticSearch
SpringBoot 整合 ElasticSearch
一、基于 spring-boot-starter-data-elasticsearch 整合
开发环境:springboot 版本:2.0.1,elasticSearch-5.6.8.jar 版本:5.6.8,服务器部署 ElasticSearch 版本:6.3.2
1、application.properties
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true
2、pom.xml
<!--spring整合elasticsearch包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!--实体工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--集合工具包-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
3、Notice 实体
@Data
@AllArgsConstructor
@NoArgsConstructor
//indexName代表所以名称,type代表表名称
@Document(indexName = "wantu_notice_info", type = "doc")
public class Notice {
//id
@JsonProperty("auto_id")
private Long id;
//标题
@JsonProperty("title")
private String title;
//公告标签
@JsonProperty("exchange_mc")
private String exchangeMc;
//公告发布时间
@JsonProperty("create_time")
private String originCreateTime;
//公告阅读数量
@JsonProperty("read_count")
private Integer readCount;
}
4、NoticeRepository 类
import com.jincou.elasearch.domain.Notice;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
@Component
public interface NoticeRepository extends ElasticsearchRepository<Notice, Long> {
}
5、NoticeController
@RestController
@RequestMapping("/api/v1/article")
public class NoticeController {
@Autowired
private NoticeRepository nticeRepository;
@GetMapping("save")
public CommandResult<Void> save(long id, String title){
Notice article = new Notice();
article.setId(id);
article.setReadCount(123);
article.setTitle("springboot整合elasticsearch,这个是新版本 2018年");
nticeRepository.save(article);
return CommandResult.ofSucceed();
}
/**
* @param title 搜索标题
* @param pageable page = 第几页参数, value = 每页显示条数
*/
@GetMapping("search")
public CommandResult<List<Notice>> search(String title,@PageableDefault(page = 1, value = 10) Pageable pageable){
//按标题进行搜索
QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", title);
//如果实体和数据的名称对应就会自动封装,pageable分页参数
Iterable<Notice> listIt = nticeRepository.search(queryBuilder,pageable);
//Iterable转list
List<Notice> list= Lists.newArrayList(listIt);
return CommandResult.ofSucceed(list);
}
}
6、查看运行结果
它会进行中文分词查询,然后安装相识度进行排序
总体步骤还是蛮清晰简单的,因为有 spring-boot-starter-data-elasticsearch 进行了整合,所以我们可以少敲很多代码。
二、 基于 TransportClient 整合
首先明白:如果项目 SpringBoot1.5.X 以下的,那么 elasticSearch.jar 最高是 2.4.4 版本的,只有 SpringBoot2.X+,elasticSearch.jar 才是 5.X+
如果你的 SpringBoot 是 1.5.X 以下,那你又想用 elasticSearch.jar5.X + 怎么办呢,那就不要用 spring-boot-starter-data-elasticsearch,用原生的 TransportClient 实现即可。
这个相当于用原生的去使用 elasticsearch, 这里面并没有用到 spring-boot-starter-data-elasticsearch 相关 jar 包,因为我们公司的 springBoot 版本是 1.5.9。
如果用 spring-boot-starter-data-elasticsearch 的话,那么 elasticsearch 版本最高只有 2.4.4,这也太落后了,现在 elasticsearch 已经到 6.3.2 了,为了用更好的版本有两个方案:
1、提高 springboot 版本到 2.X(不过不现实,船大难掉头),2、用原生的 TransportClient 实现。最终落地实现是通过 TransportClient 实现
把关键代码展示出来。
1、pom.xml
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
2、创建实体
@Configuration
public class ServerModule {
@Bean
public TransportClient transportClient() {
Settings settings = Settings.builder().put("cluster.name", "biteniuniu").build();
//我用6.3.2版本的时候这里一直报异常说找不到InetSocketTransportAddress类,这应该和jar有关,当我改成5.6.8就不报错了
TransportClient client = new PreBuiltTransportClient(settings);//6.3.2这里TransportAddress代替InetSocketTransportAddress
client.addTransportAddress(new InetSocketTransportAddress(
new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300)));
return client;
}
}
3、NoticeController 类
@RestController
@RequestMapping("/api/v1/notice")
public class NoticeController {
@Autowired
private TransportClient transportClient;
/**
*利用TransportClient实现搜索功能
* @param title 搜索标题
* @param page = 从第几条结果返回 | Integer(比如一次size=20,page=0,如果要显示下一页20条记录则需要size=20,page=20)这个和之前有点区别, size = 每页显示条数
*/
@RequestMapping(value = "trsearch", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public CommandResult<List<Notice>> search(@RequestParam(value = "title", defaultValue = "比特币")String title, @RequestParam(value = "page", defaultValue = "0")Integer page,
@RequestParam(value = "size", defaultValue = "20")Integer size) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//按标题进行查找
boolQueryBuilder.must(QueryBuilders.matchQuery("title", title));
//在这里输入索引名称和type类型
SearchResponse response = transportClient.prepareSearch("wantu_notice_info").setTypes("doc")
// 设置查询类型java
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
// 设置查询关键词
.setQuery(boolQueryBuilder)
// 设置查询数据的位置,分页用
.setFrom(page)
// 设置查询结果集的最大条数
.setSize(size)
// 设置是否按查询匹配度排序
.setExplain(true)
// 最后就是返回搜索响应信息
.get();
SearchHits searchHits = response.getHits();
List<Notice> list = Lists.newArrayListWithCapacity(size);
for (SearchHit searchHit : searchHits) {
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
//获得titie数据
String titles = (String) sourceAsMap.get("title");
//获得阅读量数据
Integer readCount = (Integer) sourceAsMap.get("read_count");
//把数据装入对象中
Notice notice=new Notice();
notice.setTitle(titles);
notice.setReadCount(readCount);
list.add(notice);
}
return CommandResult.ofSucceed(list);
}
}
4、运行结果
总结下:第一种整合相对简单很多,因为本身封装很多东西,比如分页,封装数据等。第二种的话可以在不用 spring 的情况下使用它。
我只是偶尔安静下来,对过去的种种思忖一番。那些曾经的旧时光里即便有过天真愚钝,也不值得谴责。毕竟,往后的日子,还很长。不断鼓励自己,
天一亮,又是崭新的起点,又是未知的征程(上校 4)
ElasticSearch - 学习笔记 02-springboot 整合 jestclient 操作 elasticSearch


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.16.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.huarui</groupId>
<artifactId>sb_elasticsearch_jestclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sb_elasticsearch_jestclient</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.7</version>
</dependency>
spring.elasticsearch.jest.uris = http://192.168.79.129:9200/
spring.elasticsearch.jest.read-timeout = 10000
spring.elasticsearch.jest.username =
spring.elasticsearch.jest.password =
junit
import com.huarui.entity.User;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.*;
import io.searchbox.indices.CreateIndex;
import io.searchbox.indices.DeleteIndex;
import io.searchbox.indices.mapping.GetMapping;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticApplicationTests {
private static String indexName = "userindex";
private static String typeName = "user";
@Autowired
JestClient jestClient;
/**
* 新增数据
* @return
* @throws Exception
*/
@Test
public void insert() throws Exception {
User user = new User(1L, "张三", 20, "张三是个Java开发工程师","2018-4-25 11:07:42");
Index index = new Index.Builder(user).index(indexName).type(typeName).build();
try{
JestResult jr = jestClient.execute(index);
System.out.println(jr.isSucceeded());
}catch(IOException e){
e.printStackTrace();
}
}
}
关于Spring中的Elasticsearch HTTP认证和spring.elasticsearch.rest.uris的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于006-spring-data-elasticsearch 3.0.0.0 使用【四】-spring-data 之 Elasticsearch Repositories、02. ElasticSearch (Spring Data ElasticSearch)、ElasticSearch (2)---SpringBoot 整合 ElasticSearch、ElasticSearch - 学习笔记 02-springboot 整合 jestclient 操作 elasticSearch的相关信息,请在本站寻找。
本文标签: