簡體   English   中英

Elastic Search - 對嵌套文檔進行排序和過濾

[英]Elastic Search - Sorting & Filtering on nested Documents

我正在開發電子商務應用程序。 目錄數據由 Elastic Search 提供。 我有已經在 Elastic Search 中編入索引的產品文檔。

文檔看起來像這樣(為了更好的可讀性排除了幾個字段):

{
     "title" : "Product Name",
      "volume" : "200gm",
      "brand" : {
        "brand_code" : XXXX,
        "brand_name" : "Brand Name"
      },
      "@timestamp" : "2021-08-26T08:08:11.319Z",
      "store" : [
        {
          "physical_unit" : 0,
          "default_price" : 115.0,
          "_id" : "1234_111",
          "product_code" : "1234",
          "warehouse_code" : 111,
          "available_unit" : 100
        }
      ],
      "category" : {
        "category_code" : 987,
        "category_name" : "CategoryName",
        "category_url_link" : "CategoryName",
        "super_category_name" : "SuperCategoryName",
        "parent_category_name" : "ParentCategoryName"
      }
    }

上述文檔中的 store object 是 ES Query 將在其中查找價格並確定商品是有貨還是缺貨的地方。

我想添加更多子對象來存儲(基本上是來自多個庫存的數據)。 這可以 go 每個產品最多 150 個子對象。

最終,產品文檔將看起來像這樣,其中多個庫存的數據映射到一個特定的文檔。

{
     "title" : "Product Name",
      "volume" : "200gm",
      "brand" : {
        "brand_code" : XXXX,
        "brand_name" : "Brand Name"
      },
      "@timestamp" : "2021-08-26T08:08:11.319Z",
      "store" : [
        {
          "physical_unit" : 0,
          "default_price" : 115.0,
          "_id" : "1234_111",
          "product_code" : "1234",
          "warehouse_code" : 111,
          "available_unit" : 100
        },
        {
          "physical_unit" : 0,
          "default_price" : 125.0,
          "_id" : "1234_112",
          "product_code" : "1234",
          "warehouse_code" : 112,
          "available_unit" : 100
        },
        {
          "physical_unit" : 0,
          "default_price" : 105.0,
          "_id" : "1234_113",
          "product_code" : "1234",
          "warehouse_code" : 113,
          "available_unit" : 100
        }
        Upto N no of stores
      ],
      "category" : {
        "category_code" : 987,
        "category_name" : "CategoryName",
        "category_url_link" : "CategoryName",
        "super_category_name" : "SuperCategoryName",
        "parent_category_name" : "ParentCategoryName"
      }
    }

功能要求:

  1. 對於任何產品,我們應該顯示所有倉庫的最低價格。 對於 EX:如果某個特定產品有 50 家商店映射到它,Elastic Search 查詢應該查看嵌套的 object 並獲取所有 50 家商店中最低的值(如果商品可用)。
  2. 性能不應降低。

挑戰:

  1. 如果我們開始為每個產品存儲那么多商店,數據將 go 相當高。 那會有問題嗎?
  2. 從嵌套文檔中提取最低價格的有效方法是什么?
  3. 構面如何在嵌套文檔中工作? 就像我應用價格范圍過濾器一樣,ES 會獲取之前未顯示的數據。 (它可能會從其他商店中選擇與范圍匹配的數據)

我們正在使用模板查詢 ES,Elastic Search 的版本是 6.0。 提前致謝!!

首先,7.x 版對嵌套文檔搜索進行了改進,值得升級。

至於 6.x 版本,有很多因素我無法給你一個具體的答案。 您似乎還沒有理解嵌套文檔的工作方式,它們不是關系型的。

特別是當你說每個產品可能有 50 個商店映射到它時,這聽起來像是在暗示一種關系,這種關系不會存在於嵌套文檔中。 但是,這 50 個商店的值將存儲在嵌套在父文檔下的索引中。 在一個產品或類別下擁有 50 家商店聽起來並不重要。

ElasticSearch自從引入聚合框架后就沒有真正在切面方面講過。 並不是它們不存在,只是它們的討論方式不同。

所以讓我們試試這個。 ElasticSearch通過分而治之的機制優化了搜索和查詢。 數據分布在幾個分片上,一個可配置的數量,每個分片負責審查自己的數據。 此外,這些碎片可以分布在許多機器上,因此有很多 cpu 和大量 memory 用於搜索。 因此,如果您願意增加集群,增加數據並不重要,因為可以保持每台機器做與以前相同的工作量的情況。

與關系數據庫不同,過濾器搜索詞允許 Elastic 大幅減少它正在查看的數據,並且更多的過濾器將提高關系數據庫性能下降的性能。

現在回到嵌套文檔。 它們存儲為單獨的索引,但不是將結果映射到嵌套文檔,而是將結果 map 映射到父文檔 ID。 所以你嵌套的文檔與文檔的 rest 不完全在同一個索引中,盡管它們也不是真正分開的。 但這確實意味着嵌套文檔對父文檔的查詢性能的影響應該最小。 但是,如果您的數據大小增長到超出當前系統的容量,您仍然需要增加它的大小。

至於如何查詢,您將使用彈性聚合。 這些將允許您計算您的“方面”計數並確定最佳價格。 Elastic 聚合非常強大且速度非常快。 有詳細記錄的注意事項,但通常它們會按您預期的那樣工作。

在 6.x 版本中,查詢字符串查詢無法訪問嵌套文檔中的搜索條件,必須使用復雜的查詢。

回顧一下

功能要求:

  1. 對於任何產品,我們應該顯示所有倉庫的最低價格。 對於 EX:如果特定產品有 50 個商店映射到它,ElasticSearch 查詢應該查看嵌套的 object 並獲取所有 50 個商店中最低的值(如果商品可用)。

是的,嵌套聚合將執行此操作。

  1. 性能不應降低。

性能將繼續取決於數據大小與整個集群大小的比率。

挑戰:

如果我們開始為每個產品存儲那么多商店,數據將 go 相當高。 那會有問題嗎?

不,這應該不是問題

從嵌套文檔中提取最低價格的有效方法是什么?

彈性聚合

構面如何在嵌套文檔中工作? 就像我應用價格范圍過濾器一樣,ES 會獲取之前未顯示的數據。 (它可能會從其他商店中選擇與范圍匹配的數據)

是的,過濾可以很好地與聚合一起使用。 聚合將基於過濾后的數據。 事實上,您可以僅基於最低價格進行聚合,然后在同一查詢中使用您的價格范圍進行聚合,這將為您提供在該價格范圍內擁有商店的文檔數量,並且您可以有一個子聚合顯示每個價格范圍內的商店。

我們正在使用模板查詢 ES,Elastic Search 的版本是 6.0。 提前致謝!!

我對模板一無所知。 ElasticSearch API 太簡單了 我不知道為什么有人在 API 之上使用其他工具,它們只是增加重量,增加復雜性並使關鍵功能不可用,因為包裝器作者沒有通過該功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM