文章目錄
歡迎訪問筆者個人技術博客:http://rukihuang.xyz/
SpringDataElasticSearch快速入門
-
Spring Data ElasticSearch 基於 spring data API 簡化 elasticSearch操作,將原始操作elasticSearch的客戶端API 進行封裝 。Spring Data爲Elasticsearch項目提供集成搜索引擎。Spring Data Elasticsearch POJO的關鍵功能區域爲中心的模型與Elastichsearch交互文檔和輕鬆地編寫一個存儲庫數據訪問層。
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 + '\'' +
'}';
}
}
-
@Document(indexName="blob3",type="article")
:indexName
:索引的名稱(必填項)type
:索引的類型
-
@Id
:主鍵的唯一標識 -
@Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)
index
:是否設置分詞analyzer
:存儲時使用的分詞器searchAnalyze
:搜索時使用的分詞器store
:是否存儲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));
}