用于Elasticsearch的正则表达式查询错误

时间:2018-06-28 07:37:17

标签: regex elasticsearch

我对用于Elasticsearch的regexp查询有一些问题。在我的索引中,有一个文本字段,用逗号分隔的数字值(ID),例如。

2,140,3,2495

我有以下查询词:

"regexp" : {
  "myIds" : {
    "value" : "^2495,|,2495,|,2495$|^2495$",
    "boost" : 1
  }
}

但是我的结果列表为空。

让我说,我知道正则表达式查询有点慢,但是索引仍然存在,并且充满了数百万个文档,因此很遗憾,它不是重构它的选择。所以我需要一个正则表达式解决方案。

2 个答案:

答案 0 :(得分:0)

在ElasticSearch正则表达式中,模式默认为锚定,^$被视为文字字符。

您要使用的意思是在字符串的开头"2495,.*|.*,2495,.*|.*,2495|2495"-2495,,在字符串的中间,2495,,在结尾的,2495或等于{ {1}}。

或者,您可以使用更简单的

2495

那是

  • "(.*,)?2495(,.*)?" -以(.*,)?结尾的可选文本(不包括换行符)
  • ,-您的价值
  • 2495-以(,.*)?结尾的可选文本(不包括换行符)

这里是online demo showing how this expression works(虽然不是证明)。

答案 1 :(得分:0)

好的,我可以使用它,但是现在遇到另一个问题。我建立了如下字符串:

(.*,)?2495(,.*)?|(.*,)?10(,.*)?|(.*,)?898(,.*)?

对于一些ID来说效果很好,但是如果我说有50个ID,那么ES会抛出一个异常,表明regexp太复杂而无法处理。
有没有一种方法可以简化正则表达式或重新构造自己的查询?