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,但支持较小范围的运算符."
对于部分和全文匹配,以下工作
"query" : {
"query_string" : {
"query" : "*searchText*",
"fields" : [
"fieldName"
]
}
Run Code Online (Sandbox Code Playgroud)
我在中找不到禁用正则表达式的重大更改match,但match: { text: '.*google.*'}不适用于任何Elasticsearch 6.2集群。也许它是可配置的?
正则表达式的工作原理:
"query": {
"regexp": { "text": ".*google.*"}
}
Run Code Online (Sandbox Code Playgroud)