我有一个像http://drive.google.com的链接,我想匹配出链接中的“Google”。
我有:
query: {
bool : {
must: {
match: { text: 'google'}
}
}
}
但这只在整个文本是‘Google’的情况下才匹配(不区分大小写,因此它也与Google或Google等匹配)。如何匹配另一个字符串中的“Google”?
我有一个像http://drive.google.com的链接,我想匹配出链接中的“Google”。
我有:
query: {
bool : {
must: {
match: { text: 'google'}
}
}
}
但这只在整个文本是‘Google’的情况下才匹配(不区分大小写,因此它也与Google或Google等匹配)。如何匹配另一个字符串中的“Google”?
6条答案
按热度按时间sg2wtvxw1#
关键是您正在使用的ElasticSearch正则表达式需要全字符串匹配:
Lucene的模式总是锚定的。提供的模式必须匹配整个字符串。
因此,要匹配任何字符(换行符除外),可以使用
.*
模式:在ES6+中,使用
match
的regexp
:另一个变体是字符串可以有换行符的情况:
match: { text: '(.|\n)*google(.|\n)*'}
。这个可怕的(.|\n)*
在ElasticSearch中是必须的,因为这种正则表达式风格不允许任何[\s\S]
解决办法,也不允许任何DOTALL/Singlline标志。“Lucene正则表达式引擎与Perl不兼容,但支持较小范围的运算符。”然而,如果您不打算匹配任何复杂的模式,也不需要检查单词边界,那么对于仅仅是一个子串的正则表达式搜索,只需要通配符搜索:
有关更多详细信息,请参阅Wildcard search。
注意:通配符模式还需要匹配整个输入字符串,因此
google*
查找以*google
开头的所有字符串*google*
查找包含*google
的所有字符串**google
查找所有以google
结尾的字符串此外,请记住通配符模式中唯一的一对特殊字符:
f1tvaqid2#
使用通配符查询:
i34xakig3#
无论是部分匹配还是全文匹配,以下方法都有效
jexiocij4#
我在
match
中找不到禁用正则表达式的breaking change,但match: { text: '.*google.*'}
在我的任何ElasticSearch 6.2集群上都不起作用。也许它是可配置的?Regexp工作正常:
fjnneemd5#
对于部分匹配,您可以使用prefix或match_phrase_prefix。
vptzau2j6#
对于更通用的解决方案,您可以考虑使用不同的分析器或定义您自己的分析器。我假设您使用的是标准分析器,它会将http://drive.google.com拆分为标记“http”和“drive.google.com”。这就是为什么只搜索谷歌不起作用,因为它试图将其与完整的“drive.google.com”进行比较。
如果您使用简单的分析器对文档进行索引,则会将其拆分为“http”、“Drive”、“Google”和“com”。这将允许您单独匹配这些术语中的任何一个。