如果我错了,请告诉我,但我认为 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_ngram
或 text_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/