我刚刚开始使用Solr和SolrNet。在我对目前的项目走得太远之前,我想验证我是否在正确的轨道上。这是我想要实现的目标:
基本要求:
工作流:
所以鉴于这个要求,这是我到目前为止所做的:
这是我的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>
最后,这是我的问题:
我确信在完成我的项目时我会有更多的问题,但是现在这样做了。
答案 0 :(得分:3)
如果你打算每种类型都有很多物品,拆分可能是一个明智的想法(只是为了表现,没有别的)。它还取决于你在模式中投入的东西之间的相同点和不同点 例如,bicicle,汽车,船舶,都有公司,名称,型号等共同,所以你可以只有名称,型号,公司字段,然后另一个说“vehicle_type”。 如果变量字段(称为选项)只是少数,那么您可以为这些字段设置动态字段,因此您不需要严格的模式。
如果使用不同的索引(和模式),您的查询需要知道所有不同的字段和模式。更不用说为了让你需要一个多核实例,而且(AFAIK)你不能一次向多个核心发送查询。
这取决于您想要执行的查询。假设您要搜索名称为“vairo”的车辆,但用户未指定他是否需要bicicle或汽车等等。您需要将搜索分发到所有不同的核心,例如
/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个具有该名称的bicicle,以及很少的其他车辆。如果用户现在指定“ok,gimme only the bicicles”,则保持查询,但添加&amp; fq = vehicle_type:bicicle 。
这比根据过滤器处理要查询的索引的逻辑要方便得多。 同时合并多个响应的结果并非易事。
在我们公司,我们为所有类别使用单个solr。显然,他们所有人都没有其他选项(想想房地产与车辆)。一些用动态字段处理,另一些用普通字段处理。如果您不在文档中发送内容,SOLR就可以了。
例如:
squared_meters
rooms
vehicle_type
vehicle_doors
全部在一个索引中。正如您可能猜到的那样,当我们索引文档时,机会的一半以上将是空的(无论是汽车还是房屋)。在查询和索引时,SOLR绝对没问题。
所以,总结一下: