我对用于Elasticsearch的regexp查询有一些问题。在我的索引中,有一个文本字段,用逗号分隔的数字值(ID),例如。
2,140,3,2495
我有以下查询词:
"regexp" : {
"myIds" : {
"value" : "^2495,|,2495,|,2495$|^2495$",
"boost" : 1
}
}
但是我的结果列表为空。
让我说,我知道正则表达式查询有点慢,但是索引仍然存在,并且充满了数百万个文档,因此很遗憾,它不是重构它的选择。所以我需要一个正则表达式解决方案。
答案 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太复杂而无法处理。
有没有一种方法可以简化正则表达式或重新构造自己的查询?