GVKun编程网logo

Spring中的Elasticsearch HTTP认证(spring.elasticsearch.rest.uris)

3

此处将为大家介绍关于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)

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

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>
View Code

使用传输客户端或节点客户端元素在上下文中注册 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>
View Code

节点客户端使用命名空间

<?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>
View Code

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());
    }
}
View Code

上面的配置设置了 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;
    }
}
View Code

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

And

findByNameAndPrice

{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}

Or

findByNameOrPrice

{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}

Is

findByName

{"bool" : {"must" : {"field" : {"name" : "?"}}}}

Not

findByNameNot

{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}

Between

findByPriceBetween

{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}

LessThanEqual

findByPriceLessThan

{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}

GreaterThanEqual

findByPriceGreaterThan

{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}

Before

findByPriceBefore

{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}

After

findByPriceAfter

{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}

Like

findByNameLike

{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}

StartingWith

findByNameStartingWith

{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}

EndingWith

findByNameEndingWith

{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}

Contains/Containing

findByNameContaining

{"bool" : {"must" : {"field" : {"name" : {"query" : "?","analyze_wildcard" : true}}}}}

In

findByNameIn(Collection<String>names)

{"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}

NotIn

findByNameNotIn(Collection<String>names)

{"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}

Near

findByStoreNear

Not Supported Yet !

True

findByAvailableTrue

{"bool" : {"must" : {"field" : {"available" : true}}}}

False

findByAvailableFalse

{"bool" : {"must" : {"field" : {"available" : false}}}}

OrderBy

findByAvailableTrueOrderByNameDesc

{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}

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);
View Code

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;
    }
    }
}
View Code

整体 spring 配置参看

 

02. ElasticSearch (Spring Data ElasticSearch)

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

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

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>
pom.xml

 

		<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的相关信息,请在本站寻找。

本文标签: