我们正在编写一个小型搜索引擎。数据库表:
Documents (DocumentID, Title, Abstract, Author, ...)
InvertedIndex (DocumentID, Word, Count)
Stopwords (Word)
其中InvertedIndex为每个文档中的每个单词都有一个条目及其出现的次数。停用词只是我不关心的单词列表。查询引擎,并用或分隔的术语列表。例如:
...等。搜索结果基于相关性,使用布尔扩展模型为每个文档计算。和-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点钟,我可能没有很好地解释这一点。
答案 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)
)
祝你好运。让我们知道结果如何!