我的问题如下:假设我有三个文件。 A,B和C.这些文件中的每一个都包含100-150M个字符串(每行一个)。每个字符串都采用分层路径的格式,如/ e / d / f。例如:
File A (RTL):
/arbiter/par0/unit1/sigA
/arbiter/par0/unit1/sigB
...
/arbiter/par0/unit2/sigA
File B (SCH)
/arbiter_sch/par0/unit1/sigA
/arbiter_sch/par0/unit1/sigB
...
/arbiter_sch/par0/unit2/sigA
File C (Layout)
/top/arbiter/par0/unit1/sigA
/top/arbiter/par0/unit1/sigB
...
/top/arbiter/par0/unit2/sigA
我们可以在硬件建模语言中考虑与电路信号对应的文件A.文件B对应于示意网表中的电路信号。文件C对应于布局中的电路信号(用于制造)。
现在,信号将具有文件A< - >之间的映射。文件B< - >文件C.例如,在这种情况下,/ arbiter / par0 / unit1 / sigA == / arbiter_sch / par0 / unit1 / sigA == / top / arbiter / par0 / unit1 / sigA。当然,这种关联(等价)是由我建立的,我不希望匹配者为我解决这个问题。
现在说,我给'/ arbiter / par0 / unit1 / sigA'。在这种情况下,匹配器应该从文件A返回直接匹配,因为它找到了。对于文件B / C,无法进行直接匹配。那么它应该返回最好的匹配(即编辑距离?)所以在这个例子中,它可以从文件B中提供/ arbiter_sch / par0 / unit1 / sigA,从文件C中提供/ top / arbiter / par0 / unit1 / sigA。 / p>
我可以提供类似* par0 * unit1 * sigA的内容而不是提供完整的字符串搜索,它应该给我所有可能的文件A / B / C匹配。
我正在寻找解决方案,并遇到了Apache Lucene。但是,我不完全确定这是否有效。我正在浏览文档以获得一些想法。
我的主要要求如下:
将有3个文本文件,其中包含信号的完整路径。 (如果有助于更快地构建索引器,我可以调整格式以使其更紧凑。)
构建索引应该相当快(需要几个小时)。上面的文件是静态的(没有修改)。
搜索应该是全面的。如果它需要~1s /搜索但是匹配应该支持直接匹配,正则表达式匹配和编辑距离匹配,这是可以的。主要挑战是每个文件可以有100-150万个信号。
有人可以告诉我Lucene是否可以轻松解决这样的用例?建立索引和快速/快速搜索的正确方法是什么?我想写一些概念验证代码并测试性能。感谢。
答案 0 :(得分:1)
我认为根据您的要求,最佳解决方案是具有给定测试条目集的PoC。基于此,应该可以评估您希望实现的目标索引时间。因为您只使用静态信息,所以更容易,因为不必关心NRT(近实时搜索)等主题。
我个人从未使用过lucene这么大的信息集,但我认为lucene能够处理这个问题。
我将如何做到:
- 阅读有关lucene,索引,搜索和了解其工作原理的教程和最佳实践
- 定义索引数据集,例如每个文件1000行
- 定义您的lucene文档结构
这非常重要,因为基于此你将适用你的 搜索。如果需要,请注意分析任务,如tokanization 如何。如果您需要全文搜索关心TextField。
- 编写简单索引的代码
使用索引运行小测试并使用Luke
检查索引
- 编写简单搜索的代码
定义查询和预期结果。执行搜索并检查 结果
尝试构建代码。单独索引和搜索 - >重构会更容易。