java - Elasticsearch 中的模式匹配?

标签 java elasticsearch lucene

继续我之前的post ,我已根据 femtoRgon 的 post 更改了查询Elastic Search 不支持某些字符和 anchor 。

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

假设,在索引文档中,我想找到所有具有与“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 demo

关于java - Elasticsearch 中的模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942207/

相关文章:

elasticsearch - 无法编写扩展方法以包装NEST客户端方法

java - @Validated 注解无效

java - ubuntu 16 上的 Tomcat 8.5.15 内存不足错误

java - Dwr回调 "data"对象长度

node.js - ionic+firebase+elasticsearch 无法使用 elasticsearch.js 进行身份验证

lucene - 是否可以遍历存储在 Lucene Index 中的文档?

java - Apache 紧缩 : how to create custom counters

elasticsearch - Kibana Elasticsearch-缺少索引

java - 当需要分析停用词时,如何使用 Lucene 忽略停用词搜索?

lucene查询在一个字段中模糊而在另一字段中精确