国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?

這篇具有很好參考價值的文章主要介紹了Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、問題來源

這是來自社區(qū)的一個真實企業(yè)場景問題。

https://elasticsearch.cn/question/13135

如下所示, 希望在查出的結(jié)果后, 對結(jié)果進(jìn)行后處理,對tags列表,根據(jù)depth進(jìn)行排序。

{
"keyProperty":"22",
"name":"測試內(nèi)容",
"_class":"com.xxxxxxxx.ElasticSearchContent",
"contentType":"attractionArea",
"content":"這是一條測試內(nèi)容",
"timestamp":1701325254191,
"tags":[
{
"path":"33^^35^^36^^38",
"depth":4,
"id":38,
"label":"測試42"
},
{
"path":"33^^35^^36^^37^^39",
"depth":5,
"id":39,
"label":"測試51"
},
{
"path":"33^^35",
"depth":2,
"id":35,
"label":"測試22"
}
]
}

2、分析一下

Elasticsearch 能支持的排序方式羅列如下:

包含但不限于:

  1. 基于特定字段的排序

  2. 基于Nested對象字段的排序

  3. 基于特定腳本實現(xiàn)的排序

等等......

參見:

https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html#nested-sorting

再看咱們的開篇需求,

  • 第一:檢索返回結(jié)果;

  • 第二:基于結(jié)果的 tags 數(shù)組下的子字段 depth 進(jìn)行排序。

字段排序分類中的:基于特定字段的排序和基于 Nested 對象字段的排序,是對整個查詢結(jié)果集進(jìn)行排序,這在 Elasticsearch 中通常是針對頂層文檔字段或者簡單嵌套字段進(jìn)行的。

而咱們開篇需求的應(yīng)用場景和實現(xiàn)方式與之是不同的,哪咋辦?

見招拆招了,只能考慮基于特定腳本實現(xiàn)的排序了。

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?,elasticsearch,jenkins,大數(shù)據(jù),搜索引擎,全文檢索

要實現(xiàn)開篇的需求——即對每個文檔的 tags 列表進(jìn)行排序,需要在返回結(jié)果中對這些 tags 列表進(jìn)行處理。

通常有兩大類方案:

  • 使用腳本字段(script_fields)實現(xiàn);

  • 在查詢結(jié)果返回后在客戶端進(jìn)行處理,大白話:自己Java或Python程序?qū)用嫣幚怼?/p>

3、嘗試拆解實現(xiàn)

咱們要先模擬構(gòu)造數(shù)據(jù),包含創(chuàng)建索引和bulk 批量構(gòu)造寫入數(shù)據(jù)兩個部分。

創(chuàng)建索引如下:

PUT?/example_index
{
??"mappings":?{
????"properties":?{
??????"keyProperty":?{
????????"type":?"keyword"
??????},
??????"name":?{
????????"type":?"text"
??????},
??????"_class":?{
????????"type":?"keyword"
??????},
??????"contentType":?{
????????"type":?"keyword"
??????},
??????"content":?{
????????"type":?"text"
??????},
??????"timestamp":?{
????????"type":?"date"
??????},
??????"tags":?{
????????"type":?"nested",
????????"properties":?{
??????????"path":?{
????????????"type":?"keyword"
??????????},
??????????"depth":?{
????????????"type":?"integer"
??????????},
??????????"id":?{
????????????"type":?"integer"
??????????},
??????????"label":?{
????????????"type":?"text"
??????????}
????????}
??????}
????}
??}
}

導(dǎo)入數(shù)據(jù):

