在大数据集中存储和匹配名称的有效方法

时间:2016-02-08 07:34:37

标签: java architecture full-text-search pattern-matching

对于像工具一样的数据丢失防护,我有一个要求,我需要查找不同类型的数据,如驱动程序的许可证号,社会安全号,名称等。虽然大多数这是基于模式的,因此可以查找使用模式匹配正则表达式,名称恰好是一个非常广泛的类别。几乎可以有任何可以形成名称的字符集。但是,为了使它成为有意义的查找,我想我应该只针对定义的名称字典查找它们。这就是我的想法。

提供名称字典作为配置项。对于每个用例,这看起来更合理,名称可能因地理区域而异。我正在寻找在Java中执行此操作的最佳实践。基本上这些都是问题 -

  1. 存储名称的好数据结构是什么。作为第一个选项,我想到了Set,有更好的选择,比如内存数据库。
  2. 我应该如何在大型数据集中搜索这些名称。这些数据集非常大,我只能逐行读取它们。
  3. 还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

查看concurrent-treesCQEngine个项目。

答案 1 :(得分:1)

您可以使用全文索引或在线搜索来完成。

我更喜欢全文索引,例如与Lucene。您必须定义索引器如何在文本中找到标记(通过定义标记模式和非关注模式)。

  • 已知模式(例如许可证号)应在索引时使用其类型进行注释。查询带注释类型的索引(例如许可证号)将返回所有包含的许可证号。
  • 灵活模式(如名称)应该作为标记索引。然后,您可以迭代合法名称的集合并使用它查询索引。
  • 这种方法不是最灵活的,但它对于更改数据文件集(简单地将新文件放到索引)或名称集(只是在索引中查询新名称)非常健壮。
  • 在这种方法中,如何存储名称组
  • 与性能无关

另一种方法是搜索多个字符串(名称)。请注意,对于多个字符串有特殊的搜索算法,并且大多数算法都有一个首选范围的参数(模式大小,字母大小,要搜索的模式数)。您可以在StringBench获得一些展示次数。

  • 此方法允许您使用更灵活的字符串模式。
  • 然而,对名称集的修改并不健全(然后必须重复完整的搜索)。
  • 多字符串通常会接受一组要搜索的字符串,但它们会以特定于算法的方式存储此集合(大多数使用trie)

编辑:

可以使用基于DFA的自动机进行多种模式/字符串的高效搜索。

我第一次有效搜索文字时选择dk.brics.automaton。它的自动机效率非常高,但它的优化是为了匹配而不是搜索(搜索以天真的方式进行)。

然后我转移到我自己的实现rexlex。它是基于DFA的,但比金砖四国略慢。搜索算法不像金砖四国那样天真,但增加了一些开销。

您找到link to a benchmark比较两者。基准测试可视化基于DFA的正则表达式的问题 - 如果正则表达式很大,编译这样的DFA的时间会非常昂贵。

我目前赞成多字符串/模式搜索的stringandchars实现。它专注于搜索性能,但我不知道它与上述解决方案的比较。在上面的解决方案中,在文本中搜索多个正则表达式模式的最常见情况将更加高效。