如何在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

回到顶部