我的文件中有以下结构:
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会为每个查询或排序的字段为每个文档创建一个项目数组。但是,如果拥有数十万或数百万个字段,这会是一个问题,我会同时查询其中一个字段吗?
如果没有,那么什么是更好的解决方案?
感谢。
更新:更新的查询示例。添加了过滤器,排序和限制。万一重要。
答案 0 :(得分: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组合,因此,将它们作为常规文档查询(而不是在每个文档中包含两个值)。