ElasticSearch 1.7查询非http开头URL无结果,请求修正
修正Elasticsearch 1.7中查找非http开头URL的查询
首先,你的原始查询问题出在正则表达式语法和flags的使用上——Elasticsearch 1.7基于Lucene 4.10.4,它的正则规则不支持@&~(http.+)这种写法,而且ANYSTRING并不是有效的flags参数。
下面给你两种可行的修正方案,优先推荐第二种(性能更优):
方案一:使用正确的正则表达式(负向前瞻)
利用Lucene支持的负向前瞻语法,匹配所有不以http开头的字符串:
{ "query": { "regexp": { "url": { "value": "^(?!http).*$", "flags": "DOTALL" } } } }
^(?!http):负向前瞻,确保字符串开头不是http.*$:匹配后续任意字符DOTALL:让.匹配包括换行符在内的所有字符(如果你的URL不含换行,也可以省略,但加上更稳妥)
方案二:使用Bool查询结合Prefix(性能更优)
Regexp查询的性能通常不如基于倒排索引的前缀查询,如果你只是要排除以http开头的URL,用bool+must_not+prefix的组合效率更高:
{ "query": { "bool": { "must_not": [ { "prefix": { "url": "http" } } ] } } }
这个查询会返回所有不匹配url字段以http开头的文档,完全满足你的需求,而且执行速度更快。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

