挑战!复杂的MySQL查询

时间:2011-05-04 06:06:15

标签: mysql sql

我们正在编写一个小型搜索引擎。数据库表:

Documents (DocumentID, Title, Abstract, Author, ...)
InvertedIndex (DocumentID, Word, Count)
Stopwords (Word)

其中InvertedIndex为每个文档中的每个单词都有一个条目及其出现的次数。停用词只是我不关心的单词列表。查询引擎,并用或分隔的术语列表。例如:

  • term1 term2
  • term1或term2
  • term1 term2或term3

...等。搜索结果基于相关性,使用布尔扩展模型为每个文档计算。和-ed术语(所有未被记录的术语)相乘,并将ors相加。例如,考虑查询term1 term2或term3,如果术语分别在文档中出现3次,4次和5次,则文档相关性将为(3 * 4)+5 = 12.此外,忽略停用词中存在的术语

现在好了......我的教授告诉我们,计算所有文档的相关性可以在一个查询中完成。这就是我需要帮助的地方。

我为示例查询 term1 term2或term3 准备了一些伪代码。这就是我如何计算每个文档的相关性,但我想执行一个MySQL查询。我将此列为相关公式的澄清。

foreach document
    relevance = 0
    foreach term_set // where (term1 term2) would be a term_set and (term3) would be the other
        product = 1
        foreach term
            if term not in stopwords
                SELECT Count FROM InvertedIndex WHERE Word=term AND DocumentID=document
                product *= Count
        relevance += product

(EXP(SUM(LOG(COALESCE(Column,1)))显然是一种执行aggregate multiplication的方式。

非常感谢任何帮助。对不起,如果这是一件苦差事。这是2点钟,我可能没有很好地解释这一点。

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,这可能会帮助你开始(但你必须检查语法,因为我的MySQL生锈了):

Select DocumentId, Word, Count
From Documents
Inner Join InvertedIndex On Documents.DocumentID = InvertedIndex.DocumentID
Where Word In (term1, term2, term3)

此查询将为您提供DocumentIds列表,“搜索”术语以及包含搜索词的每个文档的计数。你可以使用它作为聚合DocumentId的起点,使用Group By DocumentId,然后计算你的聚合乘法函数(我很乐意留给你)。

我还没有足够的MySQL知道如何排除Stopwords表中的单词(你可以在SQL Server中使用EXCEPT),但是这样的东西可能有效:

Select DocumentId, Word, Count
From Documents
Inner Join InvertedIndex On Documents.DocumentID = InvertedIndex.DocumentID
Where Word In (term1, term2, term3)
And Where Not Exists (
    Select DocumentId, Word, Count
    From Documents
    Inner Join InvertedIndex On Documents.DocumentID = InvertedIndex.DocumentID
    Inner Join Stopwords On InvertedIndex.Word = Stopwords.Word
    Where Word In (term1, term2, term3)
)

祝你好运。让我们知道结果如何!