如果我错了,请告诉我,但我认为solr只需要在schema.xml中提到的字段。所以,如果我有一个名为'title'的字段,我需要在模式中提到它。
在Sunspot的文档中没有提到修改schema.xml。我只是想知道Sunspot如何修改schema.xml,允许自定义字段输入索引。
我也知道太阳黑子使用RSolr来做事。因此,如果有办法修改架构并使用RSolr将数据从DB重新加载到Solr,请告诉我。
答案 0 :(得分:33)
正如karmajunkie所暗示的那样,Sunspot使用自己的标准架构。我将在这里详细介绍它的工作原理。
出于本讨论的目的,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_ngram
或text_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