关于全文检索的一个问题(fts/分词)

2023-05-05 12:55:13 +08:00
 dzdh

最近在折腾 PGSQL 的 FTS 。中文索引支持的好的也就 zhparser 、jieba 几个。

在做索引的时候都是to_tsvector,结构是: 'keyword':pos1,pos2,pos3,类型是 text

搜索的时候 是 to_tsquery 结构是 'keyword1' & 'keyword2' 类型是 text

搜索的结果就看分词分的好不好。

测试的时候,看到一个测试的文章标题是'我请你吃一个大瓜吧'。

我就想用'吃瓜'这个词把这条数据检索出来,发现 title 的 吃瓜 不在一起,搜烂了也不可能被搜出来。

最后,问题是,用'吃瓜'来进行检索,这条数据应该能被检索出来吗?

1450 次点击
所在节点    PostgreSQL
9 条回复
yrj
2023-05-05 19:33:56 +08:00
按照语义,应该吧,但分词没有,好像不具备联想能力。所以除非按照单个字分词。。
dzdh
2023-05-05 21:45:26 +08:00
@yrj 就是 ABCDE ,搜 AC/AD/AE/CE/BD 啥的中间跨词、字的。

所以我现在做法是 按照 tsvector 的结构,自己按照英文按空格分,汉字一个个字独立存到单独的字段。

比如 高圆圆今天吃了一个瓜

我自己拼成 `'高':1 '圆':2,3 '今':4 '天':5 '吃':6 '瓜':10`

搜索的时候自动一样的中文挨个按字拆开中间用 & 拼成字符串。

搜索效果,还真不错
dzdh
2023-05-05 21:46:36 +08:00
只要不是正文 (只限文章标题、商品标题、分类名称 )混合一起搜,目前测试还不错。
yrj
2023-05-06 10:08:28 +08:00
@dzdh 你这不就是我说的按照单个字拆分么,就是不知道内容多了会不会有问题。
flyingfz
2023-05-06 15:08:54 +08:00
推荐一个东西:[meiliSearch]( https://github.com/meilisearch/meilisearch)
一个搜索引擎,类似 ES, 但轻量一些。
支持中文,内置分词,貌似用它来做搜索,比用 pg 合适一些,pg 还是用它来存数据吧 。
dzdh
2023-05-06 15:11:14 +08:00
@flyingfz 用过,还有 zincsearch 、tantivy ,meili 纯内存,耗不住啊。
flyingfz
2023-05-06 15:16:01 +08:00
😂 我是简单测试过,当时测试的搜索结果还可以。

看到还是会用到磁盘的,猜测不全是内存。
dzdh
2023-05-06 15:17:55 +08:00
@flyingfz 不晓得当初看文档是 memory search engine 。50w 数据内存 8G 撑爆了
flyingfz
2023-05-06 15:29:29 +08:00
https://www.meilisearch.com/docs/learn/advanced/storage#memory-usage

确实是把磁盘上的索引映射到内存了。

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

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

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

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

© 2021 V2EX