2015-02-11 67 views
0

我正在构建一个SOLR集群,其中每个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模式时,属性(字段)是动态的。所以我不需要知道所有属性是什么。

任何想法?

+0

你打算通过历史数据来搜索吗?如果不是,它不应该在Solr。 – 2015-02-11 04:40:07

+0

@AlexandreRafalovitch是的。我希望能够搜索并获取具有特定属性的所有公司的列表,这些公司在某个日期与另一个日期之间具有特定值。使用上面的示例,我想查询SOLR,并获取2012年至2013年所有小于50的公司的列表。 – tknickman 2015-02-11 04:44:49

回答

0

如果您仅将Solr用于搜索,并且不要存储字段内容,但仅对其进行索引,则数据的重复可能并不重要。索引值(即使它在20个文档中显示)只存储一次,然后只列出包含它们的文档。

因此,您可以将您的主要数据源与其他所有字段相关联,并使用Solr进行搜索。

+0

理想情况下,我们希望将所有数据都存储在SOLR中。 – tknickman 2015-02-11 16:57:53

+0

您不应将Solr用作主数据库。它是为搜索而设计和优化的。虽然它非常可靠,但正确的架构仍然会将主要数据存储在其他地方。您还有其他选择可以避免Solr中的数据重复,包括父/子实体,外部值字段等,但所有选项都有更复杂的折衷。最好先建立一个原型,并试验对你的具体数据的影响。 – 2015-02-12 14:22:53