关于ES的Restful入门操作及利用java完成简单搜索引擎的设计

1.简介

首先来简单介绍一下elasticsearch,这是一个分布式搜索型非关系型数据库,底层采用java语言并结合复杂的Lucene库去进行开发出了高效率的搜索功能,但又不像Lucene这么复杂,而是直接利用Restful 风格的请求令操作变得尤其简单,而且,又因为是分布式集群,所以其存储量也很大。

2. ES的体系结构

在这里插入图片描述

  1. 在mysql数据库中,我们存储着各种各样的databases,也对应着elasticsearch中的索引库(index)

  2. 在mysql当中,一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。

  3. 在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我们要做什么:

  1. 把你这个实体类所属的index和type需要制定出来,因为model的本质在es里是document
  2. 标记出document的id主键
  3. 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()));
    }

然后运行测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值