2012-04-14 58 views
2

我刚开始使用的Solr和SolrNet。在我对当前项目进行太多调整之前,我想验证自己是否正确。这是我想实现:Solr的和SolrNet问题,并指导

基本要求:

  1. 提供,搜索对多个实体(汽车,轮船,飞机,自行车等),我只是做了这些在这里搜索解决方案。每个实体可以具有可变数量的非对称数据的字段。
  2. 为每个实体提供构面。
  3. 为每个实体提供过滤器。

工作流程:

  1. 与长期用户搜索。
  2. 四链路,一个用于每个实体已显示具有数值旁边指示每个实体的命中数。
  3. 用户单击一个链接并显示该页面的面和该实体的搜索结果。

所以,有了这一要求,这里是我迄今所做的:

  1. 创建一个单一的指标,但与像car_name,car_model,car_company,ship_name,ship_model,ship_company每个实体的具体领域, ship_age,ship_size等
  2. 我在指数,其被设置为实体之一的字段ENTITY_TYPE。
  3. ID在所有实体中都是唯一的。
  4. 我有一个DisMax搜索处理机solrconfig.xml中,在我把所有的领域(从所有实体)应搜索上。

这里是我的DisMax搜索处理机的样子:

<requestHandler name="DisMax" class="solr.SearchHandler"> 
    <lst name="defaults"> 
     <str name="echoParams">explicit</str> 
     <str name="defType">edismax</str> 
     <str name="qf"> 
      car_name car_company car_model ship_name ship_company ship_model ship_sailing_route plane_name plane_company plane_model bicycle_name bicycle_company bicycle_model 
     </str> 
     <str name="q.alt">*:*</str> 
     <str name="rows">10</str> 
     <str name="fl">*,score</str> 
     <str name="facet">on</str> 
     <str name="facet.field">car_comapny</str> 
     <str name="facet.field">car_model</str> 
     <str name="facet.field">ship_name</str> 
     <str name="facet.field">ship_company</str> 
     <str name="facet.field">ship_sailing_route</str> 
     ... 
    </lst> 
</requestHandler> 

最后,这里是我的问题:

  1. 这是一个索引的路线是正确的做法,或者我应该创建单独的每个实体的索引?请解释。
  2. 如果它们应该是单独的索引,我如何在给定的术语上搜索它们?重要的是,我如何使用SolrNet来做到这一点?
  3. 有没有一种方法可以搜索使用SolrNet的所有实体并检索结果?或者是否需要为每个实体分别执行查询(可能会并行)使用相同的搜索词?
  4. 我有应可作为DisMax处理程序方面,你可以看到的所有字段的列表,这是正确的做法?如果不是,那是什么?

我相信当我通过我的项目工作时,我会有更多的问题,但现在这会做。

回答

3

如果你将有大量的每个类型的项目,拆分可能是一个明智的想法(只是为了性能起见,没有别的)。这也取决于你正在拖入模式的东西之间的相似之处和不同之处。例如,二轮车,汽车,轮船,都有公司,名称,型号等,因此您可以只使用名称,型号,公司字段,然后是另一个表示“vehicle_type”的字段。 如果变量字段(称为可选字段)仅为少数,那么可以为这些字段设置动态字段,因此您不需要严格的模式。

如果你使用不同的索引(和模式),你的查询需要知道所有不同的字段和模式。更不用说,为此你需要一个多核实例,并且(AFAIK)你不能一次发送查询到多个核心。

这取决于你想要做什么查询。假设您想要搜索名称为“vairo”的车辆,但用户不指定他是否想要bicicles或汽车等。您需要将搜索分配到所有不同的核心,如

/solr/bicicles/select?q=bicicle_name:vairo 
/solr/cars/select?q=car_name:vairo 
/solr/ships/select?q=ship_name:vairo 

然后合并结果。 如果您将所有内容都放在单个索引上,则只需搜索q=name:vairo即可。然后,通常情况下,您会面对“vehicle_type”,告诉用户有1000个这样的名字,还有其他几辆车。如果用户现在指定“确定,只给予bicicles”,您保留之前的查询,但添加& fq = vehicle_type:bicicle

这比处理根据过滤器查询哪个索引的逻辑要方便得多。 同时合并来自多个响应的结果也不是微不足道的。

在我们公司,我们对所有类别使用单一的solr。很明显,他们都拥有不存在的其他选择权(比如房地产与车辆)。有些处理动态字段和其他一些正常字段。如果您没有在文档中发送任何内容,SOLR是可以的。

例如:

squared_meters 
rooms 
vehicle_type 
vehicle_doors 

在一个单一的索引。正如你可能猜到的那样,当我们索引一个文档时,有一半以上的字段是空的(无论是汽车还是房子)。 SOLR在查询和索引时间都是绝对可以的。

所以,总结一下:

  • 考虑你想要做什么样的查询。如果你搜索自行车或汽车,不同的索引是好的
  • 考虑你将有多少文件。如果他们将成为数百万人,那么这种逻辑分割将是您可以做得更好的表现的最佳方式,但是您必须做更多的查询!
+0

您只是部分回答了我的问题,所以我不接受它作为正式答案,但非常感谢您的意见。由于我索引的记录量很低,因此我将使用单一索引。 – codelove 2012-04-17 14:30:35