POST?/example_index/_bulk
{"index":{"_id":1}}
{"keyProperty":"22","name":"測試內(nèi)容1","_class":"com.xxxxxxxx.ElasticSearchContent","contentType":"attractionArea","content":"這是一條測試內(nèi)容","timestamp":1701325254191,"tags":[{"path":"33^^35^^36^^38","depth":4,"id":38,"label":"測試42"},{"path":"33^^35^^36^^37^^39","depth":5,"id":39,"label":"測試51"},{"path":"33^^35","depth":2,"id":35,"label":"測試22"}]}
{"index":{"_id":2}}
{"keyProperty":"23","name":"測試內(nèi)容2","_class":"com.xxxxxxxx.ElasticSearchContent","contentType":"attractionArea","content":"這是另一條測試內(nèi)容","timestamp":1701325254200,"tags":[{"path":"33^^35^^36","depth":5,"id":36,"label":"測試33"},{"path":"33^^35^^37","depth":3,"id":37,"label":"測試34"}]}

3.1 方案一:腳本字段(script_fields)實現(xiàn)自建排序

GET?/example_index/_search
{
??"query":?{
????"nested":?{
??????"path":?"tags",
??????"query":?{
????????"match_all":?{}
??????}
????}
??},
??"script_fields":?{
????"sorted_tags":?{
??????"script":?{
????????"lang":?"painless",
????????"source":?"""
????????if?(!params._source.tags.empty)?{
??????????def?tags?=?new?ArrayList(params._source.tags);
??????????boolean?swapped;
??????????do?{
????????????swapped?=?false;
????????????for?(int?i?=?0;?i?<?tags.size()?-?1;?i++)?{
??????????????if?(tags[i].depth?>?tags[i?+?1].depth)?{
????????????????def?temp?=?tags[i];
????????????????tags[i]?=?tags[i?+?1];
????????????????tags[i?+?1]?=?temp;
????????????????swapped?=?true;
??????????????}
????????????}
??????????}?while?(swapped);
??????????return?tags;
????????}?else?{
??????????return?null;
????????}
??????"""
??????}
????}
??}
}

召回結(jié)果如下:

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?,elasticsearch,jenkins,大數(shù)據(jù),搜索引擎,全文檢索

有人可能會說,這不是扯嗎?都整出個冒泡排序來了。

是的,就是傳統(tǒng)的數(shù)組排序的腳本實現(xiàn)。當(dāng)沒有辦法的時候,不考慮性能的時候,笨辦法也是辦法。

在 Elasticsearch 中處理大量數(shù)據(jù)時運行復(fù)雜的腳本可能會消耗較多的計算資源!

還有,冒泡排序是一種效率較低的排序算法,特別是對于大列表,其性能不是最佳的。

相比于使用 Elasticsearch 內(nèi)置的排序功能,手動實現(xiàn)排序算法增加了腳本的復(fù)雜性。

3.2 方案二:腳本字段實現(xiàn)自建排序——lamda表達(dá)式排序

GET?/example_index/_search
{
??"query":?{
????"nested":?{
??????"path":?"tags",
??????"query":?{
????????"match_all":?{}
??????}
????}
??},
??"script_fields":?{
????"sorted_tags":?{
??????"script":?{
????????"lang":?"painless",
????????"source":?"""
??????????if?(!params._source.tags.empty)?{
????????????def?tags?=?new?ArrayList(params._source.tags);
????????????tags.sort((a,?b)?->?a.depth.compareTo(b.depth));
????????????return?tags;
??????????}?else?{
????????????return?null;
??????????}
????????"""
??????}
????}
??},
??"size":?10
}

這里使用了一個 lambda 表達(dá)式 (a, b) -> a.depth.compareTo(b.depth)。最后,返回排序后的 tags。

參見:

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html

執(zhí)行結(jié)果如下:

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?,elasticsearch,jenkins,大數(shù)據(jù),搜索引擎,全文檢索

3.3 方案三:業(yè)務(wù)層面代碼實現(xiàn)

啥意思,召回檢索結(jié)果后,自己在內(nèi)存里排序,想使用什么排序自便,按照自己習(xí)慣就可以。當(dāng)然,Elastic中文社區(qū)創(chuàng)始人 、極限科技 CEO medcl 大佬也給出了他的網(wǎng)關(guān)方案:

寫個 JS 腳本,通過極限網(wǎng)關(guān),無縫的對查詢結(jié)果進(jìn)行改寫就行了:

