ElasticSearch教程——filter與query對比
阿新 • • 發佈:2018-12-14
在文章ElasticSearch教程——Kibana簡單操作ES末尾我們用到了must,should以及must not來進行一個數據搜尋的限制以獲取期望的搜尋結果。實際上在除了上述所說方法外我們還能使用filter進行過濾,以獲取自己想要的結果。
新增測試資料
PUT /company/employee/2 { "address": { "country": "china", "province": "jiangsu", "city": "nanjing" }, "name": "tom", "age": 30, "join_date": "2016-01-01" } PUT /company/employee/3 { "address": { "country": "china", "province": "shanxi", "city": "xian" }, "name": "marry", "age": 35, "join_date": "2015-01-01" }
測試
搜尋請求:年齡必須大於等於30,同時join_date必須是2016-01-01
GET /company/employee/_search { "query": { "bool": { "must": [ { "match": { "join_date": "2016-01-01" } } ], "filter": { "range": { "age": { "gte": 30 } } } } } }
返回結果
{ "took": 9, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "company", "_type": "employee", "_id": "2", "_score": 1, "_source": { "address": { "country": "china", "province": "jiangsu", "city": "nanjing" }, "name": "tom", "age": 30, "join_date": "2016-01-01" } } ] } }
可以看出filter同樣也能起到篩選的作用
filter與query對比
filter,僅僅只是按照搜尋條件過濾出需要的資料而已,不計算任何相關度分數,對相關度沒有任何影響; query,會去計算每個document相對於搜尋條件的相關度,並按照相關度進行排序;
一般來說,如果你是在進行搜尋,需要將最匹配搜尋條件的資料先返回,那麼用query;如果你只是要根據一些條件篩選出一部分資料,不關注其排序,那麼用filter; 除非是你的這些搜尋條件,你希望越符合這些搜尋條件的document越排在前面返回,那麼這些搜尋條件要放在query中;如果你不希望一些搜尋條件來影響你的document排序,那麼就放在filter中即可;
filter與query效能對比
filter,不需要計算相關度分數,不需要按照相關度分數進行排序,同時還有內建的自動cache最常使用filter的資料 query,相反,要計算相關度分數,按照分數進行排序,而且無法cache結果