模式元素
Solr 在模式文件中存储有关其应理解的字段类型和字段的详细信息。
Solr 的模式文件
Solr 模式文件的名称和位置可能因您最初配置 Solr 的方式或稍后是否对其进行了修改而异。
-
managed-schema.xml
是 Solr 默认使用的模式文件的名称,用于支持通过模式 API 或无模式模式功能在运行时进行模式更改。您可以显式配置托管模式功能以使用其他文件名(如果您选择),但文件的内容仍然由 Solr 自动更新。
-
schema.xml
是模式文件的传统名称,该文件可以由使用ClassicIndexSchemaFactory
的用户手动编辑。 -
如果您使用的是 SolrCloud,您可能无法在本地文件系统中找到任何具有这些名称的文件。您只能通过模式 API(如果已启用)或通过 Solr 管理 UI 的云屏幕查看模式。
无论您的安装中使用哪个文件名,文件的结构都不会改变。但是,您与文件交互的方式会改变。如果您使用的是托管模式,则希望您仅使用模式 API 与文件交互,而绝不进行手动编辑。如果您不使用托管模式,则只能对文件进行手动编辑,模式 API 将不支持任何修改。
请注意,如果您尚未使用 Schema API,但您确实在使用 SolrCloud,则需要使用 upconfig
和 downconfig
命令通过 ZooKeeper 与 schema 文件进行交互,以创建本地副本并上传您的更改。执行此操作的选项在 Solr 控制脚本参考 和 ZooKeeper 文件管理 中进行了描述。
Schema 文件的结构
此示例不是真实的 XML,但显示了构成 schema 文件的主要元素。
<schema>
<types>
<fieldType>
<fields>
<field>
<copyField>
<dynamicField>
<similarity>
<uniqueKey>
</schema>
下面 唯一键 中描述的 uniqueKey
必须始终定义。
将使用默认的 similarity
,但可以按照下面 相似度 部分中的描述进行修改。
类型和字段是可选标签
请注意, |
唯一键
uniqueKey
元素指定哪个字段是文档的唯一标识符。虽然 uniqueKey
不是必需的,但几乎总是由您的应用程序设计所保证。例如,如果您要更新索引中的文档,则应使用 uniqueKey
。
您可以通过命名唯一键字段来定义它
<uniqueKey>id</uniqueKey>
Schema 默认值和 copyFields
不能用于填充 uniqueKey
字段。uniqueKey
的 fieldType
不能被分析,并且不能是任何 *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
作为默认值。
除了此页面上提到的各种工厂之外,还有其他几种可以使用的相似度实现,例如 SweetSpotSimilarityFactory
、ClassicSimilarityFactory
等。有关详细信息,请参阅 相似度工厂 的 Solr Javadocs。