Sunspot如何修改Solr的schema.xml?是否会修改它?

den*_*iss 15 solr ruby-on-rails sunspot ruby-on-rails-3 sunspot-rails

如果我错了,请告诉我,但我认为solr只需要schema.xml中已经提到过的字段.所以,如果我有一个名为'title'的字段,我需要在模式中提到它.

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

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

Nic*_*zny 32

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

Solr Schema 101

出于本讨论的目的,Solr模式主要由两部分组成:类型定义和字段定义.

一个type定义通过指定其名称,类型的Java类设置了一个类型,而且在某些类型(特别是文本),XML配置该类型是如何处理的下属块的情况.

一个field定义允许你定义一个字段的名称,以及包含在该字段的值类型的名称.这允许Solr将文档中字段的名称与其类型以及少数其他选项相关联,从而如何在索引中处理该字段的值.

Solr还支持一个dynamicField定义,它不是一个静态字段名,而是允许你指定一个带有glob的模式.传入字段的名称可以与这些模式匹配,以确定其类型.

太阳黑子的传统图式

Sunspot的模式field对内部使用的字段有一些定义,例如ID和模型名称.此外,Sunspot可以自由地使用dynamicField定义来根据类型建立命名约定.

这种字段命名约定的使用允许Sunspot定义一个配置DSL,用于创建从模型到准备由Solr索引的XML文档的映射.

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

searchable do
  text :body
end
Run Code Online (Sandbox Code Playgroud)

...将由Sunspot用于创建字段名称body_text.此字段名称与架构中*_text以下dynamicField定义的模式匹配:

<dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="true"/>
Run Code Online (Sandbox Code Playgroud)

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

在实践中修改太阳黑子的架构

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

例如,扩展搜索匹配与"模糊"搜索可以通过匹配特殊的基于文本的字段来完成,该字段也使用语言词干或NGrams.原始text字段中的标记可用于填充拼写检查,或用于增加完全匹配.当更严格的匹配失败时,自定义中的令牌text_ngram或者text_en可以用于扩大搜索结果.

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

例如,ngram为上面添加自定义类型,我们可能会使用以下Ruby代码再次使用NGrams处理正文:

searchable do
  text :body
  text :body_ngram, :as => 'body_ngram'
end
Run Code Online (Sandbox Code Playgroud)