在我的 Lucene 索引 (v7.2) 中创建文档时,我uid向其中添加了一个包含唯一 ID/键(字符串)的字段:
doc.add(new StringField("uid",uid,Field.Store.YES))
Run Code Online (Sandbox Code Playgroud)
为了稍后检索该文档,我为给定的唯一 id 创建了一个 TermQuery 并使用 IndexSearcher 进行搜索:
searcher.search(new TermQuery(new Term("uid",uid)),1)
Run Code Online (Sandbox Code Playgroud)
作为一个Lucene“新手”,我想知道以下几点:
我应该如何改进这种方法以获得最佳查找性能? 例如,如果我将唯一 id 存储为字节数组而不是字符串,它会有所不同吗?或者是否有一些可以使用的特殊编解码器或过滤器?
通过唯一 ID 查找文档的时间复杂度是多少?由于索引至少包含每个文档的一个唯一术语,查找时间将随文档数量(O(n))线性增加,对吗?
有一篇关于 Lucene 术语索引和查找性能的博客文章。它清楚地揭示了通过 id 查找文档的复杂性的所有细节。这篇文章很旧了,但自那以后没有任何改变。
\n\n以下是与您的问题相关的一些要点:
\n\n令 term 为单个字符串,令 term 字典为一大组术语。如果我们有一个术语字典,并且需要知道字典中是否有单个术语,则 trie(以及作为子类的最小确定性非循环有限状态自动机 (DAFSA))是可以帮助我们的数据结构。关于你的问题:\xe2\x80\x9c如果哈希查找可以做同样的事情,为什么要使用尝试?\xe2\x80\x9d,这里有几个原因:
\n\n以下是 3 个术语的 DAFSA 示例:bath、bat 和 batch:\n
在进行键查找时,请注意,降低自动机(或特里树)中的单个级别是在恒定时间内完成的,并且每次算法降低自动机(特里树)中的单个级别时,都会从术语中删除一个字符,所以我们可以得出结论,在自动机(trie)中找到一个项可以在 O(L) 时间内完成。
\n| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |