ElasticSearch笔记系列(10)——子条件查询(下)Filter context

原创
2018/04/22 21:57
阅读数 1.9K

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

 

 

展开阅读全文
加载中

作者的其它热门文章

打赏
3
0 收藏
分享
打赏
0 评论
0 收藏
3
分享
返回顶部
顶部