实际开发中,全文搜索引擎是怎样使用的?全文搜索引擎是数据库的外部索引,还是它本身也可以看作一个数据库?

2023-03-25 00:56:34 +08:00
 yodhcn

我对"全文搜索引擎"的理解是,它本质上也是一个数据库。

例如:Elasticsearch 和 MySQL ,虽然二者在

上有所不同,但它们的主要功能都是存储 & 查询数据。

如果将 Elasticsearch 看作数据库,那么 Elasticsearch & MySQL 就是两个数据库。

我的疑惑是,在 Elasticsearch & MySQL 这两者搭配使用时

  1. 数据是怎样存储的?
    按照是否需要模糊搜索,可以将数据库表中的字段分为两类(参与模糊搜索的字段 / 不需要模糊搜索的字段)。那么,Elasticsearch 中是只存储 "参与模糊搜索的字段" 吗?
  2. 数据是怎样查询的?
    什么场景下只查询 Elasticsearch?有没有需要同时在 Elasticsearch & MySQL 中查询的场景?

例如,实现一个搜索商品的 "高级搜索" 功能,要求除了按照 "商品的名称" 这一字段模糊搜索外,同时还需要:

在这个例子里面,只有"商品的名称" 这一字段需要模糊搜索;"商品的卖家" & "商品的标签" 都是商品的 "关系",是按照 "关系" 查找;"商品的销量" 只用来排序

请问各位老哥,在这种场景下,数据该怎样在 Elasticsearch & MySQL 这两者间存储 & 查询

1628 次点击
所在节点    程序员
5 条回复
jhdxr
2023-03-25 09:03:57 +08:00
1. 如果我没有记错,ES 不推荐将自己当做首要存储( primary storage ,怎么翻比较好?。。。)。换言之,你最好保证在 ES 里的数据全丢了以后,你依然能够有别的来源重建它。
2. 倒排索引只是针对文本的检索,ES 也可以处理别的,比如数字、地理位置、向量等。(做没做好另说)
3. 你可以将在查询条件中会用到的数据全部导入 ES ,用它完成搜索拿到主键然后回 DB 去拿完整数据
lower
2023-03-25 15:33:10 +08:00
除了处理比较复杂的检索外,我觉得用于解决 db 分库分表后还想联合查的问题,应该挺有用处……
tisswb
2023-03-25 16:45:16 +08:00
数据首先需要写入 mysql ,然后通过管道触发进入 es 索引,各有各的强项与优势,以前做舆情项目的时候搞过。
Saxton
2023-03-25 17:47:17 +08:00
正好我做过这个业务,可以来回答回答

首先你要搞清楚 ES 和传统 DB 的区别,ES 一般只做检索,光没有事务这点就足以了
第二你要知道你想拿 ES 来做什么

我目前的做法是 ES 只做检索,只要系统上涉及到复杂检索的全部走 ES ,数据在写入时,热点数据同步写入 ES ,冷数据异步写入
ES 数据冗余为宽表数据,监听 binlog 来实现对冗余的字段进行更新。
Saxton
2023-03-25 17:49:59 +08:00
在 ES 中数据都是扁平的,没有关系的,ES 更喜欢扁平化的数据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/926998

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX