有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

弹性搜索中的java模式匹配?

继续前面的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) 个答案

  1. # 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

  2. # 2 楼答案

    你忘了在正则表达式中的-之前添加?,必要时还可以使用锚

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

    或者

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