ElasticSearch --- Spring Data集成入门

一、引入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);
        }
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值