【问题标题】:Custom sorting for lucenelucene的自定义排序
【发布时间】:2010-07-20 21:02:53
【问题描述】:

我的文档包含(标题、内容、日期时间)等字段 我想用下面的公式对结果进行排序

1) 标题提升 2.5

2) 内容提升 1.5

3) 重要(提升那些较新的文档意味着日期时间字段接近今天日期)提升 3

如何根据上述条件编写查询 #3 我该怎么办

任何帮助将不胜感激。

【问题讨论】:

  • 例如,我需要找到具有上述条件的“SomeTitle”和“SomeBody” 1) SomeTitle, SomeBody, 4 天前 2) SomeTitle, Some, 1 天前 我想显示第二项首先获得此的最佳查询是什么

标签: sorting lucene


【解决方案1】:
+title:foo^2.5 +content:bar^1.5 datetime:20100721^3

显然,为日期时间字段填写适当的值。这里的关键是 datetime 术语不是必需的术语;它只会增加与该词匹配的文档的分数。您可以为昨天的日期添加另一个日期时间术语,为前一天添加另一个日期时间术语,依此类推,同时随着您离今天的日期越来越远,减少提升。

【讨论】:

  • 这与我的问题完全无关。我不想搜索日期时间我只想对那些落后于当前日期的文档进行评分,我认为这是一种评分或排序但我不知道如何实现它
  • Baja 的答案其实是对的,虽然 lucene 的语法有点不直观。基本上,你想要:“+(原始查询) scoreBoostQuery” 这只会匹配匹配“原始查询”的内容。但它也会对与 scoreBoostQuery 匹配的内容有所提升。
【解决方案2】:

您可以使用函数查询来提高包含每个文本字段的文档的分数,即标题和内容(均按日期排名)。然后在此之后将新近度提升乘以上面给出的权重。

http://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_boost_the_score_of_newer_documents

{!boost b=product(recip(ms(NOW,datetime),3.16e-11,1,1),2.5)}Title:<query> 
{!boost b=product(recip(ms(NOW,Created),3.16e-11,1,1),1.5)}Content:<query>

您不能使用排序,因为二级和三级排序的顺序将毫无意义,除非您的日期精度当然足够低。

【讨论】:

    【解决方案3】:

    如果您正在根据自己的定义寻找自定义排序,那么您可以查看以下示例。但它只会帮助您在单个字段上定义您的排序。您可以稍后将多个排序添加到您的查询中。

    不完全确定这是否有帮助

    https://github.com/smadha/lucene-sorting-example/blob/master/CustomSorter.java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 2011-05-14
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多