0

我的文档中有以下结构:

文档:1

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

文档: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 会为我查询或排序的每个字段创建一个包含每个文档的一个项目的数组。但是,如果有数十万或数百万个字段,我会同时查询其中一个,这会不会有问题?

如果没有,有什么更好的解决方案?

谢谢。

更新:更新的查询示例。添加了过滤器、排序和限制。以防万一。

4

1 回答 1

0

当您开始对结果集进行排序时,此类查询的主要问题就出现了。FieldCache(如果您现在使用 docValues,您可能可以避免)将为索引中的每个文档填充一个关于其位置的 int(docid),即使只有少量文档有一个字段,将生成整个数组。有一个补丁可用于创建稀疏列表,仅列出那些包含字段的文档。

无论如何,简单的解决方法是将您的数据结构转换为每个查询类型仅使用一个字段:

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

.. 因此,无论您有多少字段,您都会为每个字段获得一个缓存。

您还可以将文档分成两个单独的文档,一个用于每个 customer/order_id 组合,因此,将它们作为常规文档进行查询(而不是在每个文档中有两个值)。

于 2017-12-10T19:57:34.060 回答