模式元素

Solr 在模式文件中存储有关其应理解的字段类型和字段的详细信息。

Solr 的模式文件

Solr 模式文件的名称和位置可能因您最初配置 Solr 的方式或稍后是否对其进行了修改而异。

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

    您可以显式配置托管模式功能以使用其他文件名(如果您选择),但文件的内容仍然由 Solr 自动更新。

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

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

无论您的安装中使用哪个文件名,文件的结构都不会改变。但是,您与文件交互的方式会改变。如果您使用的是托管模式,则希望您仅使用模式 API 与文件交互,而绝不进行手动编辑。如果您不使用托管模式,则只能对文件进行手动编辑,模式 API 将不支持任何修改。

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

Schema 文件的结构

此示例不是真实的 XML,但显示了构成 schema 文件的主要元素。

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

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

这些元素由 复制字段 中描述的 copyFields动态字段 中描述的 dynamicFields 进行补充。

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

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

类型和字段是可选标签

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

唯一键

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

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

<uniqueKey>id</uniqueKey>

Schema 默认值和 copyFields 不能用于填充 uniqueKey 字段。uniqueKeyfieldType 不能被分析,并且不能是任何 *PointField 类型。您可以使用 UUIDUpdateProcessorFactory 来自动生成 uniqueKey 值。

此外,如果使用了 uniqueKey 字段,但它是多值的(或从 fieldtype 继承了多值性),则操作将失败。但是,只要正确使用该字段,uniqueKey 将继续工作。

相似度

相似度是 Lucene 中用于在搜索中对文档评分的类。

每个集合都有一个“全局”相似度。默认情况下,Solr 使用隐式的 SchemaSimilarityFactory,它允许使用“per-type”特定相似度配置各个字段类型,并为任何没有显式相似度的字段类型隐式使用 BM25Similarity

可以通过在 schema 中声明顶级 <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>

在大多数情况下,如果您的 schema 还包括字段类型特定的 <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。