模式元素

Solr 在架构文件中存储它预期了解的字段类型和字段的详细信息。

Solr 的架构文件

Solr 的架构文件的名称和位置可能因你最初配置 Solr 的方式或你稍后修改的方式而异。

  • managed-schema.xml 是 Solr 默认使用的架构文件名称,用于通过 架构 API无架构模式 功能在运行时支持进行架构更改。

    如果你选择,你可以 明确配置 托管架构功能以使用备用文件名,但文件的的内容仍然由 Solr 自动更新。

  • schema.xml 是架构文件的传统名称,可以使用 ClassicIndexSchemaFactory 的用户可以手动编辑该文件。

  • 如果你使用 SolrCloud,你可能无法在本地文件系统中找到这些名称的任何文件。你只能通过架构 API(如果已启用)或通过 Solr 管理员 UI 的 云屏幕 查看架构。

无论在你的安装中使用哪个名称的文件,该文件的结构都不会更改。但是,你与该文件交互的方式将发生更改。如果你使用托管架构,则预期你仅使用架构 API 与该文件交互,并且绝不进行手动编辑。如果你不使用托管架构,你将只能对该文件进行手动编辑,架构 API 将不支持任何修改。

请注意,如果你尚未使用架构 API 但使用 SolrCloud,则需要使用 upconfigdownconfig 命令通过 ZooKeeper 与架构文件进行交互,以制作本地副本并上传你的更改。在 Solr 控制脚本参考ZooKeeper 文件管理 中描述了执行此操作的选项。

架构文件的结构

此示例并非真正的 XML,但显示了构成架构文件的主要元素。

<schema>
  <types>
    <fieldType>
  <fields>
    <field>
  <copyField>
  <dynamicField>
  <similarity>
  <uniqueKey>
</schema>

最常定义的元素是 typesfields,其中配置了字段类型和实际字段。字段类型定义和属性字段 部分描述了如何为架构配置这些内容。

这些内容由 复制字段 中描述的 copyFields动态字段 中描述的 dynamicFields 补充。

必须始终定义 唯一键 中描述的 uniqueKey

将使用默认 similarity,但可以按照下面 相似性 部分中所述进行修改。

类型和字段是可选标签

请注意,typesfields 部分是可选的,这意味着您可以自由地混合顶级 fielddynamicFieldcopyFieldfieldType 定义。这允许在架构中对相关元素(例如与字段类型定义分组的字段)进行更合乎逻辑的分组。

唯一键

uniqueKey 元素指定哪个字段是文档的唯一标识符。虽然 uniqueKey 不是必需的,但应用程序设计几乎总是需要它。例如,如果您将更新索引中的文档,则应使用 uniqueKey

您可以通过命名来定义唯一键字段

<uniqueKey>id</uniqueKey>

不能使用架构默认值和 copyFields 来填充 uniqueKey 字段。uniqueKeyfieldType 不应被分析,并且不应是任何 *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 会被隐式用作默认值。

除了本页提到的各种工厂外,还可以使用其他几个相似度实现,例如 SweetSpotSimilarityFactoryClassicSimilarityFactory 等。有关详细信息,请参阅 Solr Javadocs 中的 相似度工厂