spring data系列之Spring data ElasticSearch

spring data系列之Spring data ElasticSearch,第1张

spring data系列之Spring data ElasticSearch

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

       创建工程,引入坐标

        

        

          org.elasticsearch

          elasticsearch

          5.6.8

        

        

          org.elasticsearch.client

          transport

          5.6.8

        


        

          org.springframework.data

          spring-data-elasticsearch

          3.0.5.RELEASE

        

       添加配置文件

 

       创建实体类

 

       创建接口类

       测试 

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 all = articleDao.findAll();
        for (Article article : all) {
            System.out.println(article);
        }
    }

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

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

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


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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5610572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存