弹性搜索中的模式匹配?

时间:2015-01-14 11:45:39

标签: java elasticsearch lucene

继续我之前的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")。

请帮忙。

2 个答案:

答案 0 :(得分:1)

看不到^$\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 demo

答案 1 :(得分:0)

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

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

OR

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