字段类型定义和属性
字段类型定义在文档编入索引或将查询发送到索引时对字段进行的分析。
字段类型定义可以包含四种类型的信息
-
字段类型的名称(必填)。
-
实现类名称(必填)。
-
如果字段类型是
TextField
,则为字段类型的字段分析的描述。 -
字段类型属性 - 根据实现类,某些属性可能是必填的。
模式中的字段类型定义
字段类型在集合的 模式 中定义。每个字段类型在 fieldType
元素之间定义。它们可以选择在 types
元素中分组。
以下是名为 text_general
的类型的字段类型定义示例
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> (1)
<analyzer type="index"> (2)
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
1 | 上面示例中的第一行包含字段类型名称 text_general 和实现类的名称 solr.TextField 。 |
2 | 定义的其余部分是关于字段分析,在 Solr 中的文档分析 中描述。 |
实现类负责确保字段得到正确处理。在类名称中,字符串 solr
是 org.apache.solr.schema
或 org.apache.solr.analysis
的简写。因此,solr.TextField
实际上是 org.apache.solr.schema.TextField
。
字段类型属性
字段类型 class
决定了字段类型的大部分行为,但也可以定义可选属性。例如,以下日期字段类型的定义定义了两个属性,sortMissingLast
和 omitNorms
。
<fieldType name="date" class="solr.DatePointField"
sortMissingLast="true" omitNorms="true"/>
可以为给定字段类型指定的属性分为三大类
常规属性
这些是字段的常规属性
name
-
必需
默认值:无
字段类型的名称。此值在字段定义中使用,“type”属性中。强烈建议名称仅由字母数字或下划线字符组成,且不以数字开头。目前尚未严格执行此规则。
class
-
必需
默认值:无
用于存储和索引此类型数据的类名。请注意,你可以在包含的类名前加上前缀“solr.”,Solr 会自动找出要搜索类的包,因此
solr.TextField
将起作用。如果你正在使用第三方类,则可能需要使用完全限定的类名。
solr.TextField
的完全限定等效项为org.apache.solr.schema.TextField
。 positionIncrementGap
-
可选
默认值:无
对于多值字段,指定多个值之间的距离,这可以防止出现虚假短语匹配。
autoGeneratePhraseQueries
-
可选
默认值:无
对于文本字段。如果为
true
,Solr 会自动为相邻术语生成短语查询。如果为false
,则必须将术语用双引号引起来才能将其视为短语。 synonymQueryStyle
-
可选
默认值:
as_same_term
用于合并重叠查询术语(即同义词)的得分。考虑使用查询时同义词
tshirt,tee
搜索“blue tee”。-
as_same_term
:混合术语,即SynonymQuery(tshirt,tee)
,其中每个术语将被视为同样重要。此选项适用于术语是真正同义词(例如,“television, tv”)的情况。 -
pick_best
:对Dismax(tee,tshirt)
评分时选择最重要的同义词。当同义词扩展到下义词(q=jeans w/ jeans⇒jeans,pants)
且你希望精确出现在父级和同级概念之前时,请使用此选项。 -
as_distinct_terms
:将评分偏向于最重要的同义词(pants OR slacks)
。这篇博文 Solr Synonyms and Taxonomies: Mea Culpa 讨论了 Solr 在同义词扩展中的行为。
-
enableGraphQueries
-
可选
默认值:
true
对于包含筛选器的查询分析器的字段类型,请使用
false
,这些筛选器可以在缺少某些标记时匹配文档,例如 分片筛选器。
Lucene 索引向后兼容性仅支持默认编解码器。如果您选择在架构中自定义 |
字段默认属性
这些属性既可以在字段类型上指定,也可以在各个字段上指定,以覆盖字段类型提供的值。
每个属性的默认值取决于底层的 FieldType
类,而该类又可能取决于 <schema/>
的 version
属性。下表包括 Solr 提供的大多数 FieldType
实现的默认值,假设架构声明了 version="1.6"
。
属性 | 说明 | 隐式默认值 |
---|---|---|
|
如果为 |
|
|
如果为 |
|
|
如果为 |
|
|
当排序字段不存在时,控制文档的放置。 |
|
|
如果为 |
|
|
如果为 |
|
|
如果为 |
* |
|
如果为 |
* |
|
类似于 |
* |
|
这些选项指示 Solr 为每个文档维护完整的词向量,可以选择包括这些向量中每个词条出现的的位置、偏移和有效负载信息。这些信息可用于加速高亮显示和其他辅助功能,但在索引大小方面会产生很大的开销。对于 Solr 的典型用途,它们不是必需的。 |
|
|
指示 Solr 拒绝任何尝试添加没有此字段值的文档。此属性默认为 false。 |
|
|
如果字段启用了 DocValues,则将其设置为 true 将允许在 fl 参数 中匹配“*”时,将该字段返回为存储字段(即使它有 |
|
|
大字段始终延迟加载,并且只有当实际值 < 512KB 时,才占用文档缓存中的空间。此选项需要 |
|
选择合适的数字类型
对于一般的数字需求,请考虑使用 IntPointField
、LongPointField
、FloatPointField
或 DoublePointField
类之一,具体取决于您期望的特定值。这些基于“维度点”的数字类使用经过特殊编码的数据结构来支持高效的范围查询,无论所用范围的大小如何。根据需要,在这些字段上启用 DocValues 以进行排序和/或分面。
某些 Solr 功能可能无法与“维度点”配合使用,在这种情况下,您可能需要考虑同等的 TrieIntField
、TrieLongField
、TrieFloatField
和 TrieDoubleField
类。这些字段类型已弃用,并且可能会在未来的 Solr 主要版本中删除,但如果需要,仍可以使用它们。如果您希望最小化索引大小,请配置 precisionStep="0"
,但如果您希望用户对数字类型执行频繁的范围查询,请使用默认的 precisionStep
(通过不指定它)或将其指定为 precisionStep="8"
(这是默认值)。这以增加索引大小为代价,为范围查询提供了更快的速度。
使用文本
正确处理文本将通过为用户提供文本搜索的最佳可能结果,从而让他们满意。
一种技术是使用文本字段作为关键字搜索的万能方法。大多数用户对他们的搜索并不精通,最常见的搜索可能是简单的关键字搜索。您可以使用 copyField
来获取各种字段,并将它们全部汇集到一个文本字段中以进行关键字搜索。
在 Solr 附带的“techproducts”示例的架构中,copyField
声明用于将 cat
、name
、manu
、features
和 includes
的内容转储到单个字段 text
中。此外,将 ID
复制到 text
中可能是一个好主意,以防用户希望通过将产品编号传递给关键字搜索来搜索特定产品。
另一种技术是使用 copyField
以不同的方式使用同一个字段。假设您有一个字段是作者列表,如下所示
Schildt, Herbert; Wolpert, Lewis; Davies, P.
对于按作者搜索,您可以对字段进行标记化、转换为小写并去除标点符号
schildt / herbert / wolpert / lewis / davies / p
对于排序,只需使用未标记化的字段,转换为小写,并去除标点符号
schildt herbert wolpert lewis davies p
最后,对于分面,仅通过 StrField
使用主要作者
Schildt, Herbert
字段类型相似性
字段类型可以选择指定一个 <similarity/>
,只要集合的“全局”相似性允许,它将用于对引用此类型的字段的文档进行评分。
默认情况下,任何未定义相似性的字段类型都使用 BM25Similarity
。有关更多详细信息以及配置全局和按类型相似性的示例,请参阅 相似性。