Spring data ElasticSearch简介:

       Elasticsearch是一个实时的分布式搜索和分析引擎。它底层封装了Lucene框架,可以提供分布式多用户的全文搜索服务。

       Spring Data ElasticSearch是SpringData技术对ElasticSearch原生API封装之后的产物,它通过对原生API的封装,使得程序员可以简单的对ElasticSearch进行各种操作。

ElasticSearch环境搭建:

       安装ElasticSearch

  1. 修改进程限制,vi /etc/security/limits.conf添加如下参数

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

 

2.     修改系统变量的最大值,vi /etc/sysctl.cnf添加如下参数

        vm.max_map_count=655360

        保存修改后,执行sysctl -p命令

3.     上传文件并解压

        rz   elasticsearch-5.6.8.tar.gz

        tar -zxvf elasticserach-5.6.8.tar.gz

4.     创建用户以及用户组和授权

        创建组    groupadd  es

        创建用户并指定组    useradd -g es es

        授权    chown   -R es:es       elasticsearch-5.6.8

5.     切换es用户,修改配置文件

        su   es

        vi     elasticsearch.yml

 

6.     启动ElasticSearch

 

7.     访问9200端口,出现如下信息,表示搭建成功

 

8.     安装cnpm和grunt-cli插件

9.     cnpm指令建立软链

 

10.   修改elasticsearch的配置添加跨域请求允许,即增加以下两行

 

 

11.   启动head插件    grunt server &,并通过浏览器请求9100端口

 

12.   安装 IK分词器

        ES默认的中文分词器是将每一个汉字作为一个词,这显然不合适,而IK分词 是一款国人开发的相对简单的中文分词器,它包含大量的中文词,而且支持自定义     分词。

        ik分词器提供的分词规则:

        ik_max_word :会将文本做最细粒度的拆分,比如会将“中华人民共和国人民          大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共        和国、大会堂、大会、会堂等词语。

        ik_smart :会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中        华人民共和国、人民大会堂

        两种分词器使用的最佳实践是:索引时用ik_max_word,在搜索时用ik_smart。即:        索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。

        第一步:下载得到ik分词器的安装包,将其解压得到有一个文件夹,并将文件夹重命名为ik。

        第二步 :将elastaicsearch文件夹拷贝到elastaicsearch-5.6.8下的plugins目录下,并重命名为ik。

        第三步 :重新启动elasticsearch即可加载IK分词器。

测试:

ElasticSearch 基础知识

       核心概念

              索引 index

                     一个索引就是一个拥有几分相似特征的文档的集合。索引就类似于关系型数据              库中的库的概念。类型 type

                     一个类型是索引中的一个逻辑上的分类/分区。类型就类似于关系型数据库中              的数据表的概念。

              映射 mapping

                     映射是对类型中的字段的限制。映射就类似于关系型数据库中的数据表结构的              概念。

              文档 document

                     一个文档是一个可被索引的基础信息单元。文档就类似于关系型数据库中的行              的概念。

              ElasticSearch跟关系型数据库中概念的对比:

                     Relational DB -> Databases -> Tables -> Rows -> Columns

                     Elasticsearch -> Indices -> Types -> Documents -> Fields

Spring data ElasticSearch

       创建工程,引入坐标

        <!--elasticsearch-->

        <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>
<!--spring-data-elasticsearch-->

        <dependency>

          <groupId>org.springframework.data</groupId>

          <artifactId>spring-data-elasticsearch</artifactId>

          <version>3.0.5.RELEASE</version>

        </dependency>

       添加配置文件

 

       创建实体类

 

       创建接口类

       测试 

