【问题标题】:Sort on matching number of days in period with Solr使用 Solr 对匹配的天数进行排序
【发布时间】:2015-10-25 23:37:29
【问题描述】:

我们被要求在我们的一个站点中实施一项新功能,经过一定量的研究后,我们认为我们无法在 Solr 中解决此问题。但我们简要地想仔细检查一下;

假设我们将 Companies 存储在索引中。每家公司都可以有多个开放期。一个周期被格式化为“开始日(日期)”到“结束日(日期)”。在网站上,我们允许访问者搜索某个时期,并向他们展示与公司时期中至少一天匹配的公司。到目前为止一切顺利,我们已经使用空间搜索实现了这一点; (https://people.apache.org/~hossman/spatial-for-non-spatial-meetup-20130117/)。

我们的字段(类型)定义:

<fieldType name="dayrange" class="solr.SpatialRecursivePrefixTreeFieldType" geo="false" worldBounds="ENVELOPE(16071, 20088, 20088, 16071)" distErrPct="0" maxDistErr="1" units="degrees"/>

<field name="periods" type="dayrange" indexed="true" stored="true" multiValued="true" required="false"/>

注意:worldBounds 基于纪元以来的天数。开始日是 2014 年 1 月 1 日(自纪元以来 16071 天),结束日是 2024 年 12 月 31 日(自纪元以来 20088 天)。

每当我们想要搜索时,我们都会使用 contains 方法:fq=periods:"INTERSECTS(16071 16733 16739 20088)"

就像我说的,到目前为止一切都很好。这已经在起作用了。现在他们要求我们实现两个新功能;

  1. 允许根据匹配天数排序
  2. 显示匹配天数(该公司在您搜索的 14 天中的 10 天开业)

第二个功能可以也可以在 Solr 之外实现(例如在我们的应用程序中)。但是,如果可以按匹配天数排序,那么它可能也可以返回那个数字?!出于性能原因,我们更喜欢在 Solr 上实现排序。但是现在我们找不到一个很好的解决方案来实现这一点。 谁能帮助我们找到正确的解决方案,或者可以确认这在原生 Solr 4.x 中是不可能的?!

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: solr spatial solr4 date-range


    【解决方案1】:

    这会有点棘手,因为每个公司都有多个间隔。

    如果是一个间隔,您可以使用“按功能排序”选项。 为此,您应该在 Sorl 架构中添加两个字段 以天为单位的开始日期和以天为单位的结束日期,并按功能排序 sub(max(start,start_q),mine(and,end_q)) desc.Funcation Query

    在多个间隔的情况下,Solr 将不知道应该取哪个 start 和 end 值。要支持多个间隔,您将需要为 Solr 编写一个自定义 Java 库来支持这一点。我已经为此类库 lucene-custom-score 创建了原型。

    首先,您需要使用docValues="true" 在一个字段中存储间隔的开始和结束。最好为该字段使用 long 类型,并将代码值作为 end*20088+start。 Here 你可以找到一个 lucene 文档创建的例子。这里的字段称为“间隔”。

    接下来,您应该编写一个带有自定义评分的查询。你可以找到这样的例子PeriodSumQuery。分数在PeriodSumScoreProvider#periodSum方法中计算。

    在此方法中,从 docvalues 中检索间隔并计算权重。

    要在 Solr 中启用此分数,您需要在 sorlschema.xml 中配置自定义 query parser pluginPeriodSumQueryParser 中自定义此类插件的示例。为简单起见,搜索间隔的开始和结束作为搜索 url 中的附加参数传递。但是通过一些努力,它们可以从查询字符串中检索出来。

    【讨论】:

      最近更新 更多