3.使用Spring Data ElasticSearch操作ElasticSearch(5.6.8版本)

摘要:
1.引入maven坐标org.elasticsearchelasticsearch5.6.8org.elasticsearch.client传输5.6.8org。阿帕奇。登录中。log4j</groupId><artifactId>log4j到slf4j</authenticationId><version>2.9.1</version><dependency><groupId>org。slf4j</groupId><artifactId>slf4j api</authenticationId><version>1.7.24</version></adependency><dependency<<groupId>org。slf4j</group pId><artifactId>slf4j simple</artifactId><version>1.7.21</version><dependency><groupId>log4j</ggroup pId>>artifactId<log4j单元测试--˃junitjunit4.12org。springframework</groupId><artifactId>弹簧测试</artifactId><版本>5.0.4。RELEASEcom.fasterxml.jackson.corejackson core2.8.1com.faster.xml.jacjackson.corejacksondatabind2.8.1˃com.fasterxml.jacksoncorejackerjacks annotations˂/artifactId=2.8.12.配置ElasticSearch?xmlversion=“1.0”encoding=“UTF-8”?

1.引入maven坐标

<!--spring-data-elasticsearch-->
<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>
<!--elasticsearch-->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<!--transport-->
<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>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<!--json-->
<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>

2.配置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
		">
    <!-- 配置elasticSearch客户端的连接 -->
    <elasticsearch:transport-client   cluster-nodes="localhost:9301,localhost:9302,localhost:9303" cluster-name="my-application"/>
    <!-- 扫描Dao包,自动创建实例 -->
    <elasticsearch:repositories base-package="com.caizhen.springdata.elasticsearch.dao"/>
    <!-- 扫描Service包,创建Service的实体 -->
    <context:component-scan base-package="com.caizhen.springdata.elasticsearch.service"/>
    <!-- ElasticSearch模版对象 -->
    <bean   class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="client"></constructor-arg>
    </bean>

</beans>

3.配置dao

@Repository
public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {

}

4.配置service

@Service public class ArticleServiceImpl implements ArticleService {  

@Autowired

private ArticleRepository articleRepository;
@Autowired private ElasticsearchTemplate elasticsearchTemplate; //新建索引 public void creatIndex() { //创建索引,并配置映射关系 elasticsearchTemplate.createIndex(Article.class);
//创建映射关系 // elasticsearchTemplate.putMapping(Article.class); } //保存文档 public void save(Article article) { articleRepository.save(article); }
//更新文档,ealasticsearch根据id判断该数据是否存在若存在则进行修改
@Test
    public void update(){
        Article article = new Article();
        article.setId(1001);
        article.setTitle("elasticSearch 3.0版本发布...更新");
        article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
        articleService.save(article);
    }
//删除文档
  public void delete(){
        Article article = new Article();
        article.setId(1001);
        articleService.delete(article);
    }
//分页查询
    @Test
    public void findAllPage(){
        Pageable pageable = PageRequest.of(1,10);//page,pagesize,初始页是从0开始
        Page<Article> page = articleService.findAll(pageable);
        for(Article article:page.getContent()){
            System.out.println(article);
        }
    }

}

3.3.2 常用查询命名规则

关键字命名规则解释示例
andfindByField1AndField2根据Field1和Field2获得数据findByTitleAndContent
orfindByField1OrField2根据Field1或Field2获得数据findByTitleOrContent
isfindByField根据Field获得数据 findByTitle  
notfindByFieldNot根据Field获得补集数据findByTitleNot
betweenfindByFieldBetween获得指定范围的数据findByPriceBetween
lessThanEqualfindByFieldLessThan获得小于等于指定值的数据findByPriceLessThan

 3.3.3 查询方法测试

1)dao层实现

public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {
    //根据标题查询
    List<Article> findByTitle(String condition);
    //根据标题查询(含分页)
    Page<Article> findByTitle(String condition, Pageable pageable);
}

2)service实现

