如何在Elasticsearch中进行部分匹配?
我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“
google”。
我有:
query: { bool : {
must: {
match: { text: 'google'}
}
}
}
但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”?
回答:
关键是您使用的ElasticSearch正则表达式需要
完整的字符串匹配 :
。提供的模式 。
因此,要匹配任何字符(除了换行符),可以使用.*
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
以上是 如何在Elasticsearch中进行部分匹配? 的全部内容, 来源链接: utcz.com/qa/431103.html