
簡(jiǎn)介
Elasticsearch 使用的查詢語(yǔ)言(DSL)擁有一套查詢組件,這些組件可以以無(wú)限組合的方式進(jìn)行搭配。這套組件可以在以下兩種情況下使用:過(guò)濾上下文(filtering context)和查詢上下文(query context)。
說(shuō)明
當(dāng)使用于過(guò)濾上下文時(shí),查詢被設(shè)置成一個(gè)“不評(píng)分”或者“過(guò)濾”查詢。即這個(gè)查詢只是簡(jiǎn)單的問(wèn)一個(gè)問(wèn)題:“這篇文檔是否匹配?”?;卮鹨彩欠浅5暮?jiǎn)單,yes 或者 no ,二者必居其一。
典型用法
created 時(shí)間是否在 2013 與 2014 這個(gè)區(qū)間?
status 字段是否包含 published 這個(gè)單詞?
lat_lon 字段表示的位置是否在指定點(diǎn)的 10km 范圍內(nèi)?
當(dāng)使用于查詢上下文時(shí),查詢就變成了一個(gè)“評(píng)分”的查詢。和不評(píng)分的查詢類似,也要去判斷這個(gè)文檔是否匹配,同時(shí)它還需要判斷這個(gè)文檔匹配的有 多好(匹配程度如何)。
性能差異
過(guò)濾查詢(Filtering queries)只是簡(jiǎn)單的檢查包含或者排除,這就使得計(jì)算起來(lái)非?????紤]到至少有一個(gè)過(guò)濾查詢(filtering query)的結(jié)果是 “稀少的”(很少匹配的文檔),并且經(jīng)常使用不評(píng)分查詢(non-scoring queries),結(jié)果會(huì)被緩存到內(nèi)存中以便快速讀取,所以有各種各樣的手段來(lái)優(yōu)化查詢結(jié)果。
相反,評(píng)分查詢(scoring queries)不僅僅要找出匹配的文檔,還要計(jì)算每個(gè)匹配文檔的相關(guān)性,計(jì)算相關(guān)性使得它們比不評(píng)分查詢費(fèi)力的多。同時(shí),查詢結(jié)果并不緩存。
語(yǔ)法
query的基礎(chǔ)語(yǔ)法
GET movies/_search
{
"query": {
"match": {
"title": {
"query": "beautiful"
}
}
}
}
filter的語(yǔ)法,一般跟著constant_score、bool
GET movies/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"title": "beautiful"
}
}
}
}
}
GET movies/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"title": "beautiful"
}
},
{
"range": {
"movieId": {
"gte": 94,
"lte": 1000
}
}
}
]
}
}
}
如何選擇查詢與過(guò)濾
通常的規(guī)則是,使用查詢(query)語(yǔ)句來(lái)進(jìn)行全文搜索或者其它任何需要影響相關(guān)性得分的搜索。除此以外的情況都使用過(guò)濾(filters)。