一尘不染

如何在Elasticsearch中进行部分匹配?

elasticsearch

我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“
google”。

我有:

query: {
    bool : {
        must: {
            match: { text: 'google'} 
        }
    }
}

但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”?


阅读 891

收藏
2020-06-22

共1个答案

一尘不染

关键是您使用的ElasticSearch正则表达式需要
完整的字符串匹配

Lucene的模式总是锚定的 。提供的模式 必须与整个字符串匹配

因此,要匹配任何字符(除了换行符),可以使用.*pattern:

match: { text: '.*google.*'}
                ^^      ^^

另外一种变体是针对您的字符串可以包含换行符的情况:match: { text: '(.|\n)*google(.|\n)*'}。这可怕的(.|\n)*是ElasticSearch必须的,因为这正则表达式的味道不允许任何[\s\S]解决方法,也没有任何DOTALL
/单行标志。
Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。”

但是 ,如果您不打算匹配任何复杂的模式并且不需要单词边界检查,那么仅使用 通配符搜索 就可以更好地执行仅对子字符串进行正则表达式
搜索

{
    "query": {
        "wildcard": {
            "text": {
                "value": "*google*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

有关更多详细信息,请参见
通配符搜索

注意 :通配符模式还需要匹配整个输入字符串,因此

  • google*查找所有以 开头的 字符串 __google
  • *google*查找 包含的 所有字符串 __google
  • *google查找所有 以结尾的 字符串 __google

另外,请记住通配符模式中仅有的一对特殊字符:

?, which matches any single character
*, which can match zero or more characters, including an empty one
2020-06-22