gpt4 book ai didi

Solr 和 SolrNet 问题和指导

转载 作者:行者123 更新时间:2023-12-04 05:50:13 27 4
gpt4 key购买 nike

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

基本要求:

  • 提供针对多个实体(汽车、船舶、飞机、自行车等)进行搜索的搜索解决方案,我只是在这里编写了这些内容。每个实体可以具有可变数量的非对称数据字段。
  • 为每个实体提供构面。
  • 为每个实体提供过滤器。

  • 工作流程:
  • 用户使用术语进行搜索。
  • 四个链接,每个实体一个,旁边显示一个数值,表示每个实体的点击次数。
  • 用户单击链接,页面将显示该实体的方面和搜索结果。

  • 因此,鉴于该要求,这是我迄今为止所做的:
  • 为每个实体创建了一个索引,但具有特定的字段,例如 car_name、car_model、car_company、ship_name、ship_model、ship_company、ship_age、ship_size 等。
  • 我在索引中有一个字段 entity_type,它被设置为实体之一。
  • ID 在所有实体中都是唯一的。
  • 我有一个 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>

    最后,这是我的问题:
  • 这个单一索引路线是正确的方法还是应该为每个实体创建单独的索引?请解释。
  • 如果它们应该是单独的索引,我如何在它们中搜索给定的术语?重要的是我如何使用 SolrNet 做到这一点?
  • 有没有办法使用 SolrNet 搜索所有实体并检索结果?或者我是否需要使用相同的搜索词分别(可能并行)对每个实体执行查询?
  • 如您所见,我有一个所有字段的列表,这些字段应该作为 DisMax 处理程序中的方面可用,这是正确的方法吗?如果不是,那是什么?

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

    最佳答案

    如果您要为每种类型拥有大量项目,拆分可能是一个明智的想法(仅出于性能考虑,仅此而已)。它还取决于您放入模式的内容之间的异同。
    例如,自行车、汽车、轮船都有公司、名称、型号等共同的字段,因此您可以只有名称、型号、公司字段,然后是另一个显示“vehicle_type”的字段。
    如果变量字段(称为可选字段)只是几个,您可以为这些字段设置动态字段,因此您不需要严格的架构。

    如果您使用不同的索引(和模式),则您的查询需要了解所有不同的字段和模式。更不用说要拥有它,您需要一个多核实例,并且(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_type:自行车 .

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

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

    例如:
    squared_meters
    rooms
    vehicle_type
    vehicle_doors

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

    所以,总结一下:
  • 考虑您要执行的查询类型。如果你搜索自行车或汽车,不同的索引都可以
  • 考虑一下您将拥有多少文件。如果它们将达到数百万,这种逻辑拆分将是您为获得更好性能所能做的最好的事情,但您将不得不执行更多查询!
  • 关于Solr 和 SolrNet 问题和指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155140/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com