Spring data ElasticSearch简介:
Elasticsearch是一个实时的分布式搜索和分析引擎。它底层封装了Lucene框架,可以提供分布式多用户的全文搜索服务。
Spring Data ElasticSearch是SpringData技术对ElasticSearch原生API封装之后的产物,它通过对原生API的封装,使得程序员可以简单的对ElasticSearch进行各种 *** 作。
ElasticSearch环境搭建:
安装ElasticSearch
- 修改进程限制,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 elasticsearch5.6.8 org.elasticsearch.client transport5.6.8
org.springframework.data spring-data-elasticsearch3.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,让 *** 作检索文档变得简单。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)