Query与Filter
查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:
Query查询上下文:
在查询上下文中,查询关注的问题时:“这个文档匹不匹配这个查询,它的相关度高么?”
如何验证匹配很好理解,如何计算相关度呢?之前说过,ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。
查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。
Filter过滤器上下文:
在过滤器上下文中,查询关注的问题时:“这个文档匹不匹配?”
答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter。
本文在在前文介绍Query查询的基础上,继续介绍Filter查询。
简单的说,Query查询和Filter查询的区别:
区别1
Filter:在查询过程中,Filter只判断该文档是否满足条件,只有YES或者NO。
Query:除了问YES或NO,还会问匹配的程度。
区别2
FIlter就是用来做数据过滤的,ES会对它的结果进行缓存,所以相较于Query而言Filter的速度会更快一些。
示例
Filter需要结合另一个关键词bool来实现,用到bool和filter两个关键词。
POST http://localhost:9200/rent/community/_search
{
"query":{
"bool":{
"filter":{
"term":{
"creationdate":"2015-01-01"
}
}
}
}
}
我们查询一下,发现第一次的时间相对稍长,took为200+ms。之后因为filter context的本身原理,刚才说的,ES对其其结果进行缓存,再次查询只用了8ms
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0,
"hits": [
{
"_index": "rent",
"_type": "community",
"_id": "AWLZD_9YoILHeA4gRvWC",
"_score": 0,
"_source": {
"communityname": "万科公园大道",
"city": "上海老闵行",
"age": 3,
"creationdate": "2015-01-01 00:00:00"
}
},
{
"_index": "rent",
"_type": "community",
"_id": "AWLZFA5EoILHeA4gRvWF",
"_score": 0,
"_source": {
"communityname": "金地艺境(松江)",
"city": "上海松江区",
"age": 3,
"creationdate": "2015-01-01 00:00:00"
}
},
{
"_index": "rent",
"_type": "community",
"_id": "AWLZGGD2oILHeA4gRvWJ",
"_score": 0,
"_source": {
"communityname": "保利艾庐",
"city": "上海浦东新区周浦镇",
"age": 3,
"creationdate": "2015-01-01"
}
}
]
}
}
本文出自oschina博主happybks的博文:https://my.oschina.net/happyBKs/blog/1799392