你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自: redhat
zhangsan
GET /_search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
要回复问题请先登录或注册
2 个回复
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自: redhat
1、针对问题1:
query的关注点:
1)是否包含?
确定文档是否应该成为结果的一部分.
2)相关度得分多少?
除了确定文档是否匹配外,查询子句还计算了表示文档与其他文档相比匹配程度的_score。
3)得分越高,相关度越高。
更相关的文件,在搜索排名更高。
filter的关注点:
1)是否包含?
确定是否包含在检索结果中,回答只有“是”或“否”。
2)不涉及评分。
在搜索中没有额外的相关度排名。
3)针对结构化数据。
适用于完全精确匹配,范围检索。
2、针对问题2:
term是检索方式的一种,针对关键词做精确匹配的检索方式。
term的使用方法:
"query":{
"term":{
"field":"value"}}
3、针对问题3:
query是检索的特定关键词;
全文检索是检索的一种方式,包含:matchquery, mathch_phrase等检索方式可实现全文检索。
zhangsan
赞同来自: redhat
对于query和filter的纠结,我想主要来源于网上的各种教程额,乱七八糟,使用了不同的es版本,导致用法不一样,但经常有不注明针对那个版本。产生filter和term的区别的疑问,我是感同身受的,起因是因为这个帖子:[url=https://www.cnblogs.com/ghj1976/p/5293250.html]https://www.cnblogs.com/ghj1976/p/5293250.html,[/url]
它把term类的全归到了过滤,match类的全归到了query。给人的感觉就是:term,terms,range,exist,missing就是filter,match,match_all,multi_match等几个就是query,所以,term就是一种filter。
最近又看了es6.2.4的官网文档,并没有看到支持上述帖子言论的说法。
https://www.elastic.co/guide/e ... .html 官网对于query和filter定义的链接。
上面是官网给的例子,filter是套在bool查询中的,和must,should,should_not平级,下面提几个我曾经的疑问,并给出我现在理解的答案。
1.must中只能是Full text queries?
肯定不是,Term level queries也是可以的,亲测了几个。
2.filter中只能是Term level queries?
也不是的,亲测match是可以的,但是kibana在filter下Full text queries没有自动提示,我想是因为filter一般都是精确匹配,官方尽管支持,但也不建议全文匹配来做过滤
3.filter下的几个字句是AND的关系,假如我的过滤条件是OR的关系是不是还要千套一层bool查询?比如我的过滤条件是status是published或者publish_date大于2015-01-01。
事实是我嵌套了一层bool查询,确实实现了需求。
4.为什么写一个filter相对于query这么麻烦?
filter的应用我觉得还是很多的,单一的无过滤条件的全文检索的业务需求还是比较少把。可是filter的写法却麻烦了不少。这是我完全想不明白的一点。。