【问题标题】:Searching for Social security number using Lucene 4 regexp使用 Lucene 4 正则表达式搜索社会安全号码
【发布时间】:2014-03-29 02:14:39
【问题描述】:

我正在尝试使用 Lucene 4 Regexp 查询来查找社会保险号。如果使用 StandardAnalyzer 或 EnglishAnalyzer 分析该字段,是否还有一些方法可以匹配 222-33-4444222 33 4444 等字符串。

据我所知,这些分析器标记了 SSN 的组件,然后无法捕获 3 个组件的连续匹配。理想情况下,我希望222 33 4444 匹配"/[0-9]{3}/ /[0-9]{2}/ /[0-9]{4}/" 之类的内容,但这似乎不是因为短语查询不适用于正则表达式(是吗?)有什么建议吗?

【问题讨论】:

  • 我们可以知道为什么您要查找 SSN 吗?
  • 它是一种取证类型的软件,供人们查找和编辑敏感信息。

标签: regex lucene


【解决方案1】:

如果您只有一个标识符字段或类似的字段,请使用 StringField 或其他一些未标记的字段,在这种情况下,简单的 RegExpQuery 很容易定义。

如果您尝试将它们从必须标记化的全文字段中提取出来(我假设是这种情况),您可以使用SpanQuery API 来构造适当的查询:

SpanQuery span1 = new SpanMultiTermQueryWrapper(new RegexpQuery(new Term("text", "[0-9]{3}")));
SpanQuery span2 = new SpanMultiTermQueryWrapper(new RegexpQuery(new Term("text", "[0-9]{2}")));
SpanQuery span3 = new SpanMultiTermQueryWrapper(new RegexpQuery(new Term("text", "[0-9]{4}")));

Query query = new SpanNearQuery({span1, span2, span3}, 0, true);

searcher.search(query, maxResults)

【讨论】:

    【解决方案2】:

    您可以使用 INTERVAL 标志:

    /<000-999>/ /<00-99>/ /<0000-9999>/
    

    > INTERVAL

    【讨论】:

    • 不幸的是,这将匹配任何具有 2、3 或 4 位数字字符串的任何文档。我需要匹配 3、2、4 位的连续字符串。
    • 那为什么不/&lt;000-999&gt;&lt;00-99&gt;&lt;0000-9999&gt;/
    • 与 222 33 4444 不匹配
    • 它应该匹配222 33 4444吗?在您的问题中,您说您希望 222 33 4444 匹配正则表达式 - 它是什么?你试过带空格的间隔吗? /&lt;000-999&gt; &lt;00-99&gt; &lt;0000-9999&gt;/,这可能会有所帮助。
    【解决方案3】:

    我不知道 lucene,但这个正则表达式有效:

    '\d{3}[ \-]\d{2}[ \-]\d{4}'
    

    两者都匹配:

    222 33 4444222-33-4444

    【讨论】:

    • 很遗憾,在 Lucene 中无法使用已分析的字段。通常,打赌你并不真正需要知道附带的详细信息是足够安全的,因为正则表达式是正则表达式,但在这种情况下不是。
    • @femtoRgon SpanQuery 在我的情况下确实有效。非常感谢。从最近几天开始,我一直在寻找解决方案,如果您昨天没有添加评论,我无法得到您的答案。 stackoverflow.com/questions/27942207/…
    猜你喜欢
    • 2021-06-22
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2011-09-02
    相关资源
    最近更新 更多