使用Lucene 4 regexp搜索社会安全号码

时间:2014-03-29 02:14:40

标签: regex lucene

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

据我所知,这些分析器会对SSN的组件进行标记,然后无法捕获3个组件的连续匹配。理想情况下,我希望222 33 4444能够匹配"/[0-9]{3}/ /[0-9]{2}/ /[0-9]{4}/"这样的内容,但它似乎也不是因为短语查询不能与regexp一起使用(是吗?)建议?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以使用 INTERVAL 标志:

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

<强> > INTERVAL

答案 2 :(得分:-1)

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

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

它匹配两者:

222 33 4444222-33-4444