es 吗 查询必须有sort_ElasticSearch DSL之From/Size,Sort
從這篇文章開始,我們要進(jìn)入DSL的學(xué)習(xí)。
使用url搜索僅僅是個(gè)開始,ES還提供帶有查詢DSL的請(qǐng)求體用于更高級(jí)的搜索。在這些類型的搜索中有大量可選項(xiàng),可以混合和匹配不同的選項(xiàng)以獲得所需的結(jié)果。
DSL還能根據(jù)查詢子句的過(guò)濾和查詢上下文,使用篩選器的子句以布爾形式測(cè)試Document是否匹配篩選器。過(guò)濾器通常也比查詢快,但是查詢也可以根據(jù)Document與查詢的匹配程度來(lái)計(jì)算score。
From/Size
分頁(yè)可以說(shuō)是最常用的一個(gè)功能了,在ES里通過(guò)使用From/Size實(shí)現(xiàn)結(jié)果分頁(yè)。from參數(shù)定義了要獲取的第一個(gè)結(jié)果的偏移量,size參數(shù)允許配置要返回的最多命中數(shù)量。
雖然可以將from和size設(shè)置為請(qǐng)求參數(shù),但它們也可以在搜索體中設(shè)置。從默認(rèn)值到0,大小默認(rèn)值10:
GET http://localhost:9200/orders/_search
{
"from" : 0, "size" : 20,
"query" : {
"term" : { "name" : "phone" }
}
}
Sort
與分頁(yè)幾乎綁在一起的還有排序,ES允許在特定字段上添加一個(gè)或多個(gè)排序,每種排序也可以倒序。常見的asc和desc就不多說(shuō)了,ES支持按數(shù)組或多值字段排序。mode選項(xiàng)控制選擇哪個(gè)數(shù)組值來(lái)排序它所屬的Document。mode選項(xiàng)可以有以下值:
1.min:選擇最小值。
2.max:選擇最大值。
3.sum:使用所有值的和作為排序值(只適用于基于數(shù)字的數(shù)組字段)。
4.avg:使用所有值的平均值作為排序值(只適用于基于數(shù)字的數(shù)組字段)。
5.median:使用所有值的中值作為排序值(只適用于基于數(shù)字的數(shù)組字段)。
在下面的示例中,字段price每個(gè)文檔有多個(gè)價(jià)格。在這種情況下,結(jié)果命中將根據(jù)每個(gè)文檔的平均價(jià)格按價(jià)格升序排序。
{
"query" : {
"term" : { "goods" : "phone" }
},
"sort" : [
{"price" : {"order" : "asc", "mode" : "avg"}}
]
}
ES還支持對(duì)位于一個(gè)或多個(gè)嵌套對(duì)象中的字段進(jìn)行排序。
嵌套字段支持排序有一個(gè)嵌套排序選項(xiàng),具有以下屬性:
1.path:定義要排序的嵌套對(duì)象。實(shí)際的sort字段必須是嵌套對(duì)象中的一個(gè)直接字段。當(dāng)按嵌套字段排序時(shí),該字段是必須要有的。
2.filter:嵌套路徑中的內(nèi)部對(duì)象與之匹配的篩選器,以便通過(guò)排序來(lái)考慮其字段值。常見的情況是在嵌套的過(guò)濾器或查詢中重復(fù)查詢/過(guò)濾器。
3.nested:與頂級(jí)嵌套相同,但適用于當(dāng)前嵌套對(duì)象中的另一個(gè)嵌套路徑。
在下面的示例中,case是一個(gè)類型嵌套的字段。需要指定嵌套路徑;否則,ES就不知道需要在哪個(gè)嵌套級(jí)別上捕獲排序值。
{
"query" : {
"term" : { "product" : "chocolate" }
},
"sort" : [
{
"case.price" : {
"mode" : "avg",
"order" : "asc",
"nested": {
"path": "case",
"filter": {
"term" : { "case.color" : "grey" }
}
}
}
}
]
}
地理位置排序
通過(guò)_geo_distance可以實(shí)現(xiàn)按照按照距離長(zhǎng)短進(jìn)行排序,下面的例子就是按照pin.location作為目標(biāo)地點(diǎn)按照距離從近到遠(yuǎn):
{
"sort" : [
{
"_geo_distance" : {
"pin.location" : [-170, 340],
"unit" : "km",
"mode" : "min",
"distance_type" : "arc",
"ignore_unmapped": true,
"order" : "asc"
}
}
],
"query" : {
"term" : { "seller" : "phone" }
}
}
其中有幾個(gè)參數(shù)需要解釋下:
1.distance_type:計(jì)算距離的方式。可以是arc(弧),也可以是plane(平面,速度快,但在長(zhǎng)距離和接近極點(diǎn)時(shí)不精確)。
2.mode:如果一個(gè)字段有幾個(gè)地理點(diǎn),默認(rèn)情況下,升序排序時(shí)考慮的距離最短,降序排序時(shí)考慮的距離最長(zhǎng)。支持的值是最小值、最大值、中值和平均值。
3.ignore_unmapped:是否應(yīng)將未映射字段視為缺失值。將其設(shè)置為true相當(dāng)于在字段排序中指定unmapped_type。默認(rèn)為false(未映射字段導(dǎo)致搜索失敗)。
4.unit:單位。默認(rèn)是m(米)。
這篇文章主要就介紹了這兩個(gè)參數(shù)。ES當(dāng)然不只有這兩種,只是這兩種應(yīng)該是最常用的,如果各位有疑問(wèn)歡迎留言。
版權(quán)所屬,如需轉(zhuǎn)載,請(qǐng)注明出處:搜閑魚
總結(jié)
以上是生活随笔為你收集整理的es 吗 查询必须有sort_ElasticSearch DSL之From/Size,Sort的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 那些数学不好的程序员?最后都如何了(文末
- 下一篇: Win11如何调整任务栏大小 Win11