1.简介
首先来简单介绍一下elasticsearch,这是一个分布式搜索型非关系型数据库,底层采用java语言并结合复杂的Lucene库去进行开发出了高效率的搜索功能,但又不像Lucene这么复杂,而是直接利用Restful 风格的请求令操作变得尤其简单,而且,又因为是分布式集群,所以其存储量也很大。
2. ES的体系结构
-
在mysql数据库中,我们存储着各种各样的databases,也对应着elasticsearch中的索引库(index)
-
在mysql当中,一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
-
在mysql数据库中的增insert、删delete、改update、查select操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.
3.单节点ES的安装与部署及web端的简单使用
https://blog.csdn.net/qq_41936805/article/details/102701631
安装es,安装head插件,解决cors可以看这篇文章
然后进入正题:
页面是这样的
代表我们连接上了,刚连接上的时候,集群健康值显示的是0 of 0,我们可以利用postman这种模拟http请求的工具对其进行添加索引,添加索引
- 添加索引
我们可以从页面中找到我们添加到的索引,其中,url的编写方法就是PUT ip:port/index,index是自己随便写的,意思就是索引名。
- 新建文档
我们建立完索引之后,可以自定义出种类和种类下去匹配到的具体的文档的内容
POST ip:port/index/type
我们可以看出,创建的type也就和之前的index对应上了,并且还会显示你文档的具体内容
- 查询文档
这里我们要使用一个特定的参数字段_search ,请求格式为GET ip:port/index/type/_search,然后这里注意把body的内容清除掉
- 修改文档
在这里我们可以发下在创建文档的时候,result是create,而在更新文档的时候,就是update了,并且你如果是创建翁当,最后一行created状态是true,而更新文档的状态是false。
- 查询&修改文档的简便方法
在上面修改文档的时候,我们利用了id这个字段去修改document,但是这也是有简便方法,那就是在我们上面写id的地方自定义一个id,如果这个id是存在的,那么就是修改,不存在就是创建,如下:
- 模糊查询
其实es也是可以和一些sql一样可以进行模糊查询的,但是就是换用了restful的形式,我们先看一下添加好的几个type下的文档总集合
然后我们采用模糊查询
类似的也都可以实现。
- 删除文档
这个删除文档,也是类似于sql,delete by id
4.利用java添加一个索引
- 导包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
- yml
server:
port: 9007
spring:
application:
name: search #指定服务名
data:
elasticsearch:
cluster-nodes: 127.0.0.1:9300
- model层(最重要的环节)
在es中的实体类,和我们普通springdata的model还是有一定区别的,我说一下在es的model我们要做什么:
- 把你这个实体类所属的index和type需要制定出来,因为model的本质在es里是document
- 标记出document的id主键
- model里的field,肯定不是都需要我们在搜索引擎中去查询的,就比如我们建立索引,都会有一个主键id,这个id你肯定不能拿去查吧,所以,一般我们都会对于制定搜索的字段制定某些规则,比如分词器这种
然后贴上代码的实现结果:
/**
* 添加document
*/
@Getter
@Setter
@Document(indexName = "tensquare_article",type = "article")
public class Article implements Serializable {
@Id
private String id;//对应刚才json的id,唯一标识
/**
* 是否索引,就是看该字段是否能被搜索到
* 是否分词,就表示搜索的时候是整体匹配还是分词匹配
* 是否存储,就是是否在页面上显示
*/
@Field(index = true,searchAnalyzer = "ik_max_word",analyzer = "ik_max_word")//此注解对应着type中的列
// 后面是分词器,分词按照analyzer分,搜索分词按照searchAnalyzer搜索,两边必须一致
private String title;
@Field(index = true,searchAnalyzer = "ik_max_word",analyzer = "ik_max_word")
private String content;
private String state;//审核状态
- dao层
和springdata其他的都一个意思
public interface ArticleDao extends ElasticsearchRepository<Article,String> {
}
- Service层
我们只是写一个save,也就是添加索引的demo,写法都差不多
@Service
public class ArticleService {
@Autowired
private ArticleDao articleDao;
@Autowired
private IdWorker idWorker;
public void save(Article article) {
article.setId(idWorker.nextId() + "");//不写这行也可以,就直接用默认的id了
articleDao.save(article);
}
}
- controller层
@RestController
@CrossOrigin
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping
public Result save(@RequestBody Article article) {
articleService.save(article);
return new Result(true, StatusCode.OK, "添加成功");
}
}
- 测试
添加索引的步骤 就完成了,下面要做的是简单搜索引擎了。
5.创建基于索引的简单查找
我们必然还是用springdata来完成这个步骤
先说一下,这个demo本质还是创建一个分页查询,然后查询的索引字段也是基于刚才那个添加的结果,其实都是常规操作,只需要记住一点,我们通过前端穿过来的这种分页查询,看百度这种就知道,参数都是写在url里的,咱们也是写在url里,然后就基于这个参数去获取到这整个对象,就行,并且springdataES也是可以支持模糊查询的,下面就来看看:
- dao
public interface ArticleDao extends ElasticsearchRepository<Article,String> {
public Page<Article> findByTitleOrContentLike(String title, String content, Pageable pageable);
}
- service
public Page<Article> findByKey(String key, int page, int size) {
Pageable pageable = PageRequest.of(page - 1, size);
return articleDao.findByTitleOrContentLike(key, key, pageable);
}
- controller
@GetMapping("/{key}/{page}/{size}")
public Result findByKey(@PathVariable String key,@PathVariable int page,@PathVariable int size) {
Page<Article> pageData = articleService.findByKey(key, page, size);
return new Result(true, StatusCode.OK, "查询成功", new PageResult<Article>(pageData.getTotalElements(), pageData.getContent()));
}
然后运行测试