1

我正在使用 Apache Solr 为我的 Drupal 站点中的搜索功能提供动力,使用一个名为ApacheSolr Search Integration的 drupal 贡献模块。我是 Solr 的新手并且对它有基本的了解,因此如果这个问题听起来离谱,我希望提前表达我的歉意。

我通过一个名为的drupal 钩子添加了一个日期字段,该钩子ds_myDate最初用于对搜索结果进行排序。我决定使用date boosting,以便根据相关性显示搜索结果并按日期进行提升,而不仅仅是按日期的降序显示。一旦我更新了我的钩子以通过添加一个 boost 字段来实现相同的钩子,因为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)有效地实现提升一样实现提升。但是,这需要我重新索引所有内容(接近 50 万条记录)以填充新的 TrieDate 字段,以便我能够有效地使用它。

我想知道是否有一种有效的解决方法,而不是重新索引我的所有内容,例如将我的内容转换ds_myDate为 TrieDate 字段,例如在 mysql 表字段上运行更改查询以更改其类型。由于我不熟悉 Solr 的工作方式,因此我会要求知道这样的选择是否可行,以及在这种情况下应该做些什么。

4

2 回答 2

4

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

这是我的做法:

  • 确保 Solr 版本为 4+
  • 确保存储所有索引字段(部分更新的要求)
  • 如果满足以上两个条件,编写一个脚本(PHP),它执行以下操作:
  • 1) 遍历完整的 Solr 索引,并为每个文档:
  • ----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/

于 2013-05-14T17:55:02.950 回答
2

不幸的是,一旦以某种方式对文档进行了索引并且您更改了架构,则在重新索引这些文档之前,您无法将新的架构更改应用于现有文档。

请参阅上一个问题 -架构更改是否需要重新索引以获取更多详细信息。

于 2013-05-14T16:15:40.983 回答