ruby-on-rails - Sunspot 如何修改 Solr 的 schema.xml?它会修改它吗?

标签 ruby-on-rails ruby-on-rails-3 solr sunspot sunspot-rails

如果我错了,请告诉我,但我认为 solr 只需要 schema.xml 中已经提到的字段。因此,如果我有一个名为“title”的字段,我需要在架构中提及这一点。

在 Sunspot 的文档中没有提到修改 schema.xml。我只是想知道 Sunspot 如何修改 schema.xml 允许将自定义字段输入到索引中。

我也知道 Sunspot 使用 RSolr 来做事。因此,如果有一种方法可以使用 RSolr 修改架构并将数据从 DB 重新加载到 Solr,请告诉我。

最佳答案

正如 karmajunkie 所暗示的那样,Sunspot 使用自己的标准模式。我将在这里更详细地介绍它的工作原理。

Solr 架构 101

出于本次讨论的目的,Solr 模式主要由两部分组成:类型定义和字段定义。
type定义通过指定其名称、该类型的 Java 类以及在某些类型(特别是文本)的情况下,配置如何处理该类型的 XML 的从属块来设置类型。
field定义允许您定义字段的名称以及该字段中包含的值类型的名称。这允许 Solr 将文档中字段的名称与其类型以及一些其他选项相关联,从而在索引中处理该字段的值。

Solr 还支持 dynamicField定义,它不是静态字段名称,而是让您指定一个包含 glob 的模式。传入字段的名称可以与这些模式匹配,以确定它们的类型。

太阳黑子的常规模式

Sunspot 的架构有一些 field内部使用字段的定义,例如 ID 和模型名称。此外,Sunspot 自由使用 dynamicField定义以建立基于类型的命名约定。

字段命名约定的这种使用允许 Sunspot 定义配置 DSL,该配置 DSL 创建从您的模型到 XML 文档的映射,该文档准备被 Solr 索引。

例如,模型中的这个简单配置块……

searchable do
  text :body
end

...将被 Sunspot 用于创建字段名称 body_text .此字段名称与 *_text 匹配以下图案 dynamicField模式中的定义:
<dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="true"/>

这将映射具有后缀 _text 的任何字段到太阳黑子的定义 text类型。如果您查看 Sunspot 的 schema.xml,您会看到许多其他类型和选项的类似约定。 :stored => true例如,选项通常会添加 s在该类型的后缀上(例如, _texts )。

在实践中修改 Sunspot 的模式

根据我对客户和我自己的项目的经验,有两个很好的案例可以修改 Sunspot 的架构。首先,用于更改 text field 的分析器基于您的应用程序可能需要的不同功能。其次,用于为 Solr 分析器的更细粒度应用创建全新的类型(通常基于文本类型)。

例如,通过“模糊”搜索来扩大搜索匹配可以通过匹配一个特殊的基于文本的字段来完成,该字段也使用语言词干或 NGrams。原text中的token字段可用于填充拼写检查,或提高精确匹配。以及自定义中的 token text_ngramtext_en当更严格的匹配失败时,可以用来扩大搜索结果。

Sunspot 的 DSL 提供了一项最终功能,用于将您的字段映射到这些自定义字段。一旦您设置了 type及其对应的 dynamicField定义,您可以使用 Sunspot 的 :as选项来覆盖基于约定的名称生成。

例如添加自定义ngram键入上述内容,我们可能最终会使用以下 Ruby 代码使用 NGrams 再次处理主体:
searchable do
  text :body
  text :body_ngram, :as => 'body_ngram'
end

关于ruby-on-rails - Sunspot 如何修改 Solr 的 schema.xml?它会修改它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195894/

相关文章:

ruby-on-rails - Minitest:相关 AR 模型的固定装置在运行测试时导致 ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation

javascript - 当 mime 类型为空时,Rails Active Storage 会阻止上传

ruby-on-rails - Rails 急切加载似乎查询错误

ruby-on-rails - rails 3.1 生成 CSV 文件

ruby-on-rails - 查找与某个字段没有关联的所有记录

Solr/Lucene fieldCache OutOfMemory 对动态字段的错误排序

solr - 在 Lucene/Solr 中按最近访问排序

ruby-on-rails - Sidekiq,线程用完 - Rails 离开并且没有收获 connection_pool 线程

ruby-on-rails - 跨多个环境的 Rails 测试

solr - AWS EC2 实例上的 Zookeeper 和 SolrCloud