我们有一个与此类似的映射:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}
}
这样的文件...... 1)TERM1-TERM2-TERM4-TERM3 2)TERM1-TERM2-TERM5-TERM3
使用像这样的表达式
GET /my_index/_doc/_search
{
"query": {
"regexp": {
"tag": "TERM1.*TERM3"
}
}
}
我可以匹配文档,因为我将整个关键字与正则表达式匹配。 但是我真正需要的匹配就像TERM2 - * - TERM3,其中*只与WORD匹配,而不是与许多单词匹配。是否有可能实现我喜欢的目标? 我想写的另一个表达式是TERM1- - -TERM3 也匹配这两个文件。
由于
答案 0 :(得分:0)
要匹配以TERM1
开头并以TERM3
结尾的文档,其中包含整个字WORD
,您可以使用
TERM1-(.*[^A-Za-z0-9_])?WORD([^A-Za-z0-9_].*)?-TERM3
请参阅regex demo。
<强>详情
TERM1-
- TERM1-
位于字符串的开头(.*[^A-Za-z0-9_])?
- 除了换行符之外的任何0+字符的可选序列尽可能多,然后是任何非单词字符WORD
- 文字WORD
([^A-Za-z0-9_].*)?
- 任意非单词字符的可选序列,然后尽可能多地使用除换行符之外的任何0+字符-TERM3
- -TERM3
位于字符串的末尾。要解决第二个问题,您可以使用否定括号表达式:
TERM1-[^-]*-[^-]*-TERM3
其中[^-]*
匹配-
以外的任何0 +字符。请参阅another regex demo。
注意:在演示中,我使用^
和$
来使模式与整行匹配(使用m
修饰符)。不要在ES中使用它们,因为匹配隐含地锚定在字符串边界。