2

我刚刚开始使用 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 处理程序中作为构面可用的所有字段的列表,这是正确的方法吗?如果不是,那是什么?

我确信在我完成我的项目时我会有更多的问题,但现在就可以了。

4

1 回答 1

3

如果您要每种类型有很多项目,那么拆分可能是一个明智的想法(仅出于性能考虑,仅此而已)。它还取决于您要放入架构中的内容之间的异同。
例如,bicicles、cars、ships 都有共同的公司、名称、型号等,因此您可以只有名称、型号、公司字段,然后是另一个显示“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 辆具有该名称的 bicicle,以及很少的其他车辆。如果用户现在指定“ok,gimme only the bicicles”,您可以像以前一样保留查询,但添加&fq=vehicle_type:bicicle

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

在我们公司,我们对所有类别都使用一个 solr。显然,它们都有其他选项不存在的选项(想想房地产与车辆)。有些用动态字段处理,有些用普通字段处理。如果您不在文档中发送任何内容,SOLR 就可以了。

例如:

squared_meters
rooms
vehicle_type
vehicle_doors

全部在一个索引中。正如您可能猜到的那样,当我们为文档编制索引时,有一半以上的字段将是空的(要么是汽车,要么是房子)。SOLR 在查询和索引时都可以。

所以,总结一下:

  • 考虑你想要做什么样的查询。如果您搜索自行车或汽车,则可以使用不同的索引
  • 考虑您将拥有多少文件。如果它们将是数百万,那么这种逻辑拆分将是您可以做的最好的事情,以获得更好的性能,但您将不得不做更多的查询!
于 2012-04-14T16:56:00.477 回答