弹性搜索中的模式匹配?
继续我之前的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}$"
- 在ElasticSearch中使用Java API时如何从JSON DSL构造QueryBuilder?
- elasticsearch将对象插入索引
- elasticsearch top命中聚合java API查询
- 在ElasticSearch中获取SearchResponse的结果
- elasticsearch – 没有为注册的查询]
- Elasticsearch – 使用java api删除嵌套对象无法正常工作
- elasticsearch – 返回字段的标记
- Elasticsearch – EdgeNgram + highlight + term_vector =错误的亮点
- 使用Apache HttpComponents Client签署AWS HTTP请求