【Elasticsearch】flattened`類型在查詢嵌套數組時可能返回不準確結果的情況

好的!為了更清楚地說明`flattened`類型在查詢嵌套數組時可能返回不準確結果的情況,我們可以通過一個具體的例子來展示。這個例子將展示如何在文檔中沒有完全匹配的嵌套對象時,`flattened`類型仍然可能返回該文檔。

示例文檔結構

假設你有以下文檔結構,其中`addresses`是一個嵌套數組:

```json

PUT /my_index/_doc/1

{

? "user": {

? ? "id": 1,

? ? "name": "John Doe",

? ? "addresses": [

? ? ? {

? ? ? ? "street": "123 Main St",

? ? ? ? "city": "Anytown",

? ? ? ? "state": "NY" // 注意這里 state 是 NY,而不是 CA

? ? ? },

? ? ? {

? ? ? ? "street": "456 Elm St",

? ? ? ? "city": "Othertown",

? ? ? ? "state": "CA" // 注意這里 city 是 Othertown,而不是 Anytown

? ? ? }

? ? ]

? }

}

```

在這個文檔中,`addresses`數組包含兩個地址對象:

1. 第一個地址對象的`city`是`"Anytown"`,但`state`是`"NY"`。

2. 第二個地址對象的`state`是`"CA"`,但`city`是`"Othertown"`。

查詢示例

假設你希望查詢所有`city`為`"Anytown"`且`state`為`"CA"`的地址。如果`addresses`字段被定義為`flattened`類型,你可能會寫出以下查詢:

```json

GET /my_index/_search

{

? "query": {

? ? "bool": {

? ? ? "must": [

? ? ? ? {

? ? ? ? ? "term": {

? ? ? ? ? ? "user.addresses.city": {

? ? ? ? ? ? ? "value": "Anytown"

? ? ? ? ? ? }

? ? ? ? ? }

? ? ? ? },

? ? ? ? {

? ? ? ? ? "term": {

? ? ? ? ? ? "user.addresses.state": {

? ? ? ? ? ? ? "value": "CA"

? ? ? ? ? ? }

? ? ? ? ? }

? ? ? ? }

? ? ? ]

? ? }

? }

}

```

查詢結果

由于`flattened`類型會將嵌套結構展開為多個字段路徑,Elasticsearch 無法保證`city`和`state`屬于同一個嵌套對象。因此,查詢可能會返回不準確的結果。

在上面的例子中,`flattened`類型會將`addresses`展開為以下字段路徑:

```json

{

? "user.addresses.street.0": "123 Main St",

? "user.addresses.city.0": "Anytown",

? "user.addresses.state.0": "NY",

? "user.addresses.street.1": "456 Elm St",

? "user.addresses.city.1": "Othertown",

? "user.addresses.state.1": "CA"

}

```

當你執行查詢時,Elasticsearch 會分別匹配`city`和`state`,但無法保證它們屬于同一個嵌套對象。因此,查詢可能會返回包含以下內容的文檔:

```json

