前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Data ElasticSearch 基本使用

Spring Data ElasticSearch 基本使用

作者头像
暴躁的程序猿
发布2022-03-24 15:54:37
1.4K0
发布2022-03-24 15:54:37
举报
文章被收录于专栏:阿飞的学习记录

pring Data ElasticSearch简介

什么是Spring Data

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data的官网:点击此处

什么是Spring Data ElasticSearch

Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

Spring Data ElasticSearch入门

导入Spring Data ElasticSearch坐标

代码语言:javascript
复制
 <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
<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>
    <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>


    <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>

编写实体Article

代码语言:javascript
复制
    private Long id;
    private String title;
    private String content;

编写Dao

代码语言:javascript
复制
public interface ArticleRepository extends ElasticsearchCrudRepository<Article,Long> {
}

配置applicationContext.xml

代码语言:javascript
复制
<?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="esClient" cluster-name="elasticsearch" cluster-nodes="127.0.0.1:9400"></elasticsearch:transport-client>
    <!--包扫描器 扫描dao接口-->
    <elasticsearch:repositories base-package="com.rpf.es.repositories"></elasticsearch:repositories>

    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="esClient"></constructor-arg>
    </bean>

</beans>

配置实体

基于spring data elasticsearch注解配置索引、映射和实体的关系

代码语言:javascript
复制
/**
 * 这是一个新建的类
 * 其中,注解解释如下:
 * @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: 数据类型
 */
@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;

创建测试类SpringDataESTest

代码语言:javascript
复制
/**
 * 这是一个新建的类
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")//扫描配置文件
public class SpringDataElasticSearchTest {

    @Autowired
    private ArticleRepository articleRepository;
    @Autowired
    private ElasticsearchTemplate template;

    @Test
    public void creatIndex() throws Exception {
        //创建索引,并配置映射关系
        template.createIndex(Article.class);
        //配置映射关系
//         template.putMapping(Article.class);
    }

Spring Data ElasticSearch的常用操作

增删改查方法测试

代码语言:javascript
复制
 @Test
    /**
     * 添加文档
     *
     * 跟新文档 原理:删除之后再添加    所以说更新就是在添加一个跟想更新文档id一样的文档
     */
    public void addDocument() throws Exception {
        for (int i = 1; i <= 10; i++) {
            //创建一个article对象
            Article article = new Article();
            article.setId(i);
            article.setTitle("工匠精神2");
            article.setContent("工匠精神,是指工匠对自己的产品精雕细琢,精益求精、更完美的精神理念。工匠们喜欢不断雕琢自己的产品,不断改善自己的工艺,享受着产品在双手中升华的过程");
            //把文档写入索引库
            articleRepository.save(article);
        }
    }

    @Test
    /**
     * 删除文档
     */
    public void deleteById() throws Exception {
        //根据id删除
        articleRepository.deleteById(1L);
        //全部删除
        //articleRepository.deleteAll();
    }

    @Test
    /**
     * 不设置分页的话默认是每页显示十条
     * 查询所有
     */
    public void findAll() throws Exception {
        Iterable<Article> articles = articleRepository.findAll();
        articles.forEach(a -> System.out.println(a));
    }

    @Test
    /**
     * 查询一个
     */
    public void findById() throws Exception {
        Optional<Article> optional = articleRepository.findById(7l);
        Article article = optional.get();
        System.out.println(article);
    }

自定义查询条件方法

命名符合规范 不需要实现方法 spring会为我们实现 dao层

代码语言:javascript
复制
public interface ArticleRepository extends ElasticsearchCrudRepository<Article,Long> {
    List<Article> findByTitle(String title);//自定义条件查询
    List<Article> findByTitleOrContent(String title,String Content);//自定义条件查询
    List<Article> findByTitleOrContent(String title, String Content, Pageable pageable);//自定义条件查询 设置分页
}

测试

代码语言:javascript
复制
@Test
    /**
     * 自定义查询方法可以跟据搜索的内容先分词 然后进行查询
     * 每个次之间条件都是  并且关系   就是 必须同时满足
     * 自定义条件查询
     *
     */
    public void testFindByTitle() throws Exception {
        List<Article> list = articleRepository.findByTitle("工匠");
//           for (Article list1:list){
//               System.out.println(list1);
//           }
//拉姆达表达式方法
        list.stream().forEach(article -> System.out.println(article));
    }

    @Test
    /**
     * 自定义根据条件查询
     */
    public void testFindByTitleOrContent() throws Exception {
        List<Article> list = articleRepository.findByTitleOrContent("工匠", "工匠");
        for (Article list1 : list) {
            System.out.println(list1);
        }
    }

    @Test
    /**
     * 自定义根据条件查询
     */
    public void testFindByTitleOrContent1() throws Exception {
        //设置分页  page代表页数默认从0开始   size是每页显示条数
        Pageable pageable = PageRequest.of(0, 7);
        articleRepository.findByTitleOrContent("工匠", "工匠", pageable).forEach(a -> System.out.println(a));
    }

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

代码语言:javascript
复制
/**
*条件是或关系  满足一个即可
*
*/
 @Test
    public void testNativeSearchQuery() throws Exception{
        //创建一个查询的对象
        NativeSearchQuery query=new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.queryStringQuery("大国工匠很好").defaultField("title"))
                .withPageable(PageRequest.of(0,8)).build();
        //执行查询
        List<Article> articleList = template.queryForList(query, Article.class);
        articleList.forEach(article -> System.out.println(article));
    }
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • pring Data ElasticSearch简介
  • Spring Data ElasticSearch入门
  • Spring Data ElasticSearch的常用操作
  • 使用Elasticsearch的原生查询对象进行查询
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档