用纯HTML内容索引PostgreSQL数据库的最佳方法?

问题描述

我有一个数据库,其中包含几百万个帖子,每个帖子的“内容”列均以纯HTML格式包含帖子内容

<div class="quoteheader"><a href="http://website.com/message?id=52501">
Quote from: X on October 22,2013,02:07:08 PM</a>
</div>
<div class="quote">
Hi,how are you all?
<br></div>
<br>I'm good,how about you?

我想制作一个完整的搜索工具,使人们可以搜索帖子。在这种情况下,有人可以搜索“你好吗”,这将导致发布该帖子。

我考虑过使用gin创建ts_vector索引:

CREATE INDEX posts_content_search ON posts using gin(to_tsvector('simple',content));

允许进行此类搜索

SELECT * FROM posts WHERE to_tsvector('simple',content) @@ phraseto_tsquery('simple','how are you');

但是,在创建它时,不仅会不断显示很多消息:

DETAIL:  Words longer than 2047 characters are ignored.
NOTICE:  word is too long to be indexed

,但它也将html标签保存在索引中(例如:div,b,a,br ...),而最好的方法删除标签并仅对帖子的真实内容进行索引(“嗨,所有人”和“我很好,你呢”)

创建索引以允许此类搜索的最佳方法是什么?

解决方法

strip(to_tsvector('simple',content))的输出中可以看出,

'simple'已经排除了html标记的内容:

                                                         strip                                                         
-----------------------------------------------------------------------------------------------------------------------
 '02' '07' '08' '2013' '22' 'about' 'all' 'are' 'from' 'good' 'hi' 'how' 'i' 'm' 'october' 'on' 'pm' 'quote' 'x' 'you'

请注意缺少'br','div'等

包含“来自:X的报价”部分,因为该部分不在标签中。如果您想排除这种情况,那么您想使用什么逻辑呢?

有关长字的警告可以忽略。如果您需要有关修复它们的建议,则应向我们展示产生它们的示例。