【问题标题】:pattern matching in elastic search?弹性搜索中的模式匹配?
【发布时间】:2015-03-12 14:14:24
【问题描述】:

从我之前的 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”)。

请帮忙。

【问题讨论】:

标签: java elasticsearch lucene


【解决方案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-]"));

检查找到的数字之前或之后是否没有其他数字或破折号。它确实需要在匹配之前和之后有 some 字符,因此这不会捕获将社会安全号码作为 very beginningvery结束

Regex101 demo

【讨论】:

  • @Ashish 让我们谈谈该答案的 cmets 中的答案:P 您可以从 Regex101 演示中看到它适用于所有 3 种正则表达式风格。我猜问题出在FilterBuilderelastic search 的另一部分。
  • 好的。是的,这个问题可能与弹性搜索有关。我正在寻找那个问题。感谢您的帮助。
  • 我认为 - 问题在于索引为 当它被索引时,它没有被索引为一个术语“457-55-5462”,而是作为 3 个术语:“457”、“55”和“5462” .这就是为什么我的词条搜索找不到这个词条的原因。 elastic search 在索引时删除连字符。 :(
  • xxx-xx-xxxx 不是xxx-xxxx-xx,但可以肯定你可以用空格替换{3}{2} 之后的-。我正在阅读他们的一些正则表达式引擎,但意义不大。他们说 ababab(...)+ 不匹配,好像该字符串中没有 3 个字符?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多