我有一个包含新闻帖子的表,该表中的一个字段是"tags"字段,其中包含逗号分隔的标签列表-为什么会出现这种情况无关紧要,因为这是一个遗留表,标签现在无法移植到另一个表,并且可能不会对表结构或应用程序的功能进行任何更改。
我正在尝试确定查询数据库以查找具有类似标签的帖子的最佳方式。
有人有比拆分和修剪标记字段以及执行LIKE查询更好/更智能的解决方案吗?
如果你不能触摸数据库,你能在数据库外部添加一个额外的搜索索引吗,例如Lucene或Sphinx?
如果我们不是在谈论潜在的大量数据,您甚至可以使用ZF的Zend_Search_Luce来实现Lucene索引,而无需任何外部服务/软件安装等。
然后,您可以按标签对帖子进行索引,使用索引查找具有特定标签(或标签和其他属性的组合)的帖子,并根据Lucene返回的ID从DB中获取相关结果。
您可以创建一个tags
表,以及tags
和posts
表之间的多对多tags_posts
表。
然后,您可以将posts.tags
列迁移到tags
和tags_posts
中。
最后,您可以查询tags_posts
而不是posts.tags
。
转移到sphinx/lucene架构需要做一些工作,这将比将标签转移到单独的表更困难。最简单的解决方案是,您可以运行类似于WHERE instr(concat(",", tags_field,","), ',php,') > 0