专栏首页零基础自学Java【微服务】159:Elasticsearch的使用

【微服务】159:Elasticsearch的使用

学习计划安排如下:

  • 索引库本质上和数据库类似,也是存储数据的,既然如此自然也会有增删改查。
  • 那么这个索引库到底有何特别应用呢?
  • 索引库的特别之处在于它的查询,用户搜索一个词语,响应哪些对应的数据给用户?
  • 今天重点是match匹配查询和词条查询。

一、索引库的增删改查

1新增数据

①通过POST请求添加数据。

昨天我们给索引库设定了几个字段,以上述例子中的title字段为例,给其添加一条数据“小爱手机”,这样后面可以通过索引库来快速定位这条数据了。

通过响应结果可以看到result显示的是“created”,也就是新建了一个数据。

注意:这里的请求方式是POST,昨天关于索引库的创建时POST对应的是修改,PUT是新增,至于这儿为何是POST,暂时不清楚。

②随机生成id

系统会随机生成一个id来记录这条新增的数据,但是这个id太复杂了,不好记住。

所以在新增数据时自定义id。

2自定义id

在请求路径中指定id即可。

关于请求路径:索引库是liuxiaoai01,索引类型goods,id为1,添加了一条数据。

有了id之后我们就可以去进行修改和删除数据的操作了,如果不是系统随机的id不容易记住,使用起来不方便。

3修改数据

PUT请求就是修改了,但是要注意使用PUT必须要指定id,如果没有会报错。

其中关于id的作用:

  • 如果id在文档中不存在,则新增该数据,就相当于通过POST添加了一条数据。
  • 如果id在文档中存在,则修改对应id数据。

也通过PUT请求既能完成新增操作又能完成修改操作,一般都会直接使用PUT。

但也要知道使用POST新增数据这回事。

3删除数据

根据id即可删除对应的数据。

PS:观察响应结果result的值就能看出来进行了什么操作。

  • created对应新增数据。
  • update对应修改数据。
  • delete对应删除数据。

4查询数据

同样的方式,GET请求即对应的查询操作,根据id即可查询出对应的数据。

但是这种方法基本不会用。

要知道用户在搜索的时候,他怎么可能知道商品对应的id是多少?

所以用户查询的时候是使用不到id查询的,就需要全文检索技术了,

二、基本的搜索

1匹配所有(match_all)

这里query代表的就是一个查询对象,里面编写具体的查询条件是怎样的:

  • match_all即代表了匹配所有,也就对应了上图中的例子。
  • match即匹配查询,怎么匹配可以自行说明。
  • term即词条查询,查询的时候不考虑分词。
  • ……除此之外,还有很多种查询类型。

其中查询条件根据查询类型的不同会有多种不同的写法,后续遇到了就说明。

现在主要讲解下match匹配查询和词条查询。

2匹配查询(match)

为了方便测试,我向索引库中添加了两条数据,现在索引库中一共有4条数据:

“小爱手机”,“大爱手机”,“超爱手机”以及“小爱电视”这4条。

match本身也就是匹配的意思,现在匹配和“小爱电视”相关的数据。

运行会发现“手机”相关的数据都被搜索出来了,这是为什么呢?

因为“小爱电视”先会被分词成“小”“爱”以及“电视”,和分词相关的数据都会被搜索出来。

其中响应的结果有个score属性,也就是得分的意思:score越高表示结果越匹配,

在电商网站上搜索某品牌手机,会发现:

  • 该品牌其它产品也会被搜索出来。
  • 手机壳啊什么的也会被搜索出来。

就是这么一个道理。

and关系

operator翻译过来是运算,意思就是将分词结果通过and连接起来。

查询条件是“小爱电视”,但是其被分词为了“小”,“爱”和“电视”,当然具体是不是这样分词我不太清楚,但思路是一样的:

  • 如果不做说明默认or连接,那么查询到的数据的分词只要满足任意一个就可以。
  • 如果说明是and连接,那么查询到的数据分词必须要包含“小”,“爱”和“电视”。

3词条匹配(term)

我们在通过词条匹配查询“小爱电视”会发现结果竟然一条数据都没有。

老实说这个结果让我很是懵逼,想了好久才明白,还不确定对不对,我大致说下:

我们在创建索引库的时候,title这个字段名类型是text,它是会分词的,并且分词器是IK,这个昨天就详细说明过。

所以今天往索引库中添加数据“小爱电视”,它会被分词成“小”、“爱”和“电视”。

索引库中title这个字段是没有“小爱电视”这个词的,它被分词了。

  • 用match查询时本身也会将查询条件分词,所以会被查询到。
  • 而用term查询时不会将查询条件分词,所以查询不到。

本文分享自微信公众号 - 刘小爱(liuxiaoai946),作者:刘小爱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【微服务】152:Stream流和通用mapper批量查询的使用

    昨天虽然完成了商品查询,但是其有一个问题,我们查询的数据是SPU,SPU中关于商品分类和品牌只是记录了其Id。

    刘小爱
  • 【日记】152微服务项目第22天

    刘小爱
  • 【Java】基础33:用一个案例说明线程同步问题

    根据我们这几天的学习,很显然要创建三个线程来解决这种情况,我们选择使用实现Runnable接口的这种方式来创建线程:

    刘小爱
  • 走进JavaWeb技术世界16:极简配置的SpringBoot

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • 面试常问 乐观锁 & 悲观锁 、自旋锁 & 互斥锁 ?诸君听我一言

    乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解后端多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现...

    看、未来
  • Mysql数据--死锁解密

    Mysql行锁是在引擎中实现的,并不是所有的存储引擎都支持行锁,比如myisam就不支持行锁,而innodb支持行锁,myisam在并发度高的系统中就会影响系统...

    小土豆Yuki
  • # 如何调试go源码

    用户1175783
  • 什么是Python装饰器,有什么作用?

    今天小编和大家分享一下,什么是Python装饰器,有什么作用!由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

    小小科
  • Docker Swarm群集配置实战——第二战

    注:这篇博文的环境基于上一篇博文中搭建的环境,具体可以参考博文:Docker Swarm群集配置实战

    小手冰凉
  • MySQL延迟问题,无脑升级到8.0不是解决之道

    最近有一个数据库的延迟问题比较明显,大体的逻辑是有一批数据需要在缓存中校验,如果数据过期,就需要重新刷新数据,整个数据量大概有2000万,更新的数据量平均在60...

    jeanron100

扫码关注云+社区

领取腾讯云代金券