弹性搜索中的模式匹配?

继续我之前的post ,我根据femtoRgon的post更改了查询,弹性搜索不支持某些字符和锚点。

我正在寻找匹配模式的方式,如“xxx-xx-xxxx”,以便使用elastic search带有社会安全号码的文档。

让我们假设,在索引文档中,我想找到所有那些社会安全号码与“xxx-xx-xxxx”模式匹配的文档。

索引文档的示例代码:

 InputStream is = null; try { is = new FileInputStream("/home/admin/Downloads/20121221.doc"); ContentHandler contenthandler = new BodyContentHandler(); Metadata metadata = new Metadata(); Parser parser = new AutoDetectParser(); parser.parse(is, contenthandler, metadata, new ParseContext()); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) is.close(); } 

用于搜索的示例代码

 QueryBuilder queryBuilderFullText = null; queryBuilderFullText = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.regexpFilter("_all", "[0-9]{3}?[0-9]{2}?[0-9]{4}")); SearchRequestBuilder requestBuilder; requestBuilder = client.prepareSearch() .setIndices(getDomainIndexId(project)) .setTypes(getProjectTypeId(project)) .setQuery(queryBuilderFullText); SearchResponse response = requestBuilder.execute().actionGet(ES_TIMEOUT_MS); SearchHits hits = response.getHits(); if (hits.getTotalHits() > 0) { System.out.println(hits.getTotalHits()); } else { return 0l; } 

我正在点击以下内容:

 45-555-5462 457-55-5462 4578-55-5462 457-55-54623 457-55-5462-23 

但根据我的要求,它应该只返回“457-55-5462”(基于模式匹配“xxx-xx-xxxx”)。

请帮忙。

看到^$\d不能使用,我会这样做:

 [^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-] 

或者在Java中:

 FilterBuilders.regexpFilter("_all", "[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-]")); 

在找到的号码之前或之后检查的是没有其他号码或破折号。 它确实需要在比赛前后有一些角色,所以这不会捕获社会安全号码作为开头结尾的文件

Regex101演示

你忘了添加-之前? 在你的正则表达式,并在必要时使用锚点。

 "[0-9]{3}-?[0-9]{2}-?[0-9]{4}" 

要么

 "^[0-9]{3}-?[0-9]{2}-?[0-9]{4}$"