【问题标题】:Mysql query of inverted index data倒排索引数据的mysql查询
【发布时间】:2014-05-08 10:38:41
【问题描述】:

我在网站中有数千个页面,我将其解析并存储为倒排索引即

文档

  • docid (PK,FK)
  • 网址
  • 字符数
  • 字数

Charactercount 和 wordcount 帮助我确定长文档和短文档,以便以后使用。

单词

  • wordid (PK,FK)
  • doc_freq
  • inverse_doc_freq

对于 inverse_doc_freq 计算,我使用虚构的高数 (100000000) 来防止总文档重新计算。

定位

  • wordid
  • 文档
  • word_freq
  • 重量

(wordid & docid 组合唯一)

权重是根据标题中的单词 + url 中的单词 + 单词频率等简单基础计算得出的分数。

我在为搜索词构建 sql 查询时遇到问题。对于 3 字搜索,我正在这样做

  1. 将查询分解为每个单词
  2. 检查每个单词的 inverse_doc_freq 并移除低 idf 单词(移除停用词)
  3. 词干剩余的单词(假设还剩下 3 个单词)
  4. 查询每个单词

我在第 4 阶段卡住了!我的 SQL 查询是这样的

SELECT d.docid,url,inverse_doc_freq,word_freq,weight from document d,word w,loc l WHERE d.docid=l.docid AND w.wordid=l.wordid AND (word='word1' OR word='word2' OR word='word3') ORDER BY weight DESC

返回的文件不正确。相信我可能必须搜索三次才能找到每个单词的文档,然后尝试找到常见的文档,但是如何?是否可以只使用 1 个 MySQL 查询?也可以使用TF-IDF 吗?

【问题讨论】:

  • “返回的文件不正确”是什么意思?
  • 存在重复文件。虽然最好显示包含所有 3 个单词的文档,但当前查询仅显示包含 1 个常用单词的文档,如果我将 OR 更改为 AND 然后它显示零个文档。 ;-(

标签: php mysql sql inverted-index


【解决方案1】:

您需要在文档级别进行聚合。

select d.docid, d.url, sum(weight) as weight
from document d join
     loc l
     on d.docid = l.docid join
     word w
     on w.wordid = l.wordid
where w.word in ('word1', 'word2', 'word3')
group by d.docid
order by weight DESC;

【讨论】:

  • 感谢您的回答。你为什么使用sum 而不是distinct d.docid,因为稍后也可能会给出单一的结果?是否可以过滤包含所有 3 个单词的文档的结果?
  • @jahajee.com 。 . .你几乎不需要select distinct。您可以改用group by。在这种情况下,group by 需要 sum()
  • 谢谢我重新计算了重量,现在看起来很完美。相信 SUM 需要为每个单词添加所有权重计算(我以前不明白)。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多