https://infinilabs.com/docs/latest/gateway/tutorial/path_rewrite_by_javascript/

這其實給復(fù)雜查詢給了另一個更高維度升維的思考,值得借鑒。

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?,elasticsearch,jenkins,大數(shù)據(jù),搜索引擎,全文檢索

4、小結(jié)

將問題展開,才能找到解決問題的方案。

當(dāng)實現(xiàn)方案變得非常復(fù)雜,涉及性能問題時候,數(shù)據(jù)量少都沒有問題;數(shù)據(jù)量大后,可以考慮找其他方案。

你如果也有類似困惑,歡迎交流。

推薦閱讀

  1. 全網(wǎng)首發(fā)!從 0 到 1 Elasticsearch 8.X 通關(guān)視頻

  2. 重磅 | 死磕 Elasticsearch 8.X 方法論認(rèn)知清單

  3. 如何系統(tǒng)的學(xué)習(xí) Elasticsearch ?

  4. 2023,做點事

  5. 干貨 | Elasticsearch Nested 數(shù)組大小求解,一網(wǎng)打盡!

  6. Elasticsearch Nested 選型,先看這一篇!

  7. 干貨 | 拆解一個 Elasticsearch Nested 類型復(fù)雜查詢問題

  8. 干貨 | Elasticsearch Nested類型深入詳解

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?,elasticsearch,jenkins,大數(shù)據(jù),搜索引擎,全文檢索

更短時間更快習(xí)得更多干貨!

和全球?近2000+?Elastic 愛好者一起精進(jìn)!

Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?,elasticsearch,jenkins,大數(shù)據(jù),搜索引擎,全文檢索

比同事?lián)屜纫徊綄W(xué)習(xí)進(jìn)階干貨!文章來源地址http://www.zghlxwxcb.cn/news/detail-787088.html

