簡體   English   中英

在Solr索引字段名稱中使用唯一標識符

[英]Using an unique identifier in Solr indexed field name

我的文檔中具有以下結構:

doc:1

{
  "123e4567-e89b-12d3-a456-426655440000": {
    "order_id": "100",
    "qty": 27
  },
  "321e7654-e89b-21d3-a654-426655441111": {
    "order_id": "234",
    "qty": 12
  }
}

doc:2

{
  "123e4567-e89b-12d3-a456-426655440000": {
    "order_id": "101",
    "qty": 27
  },
  "789ab763-a56b-87bb-a654-873655442222": {
    "order_id": "345",
    "qty": 23
  }
}

其中,文檔根目錄中的uuid表示客戶標識符,而嵌套對象表示客戶下的訂單。

我唯一關心的查詢是通過對客戶標識符和訂單標識符的單個字段進行簡單查詢,以找到他們的訂單:

customer_idx?q=*:*&fq=123e4567-e89b-12d3-a456-426655440000.order_id:*&sort=123e4567-e89b-12d3-a456-426655440000.order_id asc&rows=3

或特定的一種:

customer_idx?q=*:*&fq=123e4567-e89b-12d3-a456-426655440000.order_id:101&rows=1

問題 可以在客戶標識符上定義dynamicField嗎? 從性能角度來看。 在這種情況下,對於特定的模式,我最終將獲得成千上萬個字段。

<dynamicField name="*.order_id" type="string" indexed="true" stored="false" multiValued="false" />

我知道,如果我在單個查詢中使用許多索引字段,則會對性能和內存消耗產生影響,這是因為Lucene為我查詢或排序的每個字段在每個文檔中創建了一個由每個項目組成的數組。 但是,如果有成千上萬個字段,那么我將同時查詢其中一個字段是否會成為問題?

如果沒有,什么是更好的解決方案?

謝謝。

UPDATE :更新了查詢示例。 添加了過濾器,排序和限制。 以防萬一。

當您開始對結果集進行排序時,此類查詢的主要問題就會出現。 FieldCache(如果現在使用docValues則可以避免這種情況)將為索引中每個文檔的位置填充一個int(docid),即使只有少量文檔具有一個字段,將生成整個數組。 有一個補丁可用於創建稀疏列表,僅列出確實包含該字段的那些文檔。

無論如何,最簡單的解決方法是將數據結構轉換為每種查詢類型僅使用一個字段:

customer_id:123e4567-e89b-12d3-a456-426655440000
customer_id_order_id:123e4567-e89b-12d3-a456-426655440000_101

..因此,無論您擁有多少個字段,您都可以為每個字段獲得一個緩存。

您還可以將文檔分為兩個單獨的文檔,每個customer / order_id組合一個,然后將它們作為常規文檔進行查詢(而不是在每個文檔中包含兩個值)。

暫無
暫無

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

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