Solr和SolrNet问题与指导

Solr和SolrNet问题与指导,solr,solrnet,Solr,Solrnet,我刚刚开始学习Solr和SolrNet。在我对目前的项目做得太多之前,我想确认一下我是否在正确的轨道上。以下是我努力实现的目标: 基本要求: 提供一个搜索解决方案,搜索多个实体(汽车、轮船、飞机、自行车等),我刚刚在这里编写了这些。每个实体都可以有不同数量的字段,其中包含非对称数据 为每个实体提供面 为每个实体提供过滤器 工作流程: 用户使用术语进行搜索 显示四个链接,每个实体一个,旁边有一个数值,指示每个实体的点击数 用户单击一个链接,页面将显示该实体的面和搜索结果 鉴于这一要求,以下是我迄今

我刚刚开始学习Solr和SolrNet。在我对目前的项目做得太多之前,我想确认一下我是否在正确的轨道上。以下是我努力实现的目标:

基本要求:

  • 提供一个搜索解决方案,搜索多个实体(汽车、轮船、飞机、自行车等),我刚刚在这里编写了这些。每个实体都可以有不同数量的字段,其中包含非对称数据
  • 为每个实体提供面
  • 为每个实体提供过滤器
  • 工作流程:

  • 用户使用术语进行搜索
  • 显示四个链接,每个实体一个,旁边有一个数值,指示每个实体的点击数
  • 用户单击一个链接,页面将显示该实体的面和搜索结果
  • 鉴于这一要求,以下是我迄今为止所做的工作:

  • 创建了一个索引,但为每个实体创建了特定字段,如车名、车型号、车公司、船名、船型号、船公司、船龄、船大小等
  • 我在索引中有一个字段实体\类型,它被设置为一个实体
  • ID在所有实体中都是唯一的
  • 我有一个Demax搜索处理程序solrconfig.xml,其中我放置了所有应该搜索的字段(来自所有实体)
  • 下面是我的Demax搜索处理程序的外观:

    <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>
    
    
    明确的
    埃迪斯马克斯
    汽车名称汽车公司汽车模型船名称船公司船模型船航行路线平面名称飞机公司飞机模型自行车名称自行车公司自行车公司自行车模型
    *:*
    10
    *,得分
    在…上
    汽车公司
    汽车模型
    船名
    船务公司
    船舶航行航线
    ...
    
    最后,这里是我的问题:

  • 这种单一索引路由是正确的方法还是应该为每个实体创建单独的索引?请解释一下
  • 如果它们应该是单独的索引,如何在它们之间搜索给定的术语?重要的是,我如何使用SolrNet做到这一点
  • 是否有一种方法可以使用SolrNet搜索所有实体并检索结果?或者我是否需要使用相同的搜索词分别(可能并行)执行每个实体的查询
  • 我有一个列表,列出了应该作为demax处理程序中的facet使用的所有字段,如您所见,这是正确的方法吗?如果没有,是什么

  • 我相信在我完成我的项目时,我会有更多的问题,但现在这就足够了。

    如果你打算每种类型有很多项目,拆分可能是一个明智的想法(只是为了性能,而不是其他)。这还取决于你在模式中使用的东西之间的相似性和差异性。
    例如,自行车、汽车、轮船都有共同的公司、名称、型号等,因此您可以只有名称、型号、公司字段,然后是另一个显示“车辆类型”的字段。 如果变量字段(称为optionals)只是少数几个,则可以为这些字段设置动态字段,因此不需要严格的模式

    如果使用不同的索引(和模式),则查询需要知道所有不同的字段和模式。更不用说,要实现这一点,您需要一个多核实例,并且(AFAIK)您不能同时向多个核发送查询

    这取决于您要执行的查询。假设您想要搜索名为“vairo”的车辆,但用户没有指定他想要的是双座车还是汽车或其他什么。您需要将搜索分发到所有不同的核心,如

    /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辆同名的双座车,还有很少的其他车辆。如果用户现在指定“确定,只给我两辆车”,则与以前一样保留查询,但添加&fq=vehicle\u type:bicicle

    这比根据过滤器处理应该查询到的索引的逻辑要方便得多。 此外,合并来自多个响应的结果也不是一件小事

    在我们公司,所有类别都使用单一solr。显然,他们都有其他人没有的选择(想想房地产和汽车)。有些是用动态字段处理的,有些是用普通字段处理的。如果您没有在文档中发送内容,SOLR是可以的

    例如:

    squared_meters
    rooms
    vehicle_type
    vehicle_doors
    
    都在一个索引中。正如您可能猜到的,当我们索引一个文档时,超过一半的字段将是空的(要么是一辆车,要么是一栋房子)。SOLR在查询和索引时都完全可以这样做

    总而言之:

    • 考虑您希望执行哪种查询。如果您搜索自行车或汽车,则可以使用不同的索引
    • 考虑一下您将拥有多少文档。如果它们的数量将达到数百万,那么这种逻辑分割将是获得更好性能所能做的最好的事情,但您必须进行更多的查询
    您仅部分回答了我的问题,因此我不接受将其作为正式答案,但感谢您的意见。我选择单索引,因为我索引的记录量很低。