import com.test.springdataelastic.Article;
import com.test.springdataelastic.ArticleDao;
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.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.Optional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-es.xml")
public class EsTest {

   
@Autowired
   
private ElasticsearchTemplate template;

   
@Autowired
   
private ArticleDao articleDao;

   
//通过SpringData ES技术向ElasticSearch数据库存储一条数据
    @Test
   
public void testSave() {
       
//创建索引
        template.createIndex(Article.class);
       
//创建映射
        template.putMapping(Article.class);
       
//创建文档
        Article article = new Article();
        article.setId(
1);
        article.setTitle(
"测试elasticsearch");
        article.setContext(
"20200829测试用");
       
//保存文档
        articleDao.save(article);
    }

   
//修改
    @Test
   
public void testUpdate() {
       
//判断数据库中是否有你指定的id的文档,如果没有,就进行保存,如果有,就进行更新
        Article article = new Article();
        article.setId(
1);
        article.setTitle(
"测试elasticsearch02");
        article.setContext(
"20200829测试用02");
       
articleDao.save(article);
    }

   
//删除
    @Test
   
public void testDelete() {
       
//根据主键删除
        articleDao.deleteById(1);
    }

   
//重新构建数据
    @Test
   
public void makeData() {
       
//创建索引
        template.createIndex(Article.class);
       
//创建映射
        template.putMapping(Article.class);
       
for (int i = 1; i <= 10; i++) {
           
//创建文档
            Article article = new Article();
            article.setId(i);
            article.setTitle(
"20200829测试" + i);
            article.setContext(
"20200829测试,看看行不行" + i);
            article.setHits(
100 + i);
           
//保存文档
            articleDao.save(article);
        }
    }

   
//查询所有
    @Test
   
public void testFindAll() {
        Iterable<Article> all =
articleDao.findAll();
       
for (Article article : all) {
            System.
out.println(article);
        }
    }

   
//主键查询
    @Test
   
public void testFindById() {
        Optional<Article> opt =
articleDao.findById(5);
        System.
out.println(opt.get());
    }

   
//分页查询
    @Test
   
public void testFindAllWithPage() {
       
//设置分页条件
        Pageable pageable = PageRequest.of(1, 3);//page代表的页码,0开始
        Page<Article> page = articleDao.findAll(pageable);
       
for (Article article : page.getContent()) {
            System.
out.println(article);
        }
    }

   
//排序查询
    @Test
   
public void testFindAllWithSort() {
       
//设置排序条件
        Sort sort = Sort.by(Sort.Order.desc("hits"));
        Iterable<Article> all =
articleDao.findAll(sort);
       
for (Article article : all) {
            System.
out.println(article);
        }
    }

   
//分页+排序查询
    @Test
   
public void testFindAllWithPageAndSort() {
       
//设置排序条件
        Sort sort = Sort.by(Sort.Order.desc("hits"));
       
//设置分页条件
        Pageable pageable = PageRequest.of(1, 3, sort);//page代表的页码,0开始
        Page<Article> page = articleDao.findAll(pageable);
       
for (Article article : page.getContent()) {
            System.
out.println(article);
        }
    }

   
//根据标题查询
    @Test
   
public void testFindByTitle() {
        List<Article> articles =
articleDao.findByTitle("测试");
       
for (Article article : articles) {
            System.
out.println(article);
        }
    }


   
//根据标题查询
    @Test
   
public void testFindByTitleOrContext() {
        List<Article>   articles=   
articleDao.findByTitleOrContext("elasticsearch", "测试");
       
for (Article article : articles) {
            System.
out.println(article);
        }
    }

   
//根据标题查询
    @Test
   
public void testFindByTitleOrContextWithPage() {
       
//设置排序条件
        Sort sort = Sort.by(Sort.Order.desc("hits"));
        
//设置分页条件
        Pageable pageable = PageRequest.of(1, 3, sort);//page代表的页码,0开始
        List<Article> articles = articleDao.findByTitleOrContext("测试", "测试", pageable);
       
for (Article article : articles) {
            System.
out.println(article);
        }
    }
}

总结:搭建elasticsearch搜索引擎,通过spring data 整合elasticsearch,让操作检索文档变得简单。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