Solr和SolrNet的问题和指导

时间:2012-04-14 16:14:57

标签: solr solrnet

我刚刚开始使用Solr和SolrNet。在我对目前的项目走得太远之前,我想验证我是否在正确的轨道上。这是我想要实现的目标:

基本要求:

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

    1. 用户使用术语进行搜索。
    2. 显示四个链接,每个实体一个,旁边有一个数字值,表示每个实体的点击次数。
    3. 用户点击链接,页面会显示该实体的构面和搜索结果。
    4. 所以鉴于这个要求,这是我到目前为止所做的:

      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,其中我放置了应该搜索的所有字段(来自所有实体)。
      5. 这是我的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处理程序中可用作facet的所有字段,如您所见,这是正确的方法吗?如果没有,那是什么?
        5. 我确信在完成我的项目时我会有更多的问题,但是现在这样做了。

1 个答案:

答案 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绝对没问题。

所以,总结一下:

  • 考虑您想要做什么样的查询。如果您搜索自行车或汽车,可以使用不同的索引
  • 考虑一下你会有多少文件。如果它们将成为数百万,那么这种逻辑拆分将是您可以做的最好的事情,以获得更好的性能,但您将不得不做更多的查询!