Solr支持不同类型产品的不同方面

时间:2015-03-02 23:53:34

标签: solr facet faceted-search

我使用Solr索引不同类型的产品。产品类型(类别)有不同的方面。例如:

camera: megapixel, type (slr/..), body construction, ..
processors: no. of cores, socket type, speed, type (core i5/7)
food: type, origin, shelf-life, weight
tea: type (black/green/white/..), origin, weight, use milk?
serveware: type, material, color, weight
...

他们也有共同的方面:

Brand, Price, Discount, Listing timeframe (like new), Availability, Category

当用户点击任何类别,品牌页面或跨所有类型的产品进行全局搜索时,我需要显示相关的方面和面包屑。这与我们在多个电子商务网站上看到的相同。

我的查询是: 由于facet类型在不同类型的产品中或多或少是唯一的,我是否将它们放在单独的模式中?那是这样做的吗?基本担心的是,这些字段将不包含其他类型产品的任何数据。这里是否有任何实现原则可以更容易地检索给定产品类型的相应面?

我希望有一个可扩展的设计,以便在我们前进时容纳每种产品类型中的大量项目,并且如果可能的话,它易于使用且以性能为导向。现在我有一个Solr的实例。

1 个答案:

答案 0 :(得分:1)

人口不足的方面的唯一风险是他们歪曲搜索。我确定您已经使用了一个搜索网站,其中您想要面对的元数据人口不足,因此当您应用该方面时,您还会从结果集中删除一些本应包含的记录。需要注意的是,facet值在适当的位置一致地填充。这意味着您的“茶”记录不需要列出多个核心,并且不会影响任何内容,但是所有“处理器”记录都应该(并且在任何可能的范围内)应该一致地填充它们。这意味着如果一个处理器将其核心数列为“4”,另一个处理器显示为“四核”,则这两个值是两个不同的值,并且应用任一方面值的用户将从其结果中消除其他处理器。如果第三个四核处理器完全缺少no_cores facet字段中的“核心数”stat(字段名称是任意的),那么你的方面可能会适得其反。

因此,我们可以将所有这些记录放入同一个Solr中,只要在适当的时候一致地填充构面,就不必为所有记录填充它们,特别是在不适用时。

动态应用构面

您需要了解的大部分内容都在Solr的faceting文档中。重要的是在查询中指定适当的参数,以告诉Solr您要使用哪些方面。 (直到你真正面对一个字段,它不是一个方面,而只是一个同时具有stored="true"indexed="true"的字段。)对于一个非常动态的效果,你可以指定所有这些参数作为查询的一部分Solr。

&facet=true

这似乎很明显,但你需要打开分面。这个参数很方便,因为它还允许你关闭 face with facet=false,即使你的查询中有很多其他参数详细说明了如何。如果分面关闭,它们都没有做任何事情。

&facet.field=no_cores

您可以一遍又一遍地包含此字段,因为您有兴趣参与多个字段。

&facet.limit=7
&f.no_cores.facet.limit=4

此处的第一行将Solr为每个构面字段返回的值的数量限制为7.将返回构面的7个最常用值(在搜索结果中)及其记录计数。第二行专门覆盖no_cores字段的此限制。

&facet.sort=count

您可以按顺序列出构面字段的值,显示记录的数量(count)或索引顺序(index)的数量。索引顺序通常按字母顺序排列,但取决于字段的索引方式。此字段与facet.limit一起使用,因此,如果返回的构面值的数量受facet.limit限制,则它们将是结果集中最多的值或索引中最早的值,具体取决于方式此值已设置。

&facet.mincount=1

在极少数情况下,您会希望在搜索结果中看到零次出现的构面值,如果弹出,这可以解决问题。

最终结果是一个很长的查询:

http://localhost/solr/collecion1/search?facet=true&facet.field=no_cores&
 facet.field=socket_type&facet.field=processor_type&facet.field=speed&
 facet.limit=7&f.no_cores.facet.limit=4&facet.mincount=1&defType=dismax&
 qf=name,+manufacturer,+no_cores,+description&
 fl=id,name,no_cores,description,price,shipment_mode&q="Intel"

这绝对是有效的,并且允许有关搜索应该如何工作的最大量的即时决策,但是对于调试来说不是非常可读。

动态应用方面

因此,这些功能允许您指定要在其上进行分析的字段,并动态执行。但是,它可能导致很多非常冗长和复杂的查询,特别是如果你在几种不同的搜索模式中使用了很多方面。

一种选择是在solrconfig.xml中的请求处理程序中形式化每组常用选项。这样,您应用完全相同的参数,但不是列出每个查询中的所有参数,而只需指定所需的请求处理程序。

<requestHandler name="/processors" class="solr.SearchHandler">
 <lst name="defaults">
  <str name="defType">dismax</str>
  <str name="echoParams">explicit</str>
  <str name="fl">id,name,no_cores,description,price,shipment_mode</str>
  <str name="qf">name, manufacturer, no_cores, description</str>
  <str name="sort">score desc</str>
  <str name="rows">30</str>
  <str name="wt">xml</str>
  <str name="q.alt">*</str>
  <str name="facet.mincount">1</str>
  <str name="facet.field">no_cores</str>
  <str name="facet.field">socket_type</str>
  <str name="facet.field">processor_type</str>
  <str name="facet.field">speed</str>
  <str name="facet.limit">10</str>
  <str name="facet.sort">count</str>
 </lst>
 <lst name="appends">
  <str name="fq">category:processor</str>
 </lst>
</requestHandler>

如果您在solrconfig.xml中设置了请求处理程序,它所做的就是作为一组查询参数的简写。对于单个solr索引,您可以拥有任意数量的请求处理程序,并且可以在不重建索引的情况下更改它们(重新加载Solr核心或重新启动服务器应用程序(例如JBoss或Tomcat),以使更改生效)。

这个请求处理程序有很多事情我没有进入,但它只是表示默认Solr请求参数的一种方式,这样您的实时查询可以更简单。这样,您可以进行如下查询:

http://localhost/solr/collection1/processors?q="Intel"

返回结果集,其中填充了所有特定于处理器的构面,并进行过滤,以便仅返回处理器记录。 (这是category:processor过滤器,它假设一个名为category的字段,其中所有处理器记录的值都为processor。这完全是可选的,由您决定。)您可能希望保留默认搜索请求处理程序,该处理程序不按记录类别进行过滤,并且可能不会选择将任何可用的stored="true"indexed="true")字段应用为活动构面。