一、引入Jar包
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</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 ">
<!-- 扫描DAO包 自动创建实现 -->
<elasticsearch:repositories base-package="cn.elasticsearch.dao" />
<!-- 扫描Service包 -->
<context:component-scan base-package="cn.elasticsearch.service" />
<!-- 配置elasticsearch 连接 -->
<elasticsearch:transport-client id="client" cluster-nodes="localhost:9300" />
<!-- spring data elasticsearch DAO 必须依赖 elasticsearchTemplate -->
<bean id="elasticsearchTemplate"
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="client" />
</bean>
</beans>
三、Domain > Article
package cn.elasticsearch.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldIndex;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Document(indexName = "blog3",type = "article")
public class Article {
@Id
@Field(index = FieldIndex.not_analyzed,store = true,type = FieldType.Integer)
private Integer id;
// index:是否分词
// analyzer:分词器
// store:是否存储
// searchAnalyzer:搜索采用的分词器
@Field(index = FieldIndex.analyzed,analyzer = "ik",store = true,searchAnalyzer = "ik",type = FieldType.String)
private String title;
@Field(index = FieldIndex.analyzed,analyzer = "ik",store = true,searchAnalyzer = "ik",type = FieldType.String)
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Article [id=" + id + ", title=" + title + ", content="
+ content + "]";
}
}
四、Service > ArticleService接口
package cn.elasticsearch.service;
import cn.elasticsearch.domain.Article;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
public interface ArticleService {
void save(Article article);
void delete(Article article);
Article findOne(Integer ids);
Iterable<Article> findAll();
Page<Article> findAll(Pageable pageable);
List<Article> findByTitle(String title);
Page<Article> findByTitle(String title, Pageable pageable);
}
五、ArticleService接口实现
package cn.elasticsearch.service.impl;
import cn.elasticsearch.dao.ArticleRepository;
import cn.elasticsearch.domain.Article;
import cn.elasticsearch.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleRepository articleRepository;
public void save(Article article) {
articleRepository.save(article);
}
public void delete(Article article) {
articleRepository.delete(article);
}
public Article findOne(Integer id) {
return articleRepository.findOne(id);
}
public Iterable<Article> findAll() {
return articleRepository.findAll(new Sort(new Sort.Order(Sort.Direction.ASC,"id")));
}
public Page<Article> findAll(Pageable pageable) {
return articleRepository.findAll(pageable);
}
public List<Article> findByTitle(String title) {
return articleRepository.findByTitle(title);
}
public Page<Article> findByTitle(String title, Pageable pageable) {
return articleRepository.findByTitle(title,pageable);
}
}
六、Dao > ArticleRepository接口
package cn.elasticsearch.dao;
import cn.elasticsearch.domain.Article;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface ArticleRepository extends ElasticsearchRepository<Article,Integer> {
List<Article> findByTitle(String title);
Page<Article> findByTitle(String title, Pageable pageable);
}
七、ArticleServiceTest测试
package cn.elasticsearch.test;
import cn.elasticsearch.domain.Article;
import cn.elasticsearch.service.ArticleService;
import org.elasticsearch.client.Client;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class ArticleServiceTest {
@Autowired
private ArticleService articleService;
@Autowired
private Client client;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void createIndex(){
// 创建索引
elasticsearchTemplate.createIndex(Article.class);
// 添加映射
elasticsearchTemplate.putMapping(Article.class);
}
// 新增
@Test
public void testSave(){
Article article = new Article();
article.setId(1001);
article.setTitle("搜索工作其实也不难");
article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。");
articleService.save(article);
}
// 删除
@Test
public void testDelete(){
Article article = new Article();
article.setId(1001);
articleService.delete(article);
}
// 根据id查询
@Test
public void testFindOne(){
System.out.println(articleService.findOne(1001));
}
// 批量保存
@Test
public void testSaveBatch(){
for (int i = 1;i<100;i++){
Article article = new Article();
article.setId(i);
article.setTitle(i+"搜索工作其实也不难");
article.setContent(i+"我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。");
articleService.save(article);
}
}
// 排序查询
@Test
public void testSortQuery(){
Iterable<Article> articles = articleService.findAll();
for (Article article : articles){
System.out.println(article);
}
}
// 分页查询
@Test
public void testPagingQuery(){
Pageable pageable = new PageRequest(0,10);
Page<Article> pageData = articleService.findAll(pageable);
for (Article article : pageData.getContent()){
System.out.println(article);
}
}
// 条件查询
@Test
public void testConditionQuery(){
//查询标题中含有“搜索”
List<Article> articles = articleService.findByTitle("搜索");
for (Article article : articles){
System.out.println(article);
}
}
// 分页条件查询
@Test
public void testPagingConditionQuery(){
//查询标题中含有“搜索”的1-10条数据
Pageable pageable = new PageRequest(0,10);
Page<Article> pageData = articleService.findByTitle("搜索",pageable);
System.out.println("总记录数:" + pageData.getTotalElements());
for (Article article : pageData.getContent()){
System.out.println(article);
}
}
}
八、带条件的分页查询
@Override
public Page<WayBill> findPageData(WayBill wayBill,Pageable pageable) {
// 判断WayBill中的条件是否存在
if(StringUtils.isBlank(wayBill.getWayBillNum())
&& StringUtils.isBlank(wayBill.getSendAddress())
&& StringUtils.isBlank(wayBill.getRecAddress())
&& StringUtils.isBlank(wayBill.getSendProNum())
&& (wayBill.getSignStatus() == null || wayBill.getSignStatus() == 0)){
return wayBillRepository.findAll(pageable);
}else{
// 查询条件
// must 条件必须成立 and
// must not 条件必须不成立not
// should 条件可以成立or
BoolQueryBuilder query = new BoolQueryBuilder(); //布尔查询,多条件组合查询
// 想组合查询对象添加条件
if(StringUtils.isNotBlank(wayBill.getWayBillNum())){
// 运单号查询
QueryBuilder tempQuery = new TermQueryBuilder("wayBillNum",wayBill.getWayBillNum());
query.must(tempQuery);
}
if (StringUtils.isNotBlank(wayBill.getSendAddress())){
// 发货地 模糊查询
// 情况一:输入"北"是查询词条的一部分,使用模糊匹配词条查询
QueryBuilder wildcardQuery = new WildcardQueryBuilder("sendAddress","*" + wayBill.getSendAddress() + "*");
// 情况二:输入"北京市海淀区"是多个词条组合,进行分词后每个词条匹配查询
QueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(
wayBill.getSendAddress()).field("sendAddress")
.defaultOperator(QueryStringQueryBuilder.Operator.AND);
// 两种情况取or关系
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.should(wildcardQuery);
boolQueryBuilder.should(queryStringQueryBuilder);
query.must(boolQueryBuilder);
}
if (StringUtils.isNotBlank(wayBill.getRecAddress())){
// 收货地 模糊查询
QueryBuilder wildcardQuery = new WildcardQueryBuilder("recAddress","*" + wayBill.getRecAddress() + "*");
query.must(wildcardQuery);
}
if (StringUtils.isNotBlank(wayBill.getSendProNum())){
// 速运类型 等值查询
QueryBuilder termQuery = new TermQueryBuilder("sendProNum",wayBill.getSendProNum());
query.must(termQuery);
}
if (wayBill.getSignStatus() != null && wayBill.getSignStatus() != 0){
// 签收状态查询 等值查询
QueryBuilder termQuery = new TermQueryBuilder("signStatus",wayBill.getSignStatus());
query.must(termQuery);
}
SearchQuery searchQuery = new NativeSearchQuery(query);
searchQuery.setPageable(pageable);
// 有条件查询,查询索引库
return wayBillIndexRepository.search(searchQuery);
}
}