【问题标题】:How to search an inverted index implemented in SQL for multiple words?如何在 SQL 中实现的倒排索引中搜索多个单词?
【发布时间】:2016-01-26 15:06:18
【问题描述】:

我正在尝试为 commnets 的 SQL 数据库制作搜索引擎。我在网上读到,最好的方法之一是制作倒排索引。

我的倒排索引表如下。如果这不正确并且需要更改,请告诉我,这很容易完成。

您可以使用此设置相当轻松地找到一个单词,如下所示:

SELECT comment_terms.term, comment_terms.frequency, comments.body FROM     comment_terms
INNER JOIN comments ON comment_terms.comment_name = comments.name
WHERE comment_terms.term = 'reddit'
ORDER BY frequency DESC

这给了你这张桌子:

term   | frequency | body
-------+-----------+-------
reddit |        24 | etc..

但我想知道如何搜索多个词,以便返回结果的正文必须包含您搜索的所有词。如果我需要重新调整我的桌子来实现这一点,请告诉我。干杯。

预期输出

我期待这样的事情:

GET COMMENTS THAT HAVE 'pig', 'dog'


| comment      |
|--------------|
| that pig dog |
| ...pig...dog |

【问题讨论】:

  • 标记使用的 dbms,因为这不在 ANSI/ISO SQL 标准中。
  • 你在找sql full text search
  • jarlh - 我列出的 SQL 的哪一部分不是标准的一部分?
  • 你能发布一个预期输出的样本吗?
  • 对于多个术语,我会使用类似联合功能的东西 IF 我别无选择在其他地方做。所以我在这里会有点烦人,问你为什么要尝试在 SQL 中发明一个搜索功能,当很多存在在 SQL 之外执行得更好的时候,比如 Lucene?您尝试做的事情将开始变得越来越糟糕,因为您的搜索数据越多越复杂。只是一个想法,您的时间可能会更好地花在完全不同的方法上。

标签: sql inverted-index


【解决方案1】:

一般做法:

零!您的comment_terms 表应该有这些字段(Id,CommentId,TermId

首先您已经获得了搜索查询的所有单词。 例如,dogid 为 1,pigid 为 2。

第二您在 comment_terms 中搜索具有 Id(1 和 2)并且在 comment_terms 表中也有 2 条记录的 cmets(GROUP BY HAVING COUNT(commentId)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 2014-03-02
    • 1970-01-01
    • 2012-02-19
    • 2011-10-06
    • 1970-01-01
    • 2011-04-26
    • 2020-07-19
    相关资源
    最近更新 更多