最有效的方式/库来检测数十亿行中的预定义关键字?

时间:2012-08-05 12:00:24

标签: java solr lucene string-matching fuzzy-search

假设我有几十亿行文字和几百万个“关键字”。任务是通过这些行,看看哪一行包含哪些关键字。换句话说,给定(K1 -> V1)(K2 -> V2)的地图,创建(K2 -> K1)的地图,其中K1=lineIDV1=textK2=keywordID和{{ 1}}。另请注意:

  • 所有文字/关键字均为英文
  • 文字(V1)可能包含拼写错误。
  • 大多数关键字(V2)都是单个字词,但有些关键字可能包含多个英文字词(例如“干净毛巾”)

到目前为止,我最初的想法是:

V2=keyword

我的问题

  • 这是一个好方法吗?效率非常重要 - 有没有更好的方法?有什么需要改进吗?
  • 我可以使用任何库吗?最好是适合Java的东西。

提前致谢!

2 个答案:

答案 0 :(得分:0)

有一些优化的多模式/ 2D搜索算法。不再发明轮子。你还应该考虑分配你的计算。也许hadoop和map / reduce?

答案 1 :(得分:0)

不确定但你在这里期待的是什么(K2-> K1)与倒排索引(http://en.wikipedia.org/wiki/Inverted_index)非常相似。

我相信Lucene / Solr在索引数据时使用相同的算法(它也会进行预数据分析/标记化),您可能需要找出一种可以读取Lucene构建索引的方法(以Lucene的“IndexReader”javadoc开头)。

在索引数据时,将每行视为Lucene索引中的一个文档,在索引中创建两个字段1)行ID和2)数据 - 一旦索引所有文档(行),您已经为K2创建了> K1你,你只需要找到解析它的方法。

我不确定在创建K2-> K1后你的下一步是什么,如果它比你不需要解析你的索引更快的查找,你可以解雇Lucene查询。

在SOLR中,如果有帮助,您还可以在索引上生成分面搜索结果。

修改 您可以使用LUKE工具分析Lucene索引(https://code.google.com/p/luke/