我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“ google”。
我有:
query: { bool : { must: { match: { text: 'google'} } } }
但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”?
关键是您使用的ElasticSearch正则表达式需要 完整的字符串匹配 :
Lucene的模式总是锚定的 。提供的模式 必须与整个字符串匹配 。
因此,要匹配任何字符(除了换行符),可以使用.*pattern:
.*
match: { text: '.*google.*'} ^^ ^^
另外一种变体是针对您的字符串可以包含换行符的情况:match: { text: '(.|\n)*google(.|\n)*'}。这可怕的(.|\n)*是ElasticSearch必须的,因为这正则表达式的味道不允许任何[\s\S]解决方法,也没有任何DOTALL /单行标志。 “ Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。”
match: { text: '(.|\n)*google(.|\n)*'}
(.|\n)*
[\s\S]
但是 ,如果您不打算匹配任何复杂的模式并且不需要单词边界检查,那么仅使用 通配符搜索 就可以更好地执行仅对子字符串进行正则表达式 搜索 :
{ "query": { "wildcard": { "text": { "value": "*google*", "boost": 1.0, "rewrite": "constant_score" } } } }
有关更多详细信息,请参见 通配符搜索 。
注意 :通配符模式还需要匹配整个输入字符串,因此
google*
google
*google*
*google
另外,请记住通配符模式中仅有的一对特殊字符:
?, which matches any single character *, which can match zero or more characters, including an empty one