{

? "hits": {

? ? "total": {

? ? ? "value": 1,

? ? ? "relation": "eq"

? ? },

? ? "max_score": 1.0,

? ? "hits": [

? ? ? {

? ? ? ? "_index": "my_index",

? ? ? ? "_type": "_doc",

? ? ? ? "_id": "1",

? ? ? ? "_score": 1.0,

? ? ? ? "_source": {

? ? ? ? ? "user": {

? ? ? ? ? ? "id": 1,

? ? ? ? ? ? "name": "John Doe",

? ? ? ? ? ? "addresses": [

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? "street": "123 Main St",

? ? ? ? ? ? ? ? "city": "Anytown",

? ? ? ? ? ? ? ? "state": "NY"

? ? ? ? ? ? ? },

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? "street": "456 Elm St",

? ? ? ? ? ? ? ? "city": "Othertown",

? ? ? ? ? ? ? ? "state": "CA"

? ? ? ? ? ? ? }

? ? ? ? ? ? ]

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? ]

? }

}

```

問題解釋

盡管文檔中沒有完全匹配`city`為`"Anytown"`且`state`為`"CA"`的地址對象,但查詢仍然返回了該文檔。這是因為`flattened`類型無法保證`city`和`state`屬于同一個嵌套對象。具體來說:

? 第一個地址對象的`city`是`"Anytown"`,但`state`是`"NY"`。

? 第二個地址對象的`state`是`"CA"`,但`city`是`"Othertown"`。

由于`flattened`類型將這些字段路徑展開后,Elasticsearch 會分別匹配`city`和`state`,而不會檢查它們是否屬于同一個嵌套對象。因此,只要文檔中存在滿足條件的字段路徑,即使這些字段路徑不屬于同一個嵌套對象,查詢也會返回該文檔。

使用`nested`類型的正確結果

如果`addresses`字段被定義為`nested`類型,查詢會正確地返回沒有匹配結果的情況:

```json

PUT /my_index

{

? "mappings": {

? ? "properties": {

? ? ? "user": {

? ? ? ? "properties": {

? ? ? ? ? "id": { "type": "integer" },

? ? ? ? ? "name": { "type": "text" },

? ? ? ? ? "addresses": { "type": "nested" }

? ? ? ? }

? ? ? }

? ? }

? }

}

```

查詢:

```json

GET /my_index/_search

{

? "query": {

? ? "nested": {

? ? ? "path": "user.addresses",

? ? ? "query": {

? ? ? ? "bool": {

? ? ? ? ? "must": [

? ? ? ? ? ? {

? ? ? ? ? ? ? "term": {

? ? ? ? ? ? ? ? "user.addresses.city": {

? ? ? ? ? ? ? ? ? "value": "Anytown"

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? }

? ? ? ? ? ? },

? ? ? ? ? ? {

? ? ? ? ? ? ? "term": {

? ? ? ? ? ? ? ? "user.addresses.state": {

? ? ? ? ? ? ? ? ? "value": "CA"

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ]

? ? ? ? }

? ? ? }

? ? }

? }

}

```

返回結果:

```json

{

? "hits": {

? ? "total": {

? ? ? "value": 0,

? ? ? "relation": "eq"

? ? },

? ? "max_score": null,

? ? "hits": []

? }

}

```

`nested`類型會正確地檢查每個嵌套對象的完整性,因此不會返回不匹配的文檔。

總結

? `flattened`類型的限制:`flattened`類型會將嵌套結構展開為多個字段路徑,無法保證這些字段屬于同一個嵌套對象。因此,在查詢時可能會返回不準確的結果。

? `nested`類型的優勢:`nested`類型可以保持嵌套對象的完整性,支持復雜的嵌套查詢,能夠精確匹配嵌套結構。

希望這個例子清楚地展示了`flattened`類型在查詢嵌套數組時可能返回不準確結果的情況。

這里`flattened`類型在處理嵌套對象時出現不準確結果的問題,主要是因為嵌套對象是列表(數組)結構。當嵌套對象是數組時,`flattened`類型會將數組中的每個對象展開為多個字段路徑,而這些字段路徑之間沒有關聯關系,因此無法保證它們屬于同一個嵌套對象。
為什么`flattened`類型在數組結構中會出現問題?

當嵌套對象是數組時,`flattened`類型會將數組中的每個對象的字段路徑展開為獨立的字段。例如,假設你有以下文檔結構:

```json
{
? "user": {
? ? "id": 1,
? ? "name": "John Doe",
? ? "addresses": [
? ? ? {
? ? ? ? "street": "123 Main St",
? ? ? ? "city": "Anytown",
? ? ? ? "state": "NY"
? ? ? },
? ? ? {
? ? ? ? "street": "456 Elm St",
? ? ? ? "city": "Othertown",
? ? ? ? "state": "CA"
? ? ? }
? ? ]
? }
}
```


如果`addresses`字段被定義為`flattened`類型,Elasticsearch 會將`addresses`展開為以下字段路徑:

```json
{
? "user.addresses.street.0": "123 Main St",
? "user.addresses.city.0": "Anytown",
? "user.addresses.state.0": "NY",
? "user.addresses.street.1": "456 Elm St",
? "user.addresses.city.1": "Othertown",
? "user.addresses.state.1": "CA"
}
```


當你執行查詢時,Elasticsearch 會分別匹配這些字段路徑,但無法保證它們屬于同一個嵌套對象。因此,查詢可能會返回不準確的結果。


示例:`flattened`類型在數組結構中的問題

假設你希望查詢所有`city`為`"Anytown"`且`state`為`"CA"`的地址。如果`addresses`字段被定義為`flattened`類型,你可能會寫出以下查詢:

```json
GET /my_index/_search
{
? "query": {
? ? "bool": {
? ? ? "must": [
? ? ? ? {
? ? ? ? ? "term": {
? ? ? ? ? ? "user.addresses.city": {
? ? ? ? ? ? ? "value": "Anytown"
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? },
? ? ? ? {
? ? ? ? ? "term": {
? ? ? ? ? ? "user.addresses.state": {
? ? ? ? ? ? ? "value": "CA"
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? }
? ? ? ]
? ? }
? }
}
```
由于`flattened`類型將數組中的每個對象的字段路徑展開為獨立的字段,Elasticsearch 會分別匹配`city`和`state`,但無法保證它們屬于同一個嵌套對象。因此,查詢可能會返回包含以下內容的文檔:

```json
{
? "hits": {
? ? "total": {
? ? ? "value": 1,
? ? ? "relation": "eq"
? ? },
? ? "max_score": 1.0,
? ? "hits": [
? ? ? {
? ? ? ? "_index": "my_index",
? ? ? ? "_type": "_doc",
? ? ? ? "_id": "1",
? ? ? ? "_score": 1.0,
? ? ? ? "_source": {
? ? ? ? ? "user": {
? ? ? ? ? ? "id": 1,
? ? ? ? ? ? "name": "John Doe",
? ? ? ? ? ? "addresses": [
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "street": "123 Main St",
? ? ? ? ? ? ? ? "city": "Anytown",
? ? ? ? ? ? ? ? "state": "NY"
? ? ? ? ? ? ? },
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "street": "456 Elm St",
? ? ? ? ? ? ? ? "city": "Othertown",
? ? ? ? ? ? ? ? "state": "CA"
? ? ? ? ? ? ? }
? ? ? ? ? ? ]
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? ]
? }
}
```


盡管文檔中沒有完全匹配`city`為`"Anytown"`且`state`為`"CA"`的地址對象,但查詢仍然返回了該文檔。這是因為`flattened`類型無法保證`city`和`state`屬于同一個嵌套對象。


如果嵌套對象不是數組結構呢?

如果嵌套對象不是數組結構,`flattened`類型通常不會出現這種問題。例如,假設你有以下文檔結構:

```json
{
? "user": {
? ? "id": 1,
? ? "name": "John Doe",
? ? "address": {
? ? ? "street": "123 Main St",
? ? ? "city": "Anytown",
? ? ? "state": "CA"
? ? }
? }
}
```


在這種情況下,`address`是一個嵌套對象,而不是數組。如果`address`字段被定義為`flattened`類型,Elasticsearch 會將`address`展開為以下字段路徑:

```json
{
? "user.address.street": "123 Main St",
? "user.address.city": "Anytown",
? "user.address.state": "CA"
}
```
當你執行查詢時,Elasticsearch 會匹配這些字段路徑,而這些字段路徑屬于同一個嵌套對象,因此不會出現不準確的結果。
示例:`flattened`類型在非數組結構中的表現

假設你希望查詢所有`city`為`"Anytown"`且`state`為`"CA"`的地址。如果`address`字段被定義為`flattened`類型,你可能會寫出以下查詢:

```json
GET /my_index/_search
{
? "query": {
? ? "bool": {
? ? ? "must": [
? ? ? ? {
? ? ? ? ? "term": {
? ? ? ? ? ? "user.address.city": {
? ? ? ? ? ? ? "value": "Anytown"
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? },
? ? ? ? {
? ? ? ? ? "term": {
? ? ? ? ? ? "user.address.state": {
? ? ? ? ? ? ? "value": "CA"
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? }
? ? ? ]
? ? }
? }
}
```


返回結果:

```json
{
? "hits": {
? ? "total": {
? ? ? "value": 1,
? ? ? "relation": "eq"
? ? },
? ? "max_score": 1.0,
? ? "hits": [
? ? ? {
? ? ? ? "_index": "my_index",
? ? ? ? "_type": "_doc",
? ? ? ? "_id": "1",
? ? ? ? "_score": 1.0,
? ? ? ? "_source": {
? ? ? ? ? "user": {
? ? ? ? ? ? "id": 1,
? ? ? ? ? ? "name": "John Doe",
? ? ? ? ? ? "address": {
? ? ? ? ? ? ? "street": "123 Main St",
? ? ? ? ? ? ? "city": "Anytown",
? ? ? ? ? ? ? "state": "CA"
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? ]
? }
}
```
在這種情況下,`flattened`類型可以正確匹配`city`和`state`,因為它們屬于同一個嵌套對象。
總結
? `flattened`類型在數組結構中的問題:

? 當嵌套對象是數組時,`flattened`類型會將數組中的每個對象的字段路徑展開為獨立的字段。

? Elasticsearch 無法保證這些字段路徑屬于同一個嵌套對象,因此查詢可能會返回不準確的結果。


? `flattened`類型在非數組結構中的表現:

? 當嵌套對象不是數組時,`flattened`類型可以正確匹配字段路徑,因為這些字段路徑屬于同一個嵌套對象。

? 查詢結果通常是準確的。

因此,`flattened`類型在處理嵌套數組時需要特別小心,而`nested`類型在這種場景下通常是更好的選擇,因為它可以保持嵌套對象的完整性并支持復雜的嵌套查詢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81043.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【目標檢測】RT-DETR

DETRs Beat YOLOs on Real-time Object Detection DETR在實時目標檢測任務中超越YOLO CVPR 2024 代碼地址 論文地址 0.論文摘要 YOLO系列因其在速度與精度間的均衡權衡,已成為實時目標檢測領域最受歡迎的框架。然而我們觀察到,非極大值抑制&#xf…

筆試強訓:Day5

一、笨小猴&#xff08;哈希數學&#xff09; 笨小猴_牛客題霸_牛客網 #include <iostream> #include <cmath> using namespace std; string s; bool isprime(int x){//試除法if(x2) return true;if(x<2||x%20) return false;int nsqrt(x);for(int i3;i<n;i…

掌握 LangChain 文檔處理核心:Document Loaders 與 Text Splitters 全解析

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、什么是LangChain 2、LangChain 在智能應用中的作用 …

開發工具指南

后端運維場用工具 工具文檔簡介1panel安裝指南運維管理面板網盤功能介紹網盤jenkins可以通過1panel 進行安裝jpom輔助安裝文檔后端項目發布工具

拷貝構造函數如果不加引用會怎樣?

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1…

UE5中制作動態數字Decal

在進行城市道路編輯時&#xff0c;經常需要繪制人行道、交通標志、停車線等路面元素。如果能夠使用具有動態修改功能的 Decal&#xff08;貼花&#xff09;&#xff0c;將大大提升編輯效率和靈活性。接下來講解如何制作。 1.首先準備一張包含所需元素的Texture&#xff0c;這里…

【Leetcode 每日一題】2900. 最長相鄰不相等子序列 I

問題背景 給你一個下標從 0 0 0 開始的字符串數組 w o r d s words words&#xff0c;和一個下標從 0 0 0 開始的 二進制 數組 g r o u p s groups groups&#xff0c;兩個數組長度都是 n n n。 你需要從 w o r d s words words 中選出 最長子序列。如果對于序列中的任何…

ProfibusDP主站轉ModbusRTU/TCP與橫河AXG電磁流量計通訊案例

ProfibusDP主站轉ModbusRTU/TCP與橫河AXG電磁流量計通訊案例 在當今數字化工業時代&#xff0c;智能儀表與控制系統的互聯互通成為提高生產效率和管理水平的關鍵。橫河AXG電磁流量計作為一款高性能的流量測量設備&#xff0c;在多個行業得到了廣泛應用。而Profibus DP作為一種…

微軟向現實低頭:悄悄延長Windows 10的Microsoft 365支持

快科技5月11日消息&#xff0c;Windows 10將在今年10月14日正式結束支持&#xff0c;此前微軟曾明確表示&#xff0c;Microsoft 365&#xff08;M365&#xff09;應用&#xff0c;如Outlook、Teams、OneDrive、Word、Excel等&#xff0c;也將隨之停止支持。 不過無法升級至Win…

【Spring AI】模型記憶持久化 + 自動加載記憶上下文

當我們利用大模型進行開發時&#xff0c;有時會因為項目重啟而丟失模型的記憶&#xff0c;會給開發的過程帶來不方便 接下來我將介紹如何將模型的記憶持久化&#xff0c;并保證在項目重啟后依然能能夠正常加載記憶上下文。 我們在配置ChatClient時&#xff0c;由于想要實現模…

(C語言)超市管理系統 (正式版)(指針)(數據結構)(清屏操作)(文件讀寫)

目錄 前言&#xff1a; 源代碼&#xff1a; product.h product.c fileio.h fileio.c main.c 代碼解析&#xff1a; 一、程序結構概述 二、product.c 函數詳解 1. 初始化商品列表 Init_products 2. 添加商品 add_product 3. 顯示商品 display_products 4. 修改商品 mo…

[服務器面板對比] 寶塔、aaPanel、Plesk、cPanel 哪家強?功能、性能與價格橫評 (2025)

對于很多 Linux 服務器用戶來說&#xff0c;直接面對黑乎乎的命令行界面 (CLI) 進行各種操作&#xff0c;雖然強大靈活&#xff0c;但也確實有一定的學習門檻和操作復雜度。特別是當你需要管理多個網站、數據庫、FTP賬戶&#xff0c;或者進行日常的軟件安裝、安全配置、日志查看…

WebGL圖形編程實戰【7】:變換流水線 × 坐標系與矩陣精講

變換流水線 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…

電力電容器故障利用沃倫森(WARENSEN)工業設備智能運維系統解決方案

行業工況背景 當配電室報警顯示“電容器故障”時&#xff0c;管理者可能會感到焦慮。沃倫森&#xff08;WARENSEN&#xff09;憑借十多年的電力補償設備服務經驗&#xff0c;提供了科學的故障應對流程&#xff0c;幫助避免大部分二次損失。 一、五大常見故障現象快速識別 溫度…

星海智算云平臺部署GPT-SoVITS模型教程

背景 隨著 GPT-SoVITS 在 AI 語音合成領域的廣泛應用&#xff0c;越來越多的個人和團隊開始關注這項前沿技術。你是否也在思考&#xff0c;如何快速、高效地部署并體驗這款強大的聲音克隆模型&#xff1f;遺憾的是&#xff0c;許多本地部署方案不僅配置復雜&#xff0c;而且對…

高吞吐與低延遲的博弈:Kafka與RabbitMQ數據管道實戰指南

摘要 本文全面對比Apache Kafka與RabbitMQ在數據管道中的設計哲學、核心差異及協同方案。結合性能指標、應用場景和企業級實戰案例,揭示Kafka在高吞吐流式處理中的優勢與RabbitMQ在復雜路由和低延遲傳輸方面的獨特特點;介紹了使用Java生態成熟第三方庫(如Apache Kafka Clie…

Python零基礎入門到高手8.4節: 元組與列表的區別

目錄 8.4.1 不可變數據類型 8.4.2 可變數據類型 8.4.3 元組與列表的區別 8.4.4 今天彩票沒中獎 8.4.1 不可變數據類型 不可變數據類型是指不可以對該數據類型進行原地修改&#xff0c;即只讀的數據類型。迄今為止學過的不可變數據類型有字符串&#xff0c;元組。 在使用[]…

無人機數據處理與特征提取技術分析!

一、運行邏輯 1. 數據采集與預處理 多傳感器融合&#xff1a;集成攝像頭、LiDAR、IMU、GPS等傳感器&#xff0c;通過硬件時間戳或PPS信號實現數據同步&#xff0c;確保時空一致性。 邊緣預處理&#xff1a;在無人機端進行數據壓縮&#xff08;如JPEG、H.265&#xff09;…

LeetCode 熱題 100 105. 從前序與中序遍歷序列構造二叉樹

LeetCode 熱題 100 | 105. 從前序與中序遍歷序列構造二叉樹 大家好&#xff0c;今天我們來解決一道經典的二叉樹問題——從前序與中序遍歷序列構造二叉樹。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求根據給定的前序遍歷和中序遍歷序列&#xff0c;構造并返回二叉樹…

CSS- 1.1 css選擇器

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 系…