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

The*_*ter 21 regex url parsing json elasticsearch

我有像http://drive.google.com这样的链接,我希望将"google"与链接相匹配.

我有:

query: {
    bool : {
        must: {
            match: { text: 'google'} 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这只是匹配,如果整个文本是'谷歌'(不区分大小写,所以它也匹配谷歌或GooGlE等).如何匹配另一个字符串中的'google'?

小智 13

使用通配符查询:

'{"query":{ "wildcard": { "text.keyword" : "*google*" }}}'
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 10

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

Lucene的模式总是固定不变的.提供的模式必须与整个字符串匹配.

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

match: { text: '.*google.*'}
                ^^      ^^
Run Code Online (Sandbox Code Playgroud)

另外一个变体是你的字符串可以有换行符的情况:match: { text: '(.|\n)*google(.|\n)*'}.这可怕(.|\n)*是ElasticSearch必须的,因为这个正则表达式的味道不允许任何[\s\S]变通方法,也不允许任何DOTALL/Singleline标志."Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符."

  • 这是一个不同的案例。在你最后一种情况下,你是对的,这就是方法。但是关于@user3835653 正则表达式提出的问题一定不是解决方案。我看到很多使用正则表达式实现的项目..因为人们不知道如何配置标记器和分析器...... (2认同)

Pri*_*i M 6

对于部分和全文匹配,以下工作

"query" : {
    "query_string" : {
      "query" : "*searchText*",
      "fields" : [
        "fieldName"
      ]
    }
Run Code Online (Sandbox Code Playgroud)


Ste*_*len 5

我在中找不到禁用正则表达式的重大更改match,但match: { text: '.*google.*'}不适用于任何Elasticsearch 6.2集群。也许它是可配置的?

正则表达式的工作原理:

"query": {
   "regexp": { "text": ".*google.*"} 
}
Run Code Online (Sandbox Code Playgroud)