使用Solr

时间:2015-10-25 23:37:30

标签: solr spatial solr4 date-range

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

假设我们将公司存储在我们的索引中。每家公司都有多个开放期。句点被格式化为“开始日期(日期)”到“结束日期(日期)”。在网站上,我们允许访问者搜索一段时间,并向他们展示与公司期间至少一天相匹配的公司。到目前为止,我们已经通过Spatial Search实现了这一点; (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天内打开)
  3. 第二个功能也可以在Solr之外实现(例如在我们的应用程序中)。但如果可以对匹配天数进行排序,那么可能还可以返回该数字?!出于性能原因,我们更喜欢在Solr上实现排序。但是现在我们找不到一个很好的解决方案来实现它。 任何能够帮助我们找到正确解决方案的人都可以使用原生Solr 4.x来确认这一点吗?!

    我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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

如果有几个间隔,Solr将不知道应该采用哪个开始值和结束值。为了支持几个时间间隔,您需要为Solr编写一个自定义java库来支持它。我已经为这样的lib lucene-custom-score创建了原型。

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

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

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

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