模式元素
Solr 在架构文件中存储它预期了解的字段类型和字段的详细信息。
Solr 的架构文件
Solr 的架构文件的名称和位置可能因你最初配置 Solr 的方式或你稍后修改的方式而异。
-
managed-schema.xml
是 Solr 默认使用的架构文件名称,用于通过 架构 API 或 无架构模式 功能在运行时支持进行架构更改。如果你选择,你可以 明确配置 托管架构功能以使用备用文件名,但文件的的内容仍然由 Solr 自动更新。
-
schema.xml
是架构文件的传统名称,可以使用ClassicIndexSchemaFactory
的用户可以手动编辑该文件。 -
如果你使用 SolrCloud,你可能无法在本地文件系统中找到这些名称的任何文件。你只能通过架构 API(如果已启用)或通过 Solr 管理员 UI 的 云屏幕 查看架构。
无论在你的安装中使用哪个名称的文件,该文件的结构都不会更改。但是,你与该文件交互的方式将发生更改。如果你使用托管架构,则预期你仅使用架构 API 与该文件交互,并且绝不进行手动编辑。如果你不使用托管架构,你将只能对该文件进行手动编辑,架构 API 将不支持任何修改。
请注意,如果你尚未使用架构 API 但使用 SolrCloud,则需要使用 upconfig
和 downconfig
命令通过 ZooKeeper 与架构文件进行交互,以制作本地副本并上传你的更改。在 Solr 控制脚本参考 和 ZooKeeper 文件管理 中描述了执行此操作的选项。
架构文件的结构
此示例并非真正的 XML,但显示了构成架构文件的主要元素。
<schema>
<types>
<fieldType>
<fields>
<field>
<copyField>
<dynamicField>
<similarity>
<uniqueKey>
</schema>
必须始终定义 唯一键 中描述的 uniqueKey
。
将使用默认 similarity
,但可以按照下面 相似性 部分中所述进行修改。
类型和字段是可选标签
请注意, |
唯一键
uniqueKey
元素指定哪个字段是文档的唯一标识符。虽然 uniqueKey
不是必需的,但应用程序设计几乎总是需要它。例如,如果您将更新索引中的文档,则应使用 uniqueKey
。
您可以通过命名来定义唯一键字段
<uniqueKey>id</uniqueKey>
不能使用架构默认值和 copyFields
来填充 uniqueKey
字段。uniqueKey
的 fieldType
不应被分析,并且不应是任何 *PointField
类型。您可以使用 UUIDUpdateProcessorFactory
自动生成 uniqueKey
值。
此外,如果使用 uniqueKey
字段但它是多值的(或从 fieldtype
继承多值性),则操作将失败。但是,只要字段使用得当,uniqueKey
将继续工作。
相似性
相似性是 Lucene 类,用于在搜索中对文档进行评分。
每个集合都有一个“全局”相似性。默认情况下,Solr 使用隐式 SchemaSimilarityFactory
,它允许使用“按类型”特定相似性配置各个字段类型,并且隐式使用 BM25Similarity
对于任何没有显式相似性的字段类型。
可以通过在架构中声明顶级 <similarity/>
元素(位于任何单个字段类型之外)来覆盖此默认行为。此相似性声明可以像此示例中显示 BM25Similarity
那样直接引用具有无参数构造函数的类的名称
<similarity class="org.apache.lucene.search.similarities.BM25Similarity"/>
或通过引用 SimilarityFactory
实现
<similarity class="solr.BM25SimilarityFactory"/>
使用相似度工厂时,可以指定可选的初始化参数
<similarity class="solr.DFRSimilarityFactory">
<str name="basicModel">P</str>
<str name="afterEffect">L</str>
<str name="normalization">H2</str>
<float name="c">7</float>
</similarity>
在大多数情况下,如果您的架构还包括特定字段类型的 <similarity/>
声明,那么像这样指定全局级别相似度将会导致错误。一个关键的例外是,您可以明确声明一个 SchemaSimilarityFactory
,并指定对于所有未使用字段类型名称(由 已 配置特定相似度的 defaultSimFromFieldType
指定)声明显式相似度的字段类型,该默认行为是什么
<similarity class="solr.SchemaSimilarityFactory">
<str name="defaultSimFromFieldType">text_dfr</str>
</similarity>
<fieldType name="text_dfr" class="solr.TextField">
<analyzer ... />
<similarity class="solr.DFRSimilarityFactory">
<str name="basicModel">I(F)</str>
<str name="afterEffect">B</str>
<str name="normalization">H3</str>
<float name="mu">900</float>
</similarity>
</fieldType>
<fieldType name="text_ib" class="solr.TextField">
<analyzer ... />
<similarity class="solr.IBSimilarityFactory">
<str name="distribution">SPL</str>
<str name="lambda">DF</str>
<str name="normalization">H2</str>
</similarity>
</fieldType>
<fieldType name="text_other" class="solr.TextField">
<analyzer ... />
</fieldType>
在上面的示例中,IBSimilarityFactory
(使用基于信息模型)将用于类型为 text_ib
的任何字段,而 DFRSimilarityFactory
(与随机的差异)将用于类型为 text_dfr
的任何字段,以及使用未明确指定 <similarity/>
的类型的任何字段。
如果明确声明了 SchemaSimilarityFactory
而未配置 defaultSimFromFieldType
,那么 BM25Similarity
会被隐式用作默认值。
除了本页提到的各种工厂外,还可以使用其他几个相似度实现,例如 SweetSpotSimilarityFactory
、ClassicSimilarityFactory
等。有关详细信息,请参阅 Solr Javadocs 中的 相似度工厂。