Query and filter context
查詢從句的行爲依賴於它是用在查詢上下文還是過濾上下文。
Query context
一個用在查詢上下文的查詢從句回答這樣的問題:“這個文檔匹配這個查詢從句的程度是怎麼樣?”除了文檔是否匹配以外,查詢從句計算分值,這個分值是表示與其他文檔相比,這個文檔匹配的程度。
無論何時,一個查詢從句傳遞給一個query參數,查詢上下文都會生效。
Filter context
在過濾上下文中,一個查詢從句回答這樣的問題:“這個文檔是否匹配這個查詢從句?”答案是是或者否。沒有計算分值。過濾上下文一般用於過濾結構化數據。
e.g.
timestamp是否在2015到2016之間變化?
status屬性是否被設置爲published?
經常使用過濾,ElasticSearch會自動緩存,用來提高性能。
無論何時,一個查詢從句傳遞給一個filter參數,過濾上下文都會生效,比如在bool查詢中的filter或者must_not參數、在constant_score查詢中的filter參數、filter聚合。
Demo
GET /_search
{
"query": {
"bool": {
"must": [
{"match": {"title": "Search"}},
{"match": {"content": "ElasticSearch"}}
],
"filter": [
{"term": {"status": "published"}},
{"range": {"publish_date": {"gte": "2015-01-01"}}}
]
}
}
}
query參數表示查詢上下文。
bool和兩個match從句在查詢上下文使用,用來計算文檔匹配的分數。
filter參數表示過濾上下文。term和range從句用於過濾上下文中。過濾不匹配的文檔,但是不會影響匹配的分數。
Others
在查詢上下文中的用於查詢的分數,以單精度浮點數表示,24位有效精度。分數一旦超出有效精度,會丟失其精度。
在查詢上下文中使用的條件查詢從句,會影響匹配文檔的分數。在過濾上下文使用的查詢從句,則不會影響分數。
Match All Query
最簡單的查詢,匹配所有的文檔,給予所有文檔==_score爲1.0==。
GET /_search
{
"query": {
"match_all": {}
}
}
_score可以使用boost參數進行改變。
GET /search
{
"query": {
"match_all": {
"boost": 1.2
}
}
}
與match_all相反,match_none不匹配任何文檔。
GET /_search
{
"query": {
"match_none": {}
}
}