弹出搜索关键字中的通配符

时间:2018-04-18 03:22:26

标签: regex elasticsearch lucene

我们有一个与此类似的映射:

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 也匹配这两个文件。

由于

1 个答案:

答案 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中使用它们,因为匹配隐含地锚定在字符串边界。