到了這里,關(guān)于Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進(jìn)行排序?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • clickhouse的嵌套數(shù)據(jù)結(jié)構(gòu)Tuple、Array與Nested類型介紹和使用示例

    clickhouse的嵌套數(shù)據(jù)結(jié)構(gòu)Tuple、Array與Nested類型介紹和使用示例

    Tuple 是 ClickHouse 數(shù)據(jù)庫中的一種數(shù)據(jù)類型,它允許在一個字段中存儲由不同數(shù)據(jù)類型組成的元組(tuple)。 元組可以包含任意數(shù)量的值,并且每個值可以是不同的數(shù)據(jù)類型,如 int 、 float 、 string 、 date 等。 例如,以下是一個 clickhouse Tuple 類型的例子: (1, \\\'John\\\', 12.5, Date(\\\'2021-0

    2024年02月14日
    瀏覽(49)
  • es查詢nested字段類型數(shù)組長度來判斷是否包含多個值

    使用es時經(jīng)常會碰到查詢數(shù)組格式的字段是否有多個值的情況,總結(jié)一下。 一、字段類型為keywork時 當(dāng)字段類型為keyword時(創(chuàng)建索引后,添加的第一條數(shù)據(jù)id字段格式為數(shù)組格式,便會導(dǎo)致后續(xù)的數(shù)據(jù)都是數(shù)組),查詢id字段有多值時用以下查詢語句: 二、字段類型為nested類型時

    2024年02月11日
    瀏覽(102)
  • Elasticsearch 復(fù)雜類型 Nested

    復(fù)雜類型 建模到底是個什么東東? 建模解決什么問題? 復(fù)雜類型的的檢索問題 主要解決復(fù)雜類型無法搜索的問題 nested屬于object類型的一種,是Elasticsearch中用于復(fù)雜類型對象數(shù)組的索引操作。Elasticsearch沒有內(nèi)部對象的概念,因此,ES在存儲復(fù)雜類型的時候會把對象的 復(fù)雜層次

    2024年02月13日
    瀏覽(20)
  • ElasticSearch nested 字段多關(guān)鍵字搜索,高亮全部匹配關(guān)鍵字的處理

    ElasticSearch 版本號: 6.7.0 用戶會傳入多個去ES查詢 ElasticSearch nested 字段 的多個字段,要求在返回的結(jié)果中被搜索的字段需要高亮所有匹配的。例如同時通過 上海 和 策劃 ,再 工作經(jīng)歷 的列表中的 工作內(nèi)容 和 公司名稱 中搜索。如果有人員的 工作經(jīng)歷 中

    2024年04月22日
    瀏覽(100)
  • kibana中ES修改某個字段類型問題

    ?近日,發(fā)現(xiàn)同步數(shù)據(jù)到es的時候,有個新建的索引動態(tài)適配了mapping,而往往這種會有字段類型不是我們想要的,比如我這就有個tid字段,此字段要在聚合操作中使用,而此時的tid被識別成text類型了,而text不支持聚合,所以要更改字段類型為long或者keyword,注意es 不支持直接

    2024年02月08日
    瀏覽(28)
  • 深入了解ElasticSearch的Nested數(shù)據(jù)類型

    深入了解ElasticSearch的Nested數(shù)據(jù)類型

    這個時候就需要用到nested,nested類型是object數(shù)據(jù)類型的特殊版本,它允許對象數(shù)組以一種可以相互獨立查詢的方式進(jìn)行索引。 在Nested內(nèi)部,每個對象索引其實是一個單獨的隱藏文檔,這意味著每個嵌套對象都可以獨立于其他對象進(jìn)行查詢。 使用Nested需要先創(chuàng)建索引,依舊通

    2024年04月10日
    瀏覽(17)
  • Elasticsearch中object類型與nested類型以及數(shù)組之間的區(qū)別

    0、一般情況下用object 類型來查es中為json對象的字段數(shù)據(jù),用nested來查es中為JsonArray數(shù)組類型的字段數(shù)據(jù)。 1、默認(rèn)情況下ES會把JSON對象直接映射為object類型,只有手動設(shè)置才會映射為nested類型 2、object類型可以直接使用普通的逗號(.)查詢,比如 3、nested類型的查詢需要使用

    2024年01月22日
    瀏覽(93)
  • Elasticsearch按某個字段去重-實現(xiàn)group by效果

    已知es中存儲了一張學(xué)生課程信息寬表,里邊包含有student_name、student_id、teacher_id、課程信息等字段。 現(xiàn)在根據(jù)學(xué)生姓名或者班級ID,得出學(xué)生所在班級的所有授課教師信息。? 既然是明細(xì)寬表,里邊的教師的信息必然是有重復(fù)的,因此我們需要查詢teacher_id的集合并去重,對

    2024年02月12日
    瀏覽(29)
  • Elasticsearch 基于 array 結(jié)構(gòu) 的nested類型的索引的聚合查詢

    這幾天在做es的聚合查詢,對那種一對多的產(chǎn)品數(shù)據(jù)查詢的時候遇到了一些問題,做一下記錄 針對每個產(chǎn)品名稱[ product_name ]進(jìn)行分組,并對預(yù)算[ budget ]求和 產(chǎn)品名稱 預(yù)算 電視機(jī) 4000 手機(jī) 851 相機(jī) 5000 撲克牌 2 es查詢語句==簡化版 es查詢的結(jié)果==簡化版 注意電視機(jī)的doc_count為

    2024年02月16日
    瀏覽(21)
  • Elasticsearch索引之嵌套類型:深度剖析與實戰(zhàn)應(yīng)用

    Elasticsearch索引之嵌套類型:深度剖析與實戰(zhàn)應(yīng)用

    碼到三十五 : 個人主頁 心中有詩畫,指尖舞代碼,目光覽世界,步履越千山,人間盡值得 ! Elasticsearch是一個基于Lucene的搜索服務(wù)器,它提供了一個分布式、多租戶能力的全文搜索引擎,并帶有一個基于HTTP的Web界面和基于JSON的文檔。在Elasticsearch中,嵌套類型索引是一個非常

    2024年04月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包