public interface ArticleService {
    //根据标题查询
    List<Article> findByTitle(String condition);
    //根据标题查询(含分页)
    Page<Article> findByTitle(String condition, Pageable pageable);
}

3)service层实现

@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleRepository articleRepository;

    public List<Article> findByTitle(String condition) {
        return articleRepository.findByTitle(condition);
    }
    public Page<Article> findByTitle(String condition, Pageable pageable) {
        return articleRepository.findByTitle(condition,pageable);
    }

}

4)单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringDataESTest {

    @Autowired
    private ArticleService articleService;

    @Autowired
    private TransportClient client;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    /**条件查询*/
    @Test
    public void findByTitle(){
        String condition = "版本";
        List<Article> articleList = articleService.findByTitle(condition);
        for(Article article:articleList){
            System.out.println(article);
        }
    }

    /**条件分页查询*/
    @Test
    public void findByTitlePage(){
        String condition = "版本";
        Pageable pageable = PageRequest.of(2,10);
        Page<Article> page = articleService.findByTitle(condition,pageable);
        for(Article article:page.getContent()){
            System.out.println(article);
        }
    }
    /**条件分页查询*/
    @Test
    public void findByTitlePage(){
        String condition = "版本";
        Pageable pageable = PageRequest.of(2,10);
        Page<Article> page = articleService.findByTitle(condition,pageable);
        for(Article article:page.getContent()){
            System.out.println(article);
        }
    } }

5)使用Elasticsearch的原生查询对象进行查询。

 @Test
    public void findByNativeQuery() {
        //创建一个SearchQuery对象
      SearchQuery searchQuery = new NativeSearchQueryBuilder()
                //设置查询条件,此处可以使用QueryBuilders创建多种查询
.withQuery(QueryBuilders.queryStringQuery("SpringData").defaultField("title"))
                //还可以设置分页信息
                .withPageable(PageRequest.of(0, 5))
                //创建SearchQuery对象
                .build();
        //使用模板对象执行查询
        List<Article> articleList= elasticsearchTemplate.queryForList(searchQuery, Article.class);
        for(Article list: articleList){
            System.out.println(list);
        }
    }

6)总结 

自定义方法可以对搜索的内容先分词再进行查询,每个词之间条件都是and的关系,一个词分词后的片段必须都同时满足

原生方法是or的关系

  

  

免责声明:文章转载自《3.使用Spring Data ElasticSearch操作ElasticSearch(5.6.8版本)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sql 数据库实时增量更新oracle赋某表truncate权限下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java 日志管理最佳实践

转:http://blog.jobbole.com/51155/ 日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源。对于开 发人员来说,在程序中使用日志API记录日志并不复杂,不过遵循一些最佳实践可以更好的利用日志。本文介绍了在Java程序中记录日志的最佳实践,同时也 介绍了如...

Elasticsearch集群角色类型node.master及node.data

在Elasticsearch当中,ES分为三种角色:master、data、client。 三种角色由elasticsearch.yml配置文件中的node.master、node.true来控制。 如果不修改elasticsearch的节点角色信息,那么默认就是node.master: true、node.data: true 默认情况下,es集群中的每...

关于elasticsearch和kibana的时区和日期问题

elasticsearch原生支持date类型,json格式通过字符来表示date类型。所以在用json提交日期至elasticsearch的时候,es会隐式转换,把es认为是date类型的字符串直接转为date类型。至于什么样的字符串es会认为可以转换成date类型,参考elasticsearch官网介绍https://www.elastic.co/gu...

Kibana(一张图片胜过千万行日志)

Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。 你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。 你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。 Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实...

Elasticsearch笔记七之setting,mapping,分片查询方式

Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数。 1:查看,通过curl或浏览器可以看到副本分片信息 curl -XGEThttp://192.168.79.131:9200/shb01/_settings?pretty http://192...

ES数据库安装6.6

ES数据库安装 elastica searchelasticsearch的概念:是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。 1、elasticsearch和MongoDB/redis/memcache一样,是非关系性数据库是一...