全文檢索 — ElasticSearch_03(SpringDataElasticSearch快速入門、elasticsearchTemplate、articleRepository_CRUD)


歡迎訪問筆者個人技術博客:http://rukihuang.xyz/

SpringDataElasticSearch快速入門

  • Spring Data ElasticSearch 基於 spring data API 簡化 elasticSearch操作,將原始操作elasticSearch的客戶端API 進行封裝 。Spring Data爲Elasticsearch項目提供集成搜索引擎。Spring Data Elasticsearch POJO的關鍵功能區域爲中心的模型與Elastichsearch交互文檔和輕鬆地編寫一個存儲庫數據訪問層。

  • Spring Data ElasticSearch官方文檔

1 SDES入門

1.2 導入座標

<dependencies>
    <!--es-->
    <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>

	<!--springdata-->
    <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>

1.2 創建applicationContext.xml

  • 引入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: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
		">
    <!-- 掃描Dao(repositories)包,自動創建實例 -->
    <elasticsearch:repositories base-package="com.ruki.es.repositories" />

    <!-- 掃描Service包,創建Service的實體,可以沒有,有repositories就夠了 -->
    <context:component-scan base-package="com.ruki.es.service"/>

    <elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch"
        cluster-nodes="127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302"/>

    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="esClient" />
    </bean>
</beans>

1.3 編寫配置實體類

  • Article
@Document(indexName = "sdes_blog", type = "article")
public class Article {
    @Id
    @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;

    //getter setter

    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}
  1. @Document(indexName="blob3",type="article")

    1. indexName:索引的名稱(必填項)
    2. type:索引的類型
  2. @Id:主鍵的唯一標識

  3. @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)

    1. index:是否設置分詞
    2. analyzer:存儲時使用的分詞器
    3. searchAnalyze:搜索時使用的分詞器
    4. store:是否存儲
    5. type: 數據類型

1.4 編寫Dao

  • ArticleRepository
  • 需要繼承ElasticsearchRepository<T, ID><實體泛型,ID類型>
package com.ruki.es.repositories;

import com.ruki.es.entity.Article;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;


import java.util.List;

public interface ArticleRepository extends ElasticsearchRepository<Article, Long> {
    public List<Article> findByTitle(String title);
    public List<Article> findByTitleOrContent(String title, String content);
    public List<Article> findByTitleOrContent(String title, String content, Pageable pageable);
}

1.5 編寫service(可以不編寫)

  • 由於在applicationContext.xml中設置了<elasticsearch:repositories base-package="com.ruki.es.repositories" />,可以不編寫service,直接使用articleRepository進行常規CRUD操作,也可以遵循方法命名規則,自定義方法進行操作。
public interface ArticleService {

    public void save(Article article);
    
}
@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleRepository articleRepository;

    public void save(Article article) {
        articleRepository.save(article);
    }

}

1.6 創建測試類

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class SpringDataESTest {

    @Autowired
    private ArticleRepository articleRepository;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    
    //1. elasticsearchTemplate
    //1.1 創建索引
    //1.2 配置映射關係
    
    //2. articleRepository
    //2.1 添加文檔
    //2.2 刪除文檔
    //2.3 查詢全部
    //2.4 根據id查詢
    //2.5 自定義方法查詢
}

1.6.1 elasticsearchTemplate

1.6.1.1 創建索引/配置映射關係
@Test
public void testCreateIndex() {
    //創建索引,並配置映射關係
    elasticsearchTemplate.createIndex(Article.class);
    // 配置映射關係
    elasticsearchTemplate.putMapping(Article.class);
}

1.6.2 articleRepository

ArticleRepository的父類
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}
自定義查詢規則
關鍵字 命名規則 解釋 示例
and findByField1AndField2 根據Field1和Field2獲得數據 findByTitleAndContent
or findByField1OrField2 根據Field1或Field2獲得數據 findByTitleOrContent
is findByField 根據Field獲得數據 findByTitle
not findByFieldNot 根據Field獲得補集數據 findByTitleNot
between findByFieldBetween 獲得指定範圍的數據 findByPriceBetween
lessThanEqual findByFieldLessThan 獲得小於等於指定值的數據 findByPriceLessThan
1.6.2.1 添加文檔 save
@Test
public void addDocument() {
    for (int i = 3; i < 10; i++) {
        Article article = new Article();
        article.setId(i);
        article.setTitle(i + "Maven項目對象模型(POM)");
        article.setContent(i + "可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。Maven 除了以程序構建能力爲特色之外,還提供高級項目管理工具。");
        articleRepository.save(article);
    }
}
1.6.2.2 刪除文檔 deleteById
@Test
public void deleteDocument() {
	articleRepository.deleteById(2l);
}
1.6.2.3 查詢全部 findAll
@Test
public void findAll() {
    Iterable<Article> articles = articleRepository.findAll();
    articles.forEach(a -> System.out.println(a));
}
1.6.2.4 根據id查詢 findById
@Test
public void findById() {
    Optional<Article> optional = articleRepository.findById(3l);
    if (optional != null) {
        Article article = optional.get();
        System.out.println(article);
    }
}
1.6.2.5 自定義方法查詢 findByTitle
//自定義方法查詢
@Test
public void testFindByTitle() {
    List<Article> list = articleRepository.findByTitle("項目");
    list.stream().forEach(a -> System.out.println(a));
}

@Test
public void testFindByTitleOrContent() {
    //沒有分頁查詢
    //        List<Article> list = articleRepository.findByTitleOrContent("項目", "構建");
    //分頁查詢
    Pageable pageable = PageRequest.of(0,5);
    List<Article> list = articleRepository.findByTitleOrContent("項目", "構建", pageable);
    list.stream().forEach(a -> System.out.println(a));
}
1.6.2.6 使用原生查詢對象進行查詢
@Test
public void testNativeSearchQuery() {
    NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.queryStringQuery("maven是一個構建工具").defaultField("title"))//設置查詢條件
        .withPageable(PageRequest.of(0, 5))//設置分頁
        .build();//構建查詢對象
    List<Article> articles = elasticsearchTemplate.queryForList(nativeSearchQuery, Article.class);
    articles.stream().forEach(a -> System.out.println(a));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章