Apache Lucene:在字符串之间创建索引并进行智能搜索

时间:2018-05-31 00:33:24

标签: lucene

我的问题如下:假设我有三个文件。 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。但是,我不完全确定这是否有效。我正在浏览文档以获得一些想法。

我的主要要求如下:

  1. 将有3个文本文件,其中包含信号的完整路径。 (如果有助于更快地构建索引器,我可以调整格式以使其更紧凑。)

  2. 构建索引应该相当快(需要几个小时)。上面的文件是静态的(没有修改)。

  3. 搜索应该是全面的。如果它需要~1s /搜索但是匹配应该支持直接匹配,正则表达式匹配和编辑距离匹配,这是可以的。主要挑战是每个文件可以有100-150万个信号。

  4. 有人可以告诉我Lucene是否可以轻松解决这样的用例?建立索引和快速/快速搜索的正确方法是什么?我想写一些概念验证代码并测试性能。感谢。

1 个答案:

答案 0 :(得分:1)

我认为根据您的要求,最佳解决方案是具有给定测试条目集的PoC。基于此,应该可以评估您希望实现的目标索引时间。因为您只使用静态信息,所以更容易,因为不必关心NRT(近实时搜索)等主题。

我个人从未使用过lucene这么大的信息集,但我认为lucene能够处理这个问题。

我将如何做到:

  
      
  • 阅读有关lucene,索引,搜索和了解其工作原理的教程和最佳实践
  •   
  • 定义索引数据集,例如每个文件1000行
  •   
  • 定义您的lucene文档结构
  •   
     

这非常重要,因为基于此你将适用你的   搜索。如果需要,请注意分析任务,如tokanization   如何。如果您需要全文搜索关心TextField。

     
      
  • 编写简单索引的代码
  •   
     

使用索引运行小测试并使用Luke

检查索引      
      
  • 编写简单搜索的代码
  •   
     

定义查询和预期结果。执行搜索并检查   结果

尝试构建代码。单独索引和搜索 - >重构会更容易。