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