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

ElasticSearch之Nested對象

這篇具有很好參考價值的文章主要介紹了ElasticSearch之Nested對象。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

寫在前面

本文看下es的nested嵌套對象相關內(nèi)容。

1:es用了啥范式?

在關系型數(shù)據(jù)庫中定義了6大數(shù)據(jù)庫范式,即1,2,3,BC,4,5的NF(normal form),分別如下:

1NF:每個列都不可拆分,即都是原子的
2NF:在滿足1NF的基礎上,消除部分函數(shù)依賴
3NF:在滿足2NF的基礎上,消除傳遞函數(shù)依賴
BCNF:在滿足3NF的基礎上,消除主屬性對于碼的部分函數(shù)依賴和傳遞函數(shù)依賴(此時和非主鍵列沒有關系)
4NF:在滿足BCNF的基礎上,消除表內(nèi)的多對多關系
5NF:略

數(shù)據(jù)庫范式的目的在于減少更新的復雜度,以及降低磁盤的存儲空間。其中對于第二個問題存儲設備目前非常廉價而且容量很大,所以不是什么問題了。對于第一個更新的復雜度問題會帶來的查詢效率變低的問題,因為需要更多的關聯(lián)join。那么對于es來說它是使用了哪種范式呢?因為es的設計目標是快速查詢,所以使用到是反范式,即冗余存儲。比如如下的數(shù)據(jù):
ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式
如果按照關系型數(shù)據(jù)庫范式來設計,user的信息需要存儲到單獨的一張表中去,但是在es中就是在一個對象中來存儲,對于這種存儲,es支持非常方便和高效的查詢:

  • 準備數(shù)據(jù)
DELETE blog
# 設置blog的 Mapping
PUT /blog
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      },
      "time": {
        "type": "date"
      },
      "user": {
        "properties": {
          "city": {
            "type": "text"
          },
          "userid": {
            "type": "long"
          },
          "username": {
            "type": "keyword"
          }
        }
      }
    }
  }
}


# 插入一條 Blog 信息
PUT blog/_doc/1
{
  "content":"I like Elasticsearch",
  "time":"2019-01-01T00:00:00",
  "user":{
    "userid":1,
    "username":"Jack",
    "city":"Shanghai"
  }
}
  • 查詢
# 查詢 Blog 信息
POST blog/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"content": "Elasticsearch"}},
        {"match": {"user.username": "Jack"}}
      ]
    }
  }
}

ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式
我們再來看一個存儲對象數(shù)組的例子:
ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式

  • 準備數(shù)據(jù)
DELETE my_movies

# 電影的Mapping信息
PUT my_movies
{
      "mappings" : {
      "properties" : {
        "actors" : {
          "properties" : {
            "first_name" : {
              "type" : "keyword"
            },
            "last_name" : {
              "type" : "keyword"
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}


# 寫入一條電影信息
POST my_movies/_doc/1
{
  "title":"Speed",
  "actors":[
    {
      "first_name":"Keanu",
      "last_name":"Reeves"
    },

    {
      "first_name":"Dennis",
      "last_name":"Hopper"
    }

  ]
}
  • 查詢first_name為Keanu并且last_name為Hopper的文檔信息
POST my_movies/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"actors.first_name": "Keanu"}},
        {"match": {"actors.last_name": "Hopper"}}
      ]
    }
  }

}

ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式
按照正常思維,應該查不到才對,但為什么查到了呢?這和es的數(shù)據(jù)存儲方式有關系,對于數(shù)組es默認是按照一種扁平結構來存儲的,如下:
ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式
這種存儲結構的好處是可以加快查詢的速度,但壞處呢就是上例中反直覺結果。

所以如果能夠讓內(nèi)部的對象也按照單獨文檔來存儲,就能解決這個查詢錯誤的問題了,而想要使用單獨的文檔來存儲內(nèi)部的對象,就需要用到es提供的nested對象功能,繼續(xù)來看(作為本文的主題,必須單開一部分,還必須是一級標題??????)。

2:nested對象

nested是一種定義對象的數(shù)據(jù)類型,比如可通過如下方式來定義一個nested的類型:
ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式
在保存時會被保存為單獨的文檔,查詢時通過join的方式來查詢,當然此時會犧牲掉部分查詢性能。

  • 創(chuàng)建如下的mapping
DELETE my_movies
# 創(chuàng)建 Nested 對象 Mapping
PUT my_movies
{
      "mappings" : {
      "properties" : {
        "actors" : {
          "type": "nested",
          "properties" : {
            "first_name" : {"type" : "keyword"},
            "last_name" : {"type" : "keyword"}
          }},
        "title" : {
          "type" : "text",
          "fields" : {"keyword":{"type":"keyword","ignore_above":256}}
        }
      }
    }
}
  • 接著來插入測試數(shù)據(jù)
