我尝试使用Lucene 4 Regexp查询来查找社会安全号码。如果使用StandardAnalyzer或EnglishAnalyzer分析字段,是否还有一些方法可以匹配222-33-4444
或222 33 4444
等字符串。
据我所知,这些分析器会对SSN的组件进行标记,然后无法捕获3个组件的连续匹配。理想情况下,我希望222 33 4444
能够匹配"/[0-9]{3}/ /[0-9]{2}/ /[0-9]{4}/"
这样的内容,但它似乎也不是因为短语查询不能与regexp一起使用(是吗?)建议?
答案 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)
答案 2 :(得分:-1)
我不知道lucene,但这个正则表达式有效:
'\d{3}[ \-]\d{2}[ \-]\d{4}'
它匹配两者:
222 33 4444
和
222-33-4444