pom引入
<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>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--jackson -->
<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>
<!-- SpringDataElasticSearch -->
<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>
<!-- spring-test 方便測試 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
</dependencies>
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
">
<!--client客戶端配置 -->
<elasticsearch:transport-client id="es_client" 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.springdata.respositories"/>
<!-- Elasticsearch 模板對象 -->
<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<!-- 指向上方client客戶端 -->
<constructor-arg name="client" ref="es_client"/>
</bean>
</beans>
實體類配置
<!--這里制定了索引的名稱以及type類型 -->
@Document(indexName ="spring_data_index " ,type = "article")
public class Article {
// store:是否存儲 index:是否設置分詞,默認為true
// analyzer:存儲時使用分詞器
// searchAnalyzer:查詢時使用分詞器將查詢的字段進行分詞
@Id
@Field(store = true,type = FieldType.Long)
private long id;
@Field(store = true,type = FieldType.text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String title;
@Field(store = true,type = FieldType.text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String context;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", context='" + context + '\'' +
'}';
}
}
配置接口
//接口中應該指定實體類以及ID的類型
public interface ArticleRespository extends ElasticsearchRepository<Article,Long> {
//要注意命名規則
//自定義查詢
List<Article> findByTitle(String str);
//根據多條件自定義查詢
List<Article> findByTitleOrContext(String title,String content);
List<Article> findByTitleOrContext(String title, String content, Pageable pageable);
}
常用步驟
//創建索引
@Autowired
private ArticleRespository articleRespository;
@Autowired
private ElasticsearchTemplate template;
@Test
public void createIndex() throws Exception{
//創建索引,並配置映射關系
template.createIndex(Article.class);
}
//添加Document
@Test
public void addDocument() throws Exception{
//創建一個對象
Article article=new Article();
article.setId(2);
article.setTitle("maven項目對象模型,第二個");
article.setContext("maven是一個開源項目管理工具,第二個");
articleRespository.save(article);
}
//添加多個Document
@Test
public void addDocumentMore() throws Exception{
for(int i =3 ;i<10;i++){
//創建一個對象
Article article=new Article();
article.setId(i);
article.setTitle("maven項目對象模型,第"+i+"個");
article.setContext("maven是一個開源項目管理工具,第"+i+"個");
articleRespository.save(article);
}
}
//刪除Document
@Test
public void deleteDocument() throws Exception{
articleRespository.deleteById(1l);
//全部刪除
//articleRespository.deleteAll();
}
//修改
@Test
public void updateDocument() throws Exception{
//其實就是添加文檔,因為es是基於lucene的,所以修改的原理是先刪除再添加
//所以更新文檔其實就是添加文檔,保持文檔與源文檔id一致,這樣就能覆蓋原有文檔起到更新的作用
//addDocument();
}
//查詢 遍歷
@Test
public void searchDocument() throws Exception{
//!!!這不是迭代器
Iterable<Article> articles = articleRespository.findAll();
articles.forEach(article -> System.out.println(article));
}
//查詢 byId
@Test
public void searchById() throws Exception {
Optional<Article> optional = articleRespository.findById(3l);
Article article = optional.get();
boolean b = StringUtils.isEmpty(article);
if (!b) {
System.out.println(article);
} else {
System.out.println("無法查詢到該對象");
}
}
//自定義查詢
@Test
public void searchByTitle(){
List<Article> list = articleRespository.findByTitle("maven");
list.stream().forEach(article -> System.out.println(article));
}
//自定義查詢 返回list
@Test
public void searchByTitleOrContent(){
//查詢時是分詞查詢,每個詞之間是and關系,所以查詢的所有詞都應該包含在被查到的對象字段中
List<Article> list = articleRespository.findByTitleOrContext("對象maven", "第3個");
list.stream().forEach(article -> System.out.println(article));
}
//自定義查詢並設置分頁
@Test
public void searchByTitleOrContentByPage(){
//設置分頁信息,默認從第0頁開始
Pageable pageable= PageRequest.of(0,3);
List<Article> list = articleRespository.findByTitleOrContext("第二個", "第5個",pageable);
list.stream().forEach(article -> System.out.println(article));
}
//使用原生的查詢,查詢內容不需要完全匹配
//類似於QueryString
@Test
public void NativeSearchQuery() throws Exception{
//創建一個查詢對象
NativeSearchQuery query=new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("maven是一個工程構建起").defaultField("title"))
.withPageable(PageRequest.of(0,5))
.withHighlightFields(new HighlightBuilder.Field("title").preTags("<font style='color:red'>").postTags("</font>"))
.build();
List<Article> articles = template.queryForList(query, Article.class);
articles.stream().forEach(article -> System.out.println(article));
}
}
