我正在构建一个SOLR集群,其中每个SOLR文档都对应于一家公司的数据。例如,跟踪以下属性:
1. name
2. size
3. location
4. awards
5. profit
我的问题是,我还想跟踪历史数据中可能更改的属性(如大小/奖励)。我知道做这件事的简单方法是在SOLR中为每个时间范围提供一个文档。因此,如果我想得到2012-2013年所有规模在50以下的公司,这是一个简单的SOLR查询。然而,我与近2000万家公司打交道。使用上述策略意味着,每当一个属性发生更改时,我们都会复制该文档,从而显著增加solr集群中的文档数量。
我正在尝试想出一种聪明的方法来使用SOLR中的字段,这样我就可以在公司主文档中跟踪不推荐使用的属性及其日期。但我似乎找不出一个好的方法来做这件事。我知道这部分是因为这个问题不是SOLR设计的目的,以这种方式存储数据意味着它没有正确规范化。然而,我只是在寻找一个好方法来避免大量复制我的数据。
关键用例是能够执行以下查询:
select all companies that were under size 50 from 2012 to 2013
因此,每个属性都必须链接到一个值、一个有效日期和一个不推荐使用的日期字段。此外,属性值和日期必须是可搜索的。
我想做这样的事情:
{
"size":[
{
"date_deprecated": None,
"date_valid":"2015-01-01",
"value":"100"
},
{
"date_deprecated":"2014-12-31",
"date_valid":"2014-01-01",
"value":"50"
},
{
"date_deprecated":"2013-12-31",
"date_valid":"2013-01-01",
"value":"25"
}
]
}
但很明显,这在SOLR中并不适用。此外,属性(字段)是动态的,因为我使用动态solr模式。所以我不需要知道所有的属性是什么。
有什么想法吗?
如果您只使用Solr进行搜索,而不存储字段内容,而只对其进行索引,则数据的重复可能不会有什么大不了的。即使索引值出现在20个文档中,也会存储一次,然后只列出包含这些值的文档。
因此,您可以在其他地方拥有包含所有字段的主数据源,并使用Solr进行搜索。