ElasticSearch集成Spring之ElasticsearchTemplate


前面幾篇我們學習了那么多ES知識,那么怎樣運用到實際項目中去呢?本篇講一講ES與spring的集成,讓ES能投入實際生產中去。

1、Maven依賴

<!-- elasticsearch的spring-data包 -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>x.y.z.RELEASE</version>
</dependency>

<!-- elasticsearch客戶端,version填入本地安裝好的ES版本號 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>x.y.z</version>
</dependency>

 

spring-data-elasticsearch與elasticsearch的版本對應關系:

spring data elasticsearch elasticsearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

maven倉庫中的spring-data-elasticsearch版本:https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch
注意:截止到 2018-12-17,一直還沒有出3.2.x,如果你使用的elasticsearch是6.5.0以上的版本,建議elasticsearch降低到6.2.2,否則會出現很多未知的錯誤,這是個坑!

2、添加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: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.demo.elasticsearch.*" />

    <!-- 聲明elasticsearch客戶端 -->
    <elasticsearch:transport-client id="client" cluster-nodes="localhost:9300" cluster-name="home" />

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

 

3、使用elasticsearchTemplate

創建BookEntity實體:

public class BookEntity {
    private String author;
    private String name;
    private String id;
}

 

引用elasticsearchTemplate

@Autowired
private ElasticsearchTemplate elasticsearchTemplate;

 

創建索引

// 1、直接用名稱創建
elasticsearchTemplate.createIndex("book");

// 2、填入class對象
elasticsearchTemplate.createIndex(BookEntity.class);

 

創建數據

單條數據:

BookEntity bookEntity = new BookEntity();
bookEntity.setId("2");
bookEntity.setAuthor("老李");
bookEntity.setName("一起學習es");

IndexQuery indexQuery = new IndexQueryBuilder()
                .withId(bookEntity.getId())
                .withObject(bookEntity)
                .build();
elasticsearchTemplate.index(indexQuery);

 

多條數據:

BookEntity bookEntity = new BookEntity();
bookEntity.setId("2");
bookEntity.setAuthor("老李");
bookEntity.setName("一起學習netty");

IndexQuery indexQuery1 = new IndexQueryBuilder()
        .withId(bookEntity.getId())
        .withObject(bookEntity)
        .build();
//        elasticsearchTemplate.index(indexQuery);
indexQueries.add(indexQuery1);

BookEntity bookEntity2 = new BookEntity();
bookEntity.setId("3");
bookEntity.setAuthor("老劉");
bookEntity.setName("netty菜鳥入門");

IndexQuery indexQuery2 = new IndexQueryBuilder()
        .withId(bookEntity2.getId())
        .withObject(bookEntity)
        .build();
indexQueries.add(indexQuery2);

elasticsearchTemplate.bulkIndex(indexQueries);

 

單字符串查詢

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.queryStringQuery("菜鳥"))
        .withPageable(new PageRequest(0, 20))
        .build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 

排序

Pageable pageable= new PageRequest(0, 20,new Sort(Sort.Direction.DESC, "name"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.queryStringQuery("菜鳥"))
        .withPageable(pageable)
        .build();
Page<BookEntity> list = elasticsearchTemplate.queryForPage(searchQuery, BookEntity.class);

 

注意:如果出現此異常

java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default

官方解釋5.x后對排序,聚合這些操作用單獨的數據結構(fielddata)緩存到內存里了,需要單獨開啟(主要是占用資源太多,所以是否開啟,需要仔細斟酌)
關於fielddata更多內容:https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

模糊查詢

此模糊查詢與mysql中的模糊查詢不太一樣,此模糊查詢類似分詞匹配。
比如有兩條數據:1、我今天非常高興 2、他摔倒很高興
輸入:今天高興
這兩條數據都能匹配上。

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.matchQuery("name", "菜鳥"))
        .withPageable(pageable)
        .build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 

其余匹配

其余匹配類似mysql中like "%word%"的模糊匹配

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.matchPhraseQuery("name", "菜鳥"))
        .withPageable(pageable)
        .build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 

Term全等查詢

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.termQuery("name", "菜鳥"))
        .withPageable(pageable)
        .build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 

組合查詢

即boolQuery,可以設置多個條件的查詢方式。它的作用是用來組合多個Query,有四種方式來組合,must,mustnot,filter,should。
must代表返回的文檔必須滿足must子句的條件,會參與計算分值;
filter代表返回的文檔必須滿足filter子句的條件,但不會參與計算分值;
should代表返回的文檔可能滿足should子句的條件,也可能不滿足,有多個should時滿足任何一個就可以,通過minimum_should_match設置至少滿足幾個。
mustnot代表必須不滿足子句的條件。

QueryBuilder filterQuery = QueryBuilders
                .boolQuery()
                .filter(QueryBuilders.termQuery("name", "菜鳥"))
                .filter(QueryBuilders.termQuery("author", "小菜"));
List<BookEntity> list = elasticsearchTemplate.queryForList(filterQuery, BookEntity.class);

 

結束

更多關於QueryBuilders的用法,可以看看elasticsearch的QueryBuilders類,或者查看文檔:http://xbib.org/elasticsearch/2.1.1/apidocs/org/elasticsearch/index/query/QueryBuilders.html

更多關於ElasticsearchTemplate的用法,可以查看源碼,或者查看文檔:https://docs.spring.io/spring-data/elasticsearch/docs/current/api/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM