python - Lucene 位置索引如何如此高效地工作?
问题描述
通常,任何搜索引擎软件都会创建倒排索引以加快搜索速度。基本格式是:-
word: <docnum ,positions>, <docnum ,positions>, <docnum ,positions> .....
每当在引号内有搜索查询时,"Harry Potter Movies"
这意味着单词的位置应该完全匹配,并且在像 k 单词查询这样的搜索中hello /4 world
,通常意味着在左侧或右侧的 4 个单词距离范围内找到单词 world你好这个词。我的问题是我们可以采用线性检查帖子和计算查询中的单词距离等解决方案,但如果集合真的很大,我们无法真正搜索所有帖子。那么是否有任何其他数据结构或优化 lucene 或 solr 使用?
第一个解决方案可以只为每个单词搜索一些 k 帖子。其他解决方案可以只搜索顶级文档(在索引期间通常称为按 tf-idf 或类似排序的冠军列表),但可以忽略更多更好的文档。两种解决方案都有一些缺点,它们都不能保证质量。但在 Solr 服务器中,即使在大型集合中,我们也能获得有保证的结果质量。如何?
解决方案
您在此处询问的短语查询实际上对于计算其位置非常有效,因为您正在询问出现“Harry”和“Potter”和“Movies”的文档。
Lucene 非常聪明,但其算法的核心是它只需要访问所有这三个术语都出现的文档的位置列表。
Lucene 的帖子也被分片成多个文件: counts-files 里面是:(Document, TF, PositionsAddr)+ Positions-files 里面是:(PositionsArray)
所以它可以为这三个词中的每一个扫过(doc, tf, pos_addr),并且只有当所有三个词都出现在特定文档中时才查询PositionsArray。短语查询有机会非常快,因为您最多只能访问最不常用词的所有文档。
如果您想看到一个短语查询运行缓慢(并且进行大量磁盘搜索!),请尝试:“to be or not to be”……这里的 AND 部分没有多大帮助,因为所有术语都很常见。
推荐阅读
- rust - AsRef 的 impl 是如何实现的
为 PathBuf 工作? - javascript - 无法将数据文件发送到后端reactjs
- python - 在python中缩小非常大的If语句
- excel - 具有不同行和列中可用条件的 Excel 条件查找
- javascript - forEach 中的 EventLister 参数需要错误(工具提示)
- actionscript-3 - Animate 2021 动作脚本 3 URLRequest 导致错误 2035
- ios - DispatchQueue 线程并不总是设置正确的结果
- python - 通过 Gunicorn 运行 Flask Restplus API
- java - 如何拼贴预订日期输入并以 LocalDate 格式返回,并使用布尔值验证年/月/日值?
- javascript - 如何将多个链接添加到图像的某些部分