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

kuhbmx9i  于 2022-09-20  发布在  ElasticSearch
关注(0)|答案(6)|浏览(193)

我有一个像http://drive.google.com的链接,我想匹配出链接中的“Google”。

我有:

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

但这只在整个文本是‘Google’的情况下才匹配(不区分大小写,因此它也与Google或Google等匹配)。如何匹配另一个字符串中的“Google”?

sg2wtvxw

sg2wtvxw1#

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

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

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

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

在ES6+中,使用matchregexp

"query": {
   "regexp": { "text": ".*google.*"} 
}

另一个变体是字符串可以有换行符的情况:match: { text: '(.|\n)*google(.|\n)*'}。这个可怕的(.|\n)*在ElasticSearch中是必须的,因为这种正则表达式风格不允许任何[\s\S]解决办法,也不允许任何DOTALL/Singlline标志。“Lucene正则表达式引擎与Perl不兼容,但支持较小范围的运算符。”

然而,如果您不打算匹配任何复杂的模式,也不需要检查单词边界,那么对于仅仅是一个子串的正则表达式搜索,只需要通配符搜索

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

有关更多详细信息,请参阅Wildcard search

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

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

此外,请记住通配符模式中唯一的一对特殊字符:

?, which matches any single character

* , which can match zero or more characters, including an empty one
f1tvaqid

f1tvaqid2#

使用通配符查询:

'{"query":{ "wildcard": { "text.keyword" : "*google*" }}}'
i34xakig

i34xakig3#

无论是部分匹配还是全文匹配,以下方法都有效

"query" : {
    "query_string" : {
      "query" : "*searchText*",
      "fields" : [
        "fieldName"
      ]
    }
jexiocij

jexiocij4#

我在match中找不到禁用正则表达式的breaking change,但match: { text: '.*google.*'}在我的任何ElasticSearch 6.2集群上都不起作用。也许它是可配置的?

Regexp工作正常:

"query": {
   "regexp": { "text": ".*google.*"} 
}
fjnneemd

fjnneemd5#

对于部分匹配,您可以使用prefixmatch_phrase_prefix

vptzau2j

vptzau2j6#

对于更通用的解决方案,您可以考虑使用不同的分析器或定义您自己的分析器。我假设您使用的是标准分析器,它会将http://drive.google.com拆分为标记“http”和“drive.google.com”。这就是为什么只搜索谷歌不起作用,因为它试图将其与完整的“drive.google.com”进行比较。

如果您使用简单的分析器对文档进行索引,则会将其拆分为“http”、“Drive”、“Google”和“com”。这将允许您单独匹配这些术语中的任何一个。

相关问题