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

时间:2011-08-25 19:11:02

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

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

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

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

2 个答案:

答案 0 :(得分:33)

正如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

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

<dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="true"/>

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

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

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

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

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

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

searchable do
  text :body
  text :body_ngram, :as => 'body_ngram'
end

答案 1 :(得分:4)

Sunspot附带了一个库存模式,该模式稍微针对太阳黑子集成进行了调整,遵循了开发人员最不惊讶的原则 - 例如,股票solrconfig.xml设置为关闭自动提交,即使在生产中你也是我想打开它。模式实际上与类型有关,而不是字段 - 有关如何创建新字段类型的示例,请参阅下面的链接。如果字段符合现有类型之一,则对字段建立索引是微不足道的。例如:

class Blog
  searchable do
     text :title
  end
end

在搜索过程中,你会做这样的事情:

class BlogSearch
   def self.search(options={})
     Sunspot.search(Blog) do
       with(:title, options[:title]) if options[:title].present?
     end
   end
end

Sunspot的wiki有很多其他文档。这是一个添加自定义类型以允许ngram搜索的示例:

https://github.com/outoftime/sunspot/wiki/Wildcard-searching-with-ngrams