Elasticsearch3/3---Spring Data ElasticSearch 使用

1. Spring Data ElasticSearch简介

(1) What is Spring Data

definition purpose Features
Spring Data is an open source framework for simplifying database access and supporting cloud services. Makes access to data convenient and fast, and supports map-reduce framework and cloud computing data services It greatly simplifies the writing of JPA, and can realize the access and operation of the data without writing the realization. In addition to CRUD, it also includes some commonly used functions such as paging and sorting.

Spring Data official website

(2) What is Spring Data ElasticSearch

Spring Data ElasticSearch simplifies elasticSearch operations based on spring data API 将原始操作elasticSearch的客户端API 进行封装. Spring Data provides an integrated search engine for the Elasticsearch project. Spring Data Elasticsearch POJO's key functional area-centric model interacts with Elastichsearch documents and easily writes a repository data access layer.
Spring Data ElasticSearch official website

2. Common operations of Spring Data ElasticSearch

(1) Overall steps

Insert picture description here

(2) Concrete realization

① Import es related jar package

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <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-to-slf4j</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.24</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>


        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.1</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.0.5.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.plugin</groupId>
                    <artifactId>transport-netty4-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.4.RELEASE</version>
        </dependency>

    </dependencies>

</project>

② es related configuration

applicationContext.xml

<?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:context="http://www.springframework.org/schema/context"
       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.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/data/elasticsearch
		http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
		">
    <!--elastic客户端对象的配置-->
      <elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch"
                      cluster-nodes="127.0.0.1:9301,127.0.0.1:9302,127.0.0.1:9303"/>
    <!--配置包扫描器,扫描dao接口-->
    <elasticsearch:repositories base-package="com.dynamic.es.repositories"/>
    <!--es的模板对象-->
    <bean id="elasticsearchTemplate" 
    	 class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
    	<constructor-arg name="client" ref="esClient"/>
    </bean>
</beans>

③ Create entity

Article.java

//indexName :创建的索引的名称,type :索引的类型
@Document(indexName = "spes",type ="article")
public class Article {
    
    
    //主键的唯一标识
    @Id
    // type: 数据类型  store:是否存储 (index:是否设置分词 analyzer:存储时使用的分词器 searchAnalyze:搜索时使用的分词器)
    @Field(type = FieldType.Long,store = true)
    private long id;

    @Field(type = FieldType.text,store = true,analyzer = "ik_smart")
    private String title;

    @Field(type = FieldType.text,store = true,analyzer = "ik_smart")
    private String content;
    
	//此处省略get和set方法和序列化
}

④ Custom interface

ArticleRepository.java

public interface ArticleRepository extends ElasticsearchRepository<Article,Long> {
    
    
    //根据标题查询
    List<Article> findByTitle(String title);
    //根据标题/内容查询
    List<Article> findByTitleOrContent(String title, String content);
    //根据标题/内容查询(含分页)
    List<Article> findByTitleOrContent(String title, String content, Pageable pageable);
}

⑤ Test method

SpringDataElasticSearchText .java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDataElasticSearchText {
    
    

    @Autowired
    private ArticleRepository articleRepository;

    @Autowired
    private ElasticsearchTemplate template;

    //创建索引
    @Test
    public void createIndex() throws Exception{
    
    
//      创建索引,并配置映射关系
        template.createIndex(Article.class);
    }
    //==========================增==========================
    //把文档内容写入索引库
    @Test
    public void addDocument() throws Exception {
    
    
        for (int i = 10; i <= 20; i++) {
    
    
//        创建一个Article对象
            Article article = new Article();
            article.setId(i);
            article.setTitle("涂山红红"+i);
            article.setContent("涂山红红"+i);
//        把文档内容写入索引库
            articleRepository.save(article);
        }

    }
    //==========================删==========================
    //根据Id删除某条数据
    @Test
    public void deleteDocumentById() throws Exception{
    
    
        articleRepository.deleteById(2l);
    }
    //==========================查(调用自定义的接口)==========================

    //根据标题查询某条数据
    @Test
    public void testFindByTitle() throws Exception{
    
    
        List<Article> list = articleRepository.findByTitle("涂山红红");
        list.stream().forEach(a-> System.out.println(a));
    }

    //根据标题/内容查询某条数据(含分页)
    @Test
    public void testFindByTitleOrContext() throws Exception{
    
    
        PageRequest pageable = PageRequest.of(0,15);
        articleRepository.findByTitleOrContent("斗罗大陆","涂山红红",pageable)
                .forEach(a-> System.out.println(a));
    }

    //==========================查(调用封装的方法)==========================
    //查询所有内容
    @Test
    public void findAll() throws Exception{
    
    
        Iterable<Article> articles = articleRepository.findAll();
        articles.forEach(a-> System.out.println(a));
    }

    //根据id查询某条数据
    @Test
    public void testFindById() throws Exception{
    
    
        Optional<Article> optional = articleRepository.findById(1l);
        Article article = optional.get();
        System.out.println(article);
    }
    //自定义查询
    @Test
    public void testNativeSearchQuery() throws  Exception {
    
    
//        创建一个查询对象
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.queryStringQuery("斗罗大陆赶紧更新吧").defaultField("title"))
                .withPageable(PageRequest.of(0,15))
                .build();
//        执行查询
        List<Article> articleList = template.queryForList(query, Article.class);
        articleList.forEach(a-> System.out.println(a));
    }

}

Guess you like

Origin blog.csdn.net/a954553391/article/details/108563242