POST my_movies/_doc/1
{
  "title":"Speed",
  "actors":[
    {
      "first_name":"Keanu",
      "last_name":"Reeves"
    },

    {
      "first_name":"Dennis",
      "last_name":"Hopper"
    }

  ]
}

此時存儲結構為紅框中所示:
ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式

  • 查詢first_name為Keanu并且last_name為Hopper的文檔信息
    此時就查詢不到了:
POST my_movies/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "nested": {
                        "path": "actors",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match": {
                                            "actors.first_name": "Keanu"
                                        }
                                    },
                                    {
                                        "match": {
                                            "actors.last_name": "Hopper"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}

ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式
當然如果把"actors.last_name": "Hopper"改為Reeves是能查出來數(shù)據(jù)的:
ElasticSearch之Nested對象,ElasticSearch,elasticsearch,nested對象,數(shù)據(jù)庫范式,反范式

寫在后面

參考文章列表

關系型數(shù)據(jù)庫MySQL及其優(yōu)化 。文章來源地址http://www.zghlxwxcb.cn/news/detail-844111.html

到了這里,關于ElasticSearch之Nested對象的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • Elasticsearch:如何修改 nested 字段的值

    Nested 類型是 object 數(shù)據(jù)類型的特殊版本,它允許對象數(shù)組以一種可以彼此獨立查詢的方式進行索引。在內(nèi)部,嵌套對象將數(shù)組中的每個對象索引為單獨的隱藏文檔,這意味著每個嵌套對象都可以使用 nested query 獨立于其他對象進行查詢。每個 nested 對象都被索引為一個單獨的

    2024年02月14日
    瀏覽(18)
  • 6.ELK之Elasticsearch嵌套(Nested)類型

    6.ELK之Elasticsearch嵌套(Nested)類型

    在Elasticsearch實際應用中經(jīng)常會遇到嵌套文檔的情況,而且會有“對象數(shù)組彼此獨立地進行索引和查詢的訴求”。在ES中這種嵌套文檔稱為父子文檔,父子文檔“彼此獨立地進行查詢”至少有以下兩種方式: 1)父子文檔。在ES的5.x版本中通過parent-child父子type實現(xiàn),即一個索引

    2024年02月03日
    瀏覽(17)
  • ElasticSearch第五講 ES nested嵌套文檔與父子文檔處理

    在ES中,處理實體之間的關系并不像關系型存儲那樣明顯。在關系數(shù)據(jù)庫中的黃金準則 - 數(shù)據(jù)規(guī)范化,在ES中并不適用。在處理關聯(lián)關系,嵌套對象和父子關聯(lián)關系中,我們會討論幾種可行方案的優(yōu)點和缺點。 緊接著在為可擴展性而設計中,我們會討論ES提供的一些用來快速靈

    2024年02月02日
    瀏覽(22)
  • Elasticsearch多層嵌套nested查詢和多條件聚合aggregations

    ?當在aggregations中使用嵌套多條件,需要用bool包起來,如果直接在filters[]里寫,將會分多個桶,分別按單個條件統(tǒng)計; ?部分片段截?。?當需要將多層嵌套nested用多個條件AND起來時: 全部片段: Elasticsearch 多層嵌套nested 多條件聚合aggregations

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

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

    2024年01月22日
    瀏覽(93)
  • Elasticsearch 基于 array 結構 的nested類型的索引的聚合查詢

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

    2024年02月16日
    瀏覽(21)
  • Elasticsearch 8.X 如何依據(jù) Nested 嵌套類型的某個字段進行排序?

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

    這是來自社區(qū)的一個真實企業(yè)場景問題。 https://elasticsearch.cn/question/13135 如下所示, 希望在查出的結果后, 對結果進行后處理,對tags列表,根據(jù)depth進行排序。 Elasticsearch 能支持的排序方式羅列如下: 包含但不限于: 基于特定字段的排序 基于Nested對象字段的排序 基于特定

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

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

    2024年04月22日
    瀏覽(100)
  • 數(shù)據(jù)庫報錯 Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Access denied

    數(shù)據(jù)庫報錯 Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Access denied

    如果你也是用Java連接數(shù)據(jù)庫的可以嘗試看看 第一種類型 如果是MySQL8.0以上的,需要在后面加上 如果是這種的錯誤類型的,可以試試 第二種類型 數(shù)據(jù)庫沒有設置開放權限,不給連接,這種情況就算是使用連接數(shù)據(jù)庫工具也沒辦法連接的。解決方式如下 第三種類型 這種如果是

    2024年01月24日
    瀏覽(96)
  • clickhouse的嵌套數(shù)據(jù)結構Tuple、Array與Nested類型介紹和使用示例

    clickhouse的嵌套數(shù)據(jù)結構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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包