1

我有一个大约 lucene 索引。100 万份文件。从这些文件中,我想挖掘

  1. 电子邮件地址
  2. 签名 - ( [whitespace]/s/[whitespace]john doe[whitespace] )
  3. 每个文档的特定标识符(遵循正则表达式模式"\s[0-9]{3}[a-zA-Z0-9]{6}\s")。

我知道理想情况下在索引构建期间使用 solr 会容易得多,但是如何从构建的 lucene 索引中做到这一点?

我正在使用java。对于电子邮件地址搜索,我尝试使用.setAllowLeadingWildcard(true)然后搜索@以查找所有电子邮件地址 - 但实际上我得到的结果为零。如果我在 luke 中搜索@我得到零结果。如果我在 luke 中搜索@hotmail.com,我会得到一堆包含有效电子邮件地址的结果,例如 aaaaa@hotmail.com。

该索引是使用StandardAnalyzer创建的。不确定是否重要,但我相信文本是 UTF-8 格式的。

任何有用的建议,指针都很棒!请注意,这不适用于前端,因此查询不必接近实时。

4

1 回答 1

1

分析确实很重要,是的。标准分析器会将空格和标点符号(例如 @)视为将输入拆分为标记的位置。因此,您不会期望看到它们中的任何一个实际存在于索引数据中。

您可以使用 Lucene 的正则表达式查询,特别是对于第三种情况。我认为,PhraseQuery 似乎适合第二个,尽管我对您在那里尝试完成的工作有点困惑。

通常,您可能希望对电子邮件字段使用不同的分析器,以便将其用作单个令牌。搜索特定电子邮件地址应该会得到合理的结果,因为尽管分析器会删除标点符号,但在一个短语中连续搜索电子邮件的三个(通常)标记将有望获得良好的匹配。但是,像\w*@\w*\.\w*, 这样的正则表达式搜索不会特别有效,因为标点符号实际上不会被索引和搜索,并且正则表达式搜索不会跨越索引中的多个术语。除了搜索一组已知的电子邮件域或类似的东西之外,您还需要重新索引使用分析,以便更符合您需要如何搜索它以执行您所要求的操作。

于 2013-11-13T06:50:46.653 回答