在Solr中将DateField转换为TrieDateField

时间:2013-05-14 14:40:44

标签: solr drupal-6

我正在使用Apache Solr为我的Drupal站点中的搜索功能提供支持,使用名为ApacheSolr Search Integration的drupal的贡献模块。我对Solr很了解并且对它有基本的了解,因此如果这个查询听起来太过分,请提前表达我的道歉。

我通过一个名为ds_myDate的drupal挂钩添加了一个日期字段,我最初用它来排序搜索结果。我决定使用date boosting,以便根据相关性显示搜索结果并按日期提升,而不是仅按日期的降序显示。一旦我通过添加一个提升字段recip(ms(NOW/HOUR,ds_myDate),3.16e-11,1,1)来更新我的钩子以实现相同的效果,我得到了一个HTTP 400错误说明

  

无法在非数字旧版日期字段ds_myDate

上使用ms()函数

谷歌搜索相同的建议我使用TrieDateField而不是Legacy DateField来防止此错误。按照建议的命名约定添加名为tds_myDate的TrieDate字段并将增强实施为recip(ms(NOW/HOUR,tds_myDate),3.16e-11,1,1)确实有效地实现了提升。但是,这需要我重新索引所有内容(接近500k记录)以填充新的TrieDate字段,以便我可以有效地使用它。

我要求知道是否有一个有效的解决方法,而不是重新索引我的所有内容,例如将我的ds_myDate转换为TrieDate字段,例如在mysql表字段上运行alter query以更改其类型。由于我不熟悉Solr的工作原理会要求知道这样的选项是否可行以及这种情况下正确的做法是什么。

2 个答案:

答案 0 :(得分:4)

您可以通过执行部分更新来实现它,但为此您需要使用Solr 4+并存储所有索引字段。

以下是我对此的看法:

  • 确保Solr的版本为4 +
  • 确保存储所有索引字段(部分更新要求)
  • 如果满足以上两个条件,请编写脚本(PHP),其中包含以下内容:
  • 1)迭代完整的Solr索引,并为每个doc:
  • ---- a)读取存储在ds_myDate字段中的值
  • ---- b)将其转换为TrieDateField格式
  • ---- c)推送到Solr,通过部分更新到只有tds_myDate字段(参见示例查询)

示例查询:

curl 'localhost:8983/solr/update?commit=true' -H 'Content-type:application/json' -d '[{"id":"$id","tds_myDate":{"set":$converted_Val}}]'

有关部分更新的详细信息:http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/

答案 1 :(得分:2)

不幸的是,一旦文档以某种方式编入索引并且您更改了架构,就不能将新的架构更改应用于现有文档,直到重新索引这些文档为止。

有关其他详细信息,请参阅上一个问题 - Does Schema Change need Reindex