字段类型定义和属性

字段类型定义在文档编入索引或将查询发送到索引时对字段进行的分析。

字段类型定义可以包含四种类型的信息

  • 字段类型的名称(必填)。

  • 实现类名称(必填)。

  • 如果字段类型是 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 中的文档分析 中描述。

实现类负责确保字段得到正确处理。在类名称中,字符串 solrorg.apache.solr.schemaorg.apache.solr.analysis 的简写。因此,solr.TextField 实际上是 org.apache.solr.schema.TextField

字段类型属性

字段类型 class 决定了字段类型的大部分行为,但也可以定义可选属性。例如,以下日期字段类型的定义定义了两个属性,sortMissingLastomitNorms

<fieldType name="date" class="solr.DatePointField"
           sortMissingLast="true" omitNorms="true"/>

可以为给定字段类型指定的属性分为三大类

  • 特定于字段类型类的属性。

  • 通用属性 Solr 支持任何字段类型。

  • 字段默认属性,可指定在字段类型上,这些属性将由使用此类型的字段继承,而不是默认行为。

常规属性

这些是字段的常规属性

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

对于文本字段,在使用 sow=false(默认值)进行查询时适用。对于包含图感知筛选器的查询分析器的字段类型,请使用 true,例如 同义词图筛选器单词分隔符图筛选器

对于包含筛选器的查询分析器的字段类型,请使用 false,这些筛选器可以在缺少某些标记时匹配文档,例如 分片筛选器

docValuesFormat

可选

默认值:无

定义一个自定义的 DocValuesFormat,用于此类型的字段。这要求使用一个感知架构的编解码器,比如 架构编解码器工厂

postingsFormat

可选

默认值:无

定义一个自定义的 PostingsFormat,用于此类型的字段。这要求使用一个感知架构的编解码器,比如 架构编解码器工厂

Lucene 索引向后兼容性仅支持默认编解码器。如果您选择在架构中自定义 postingsFormatdocValuesFormat,升级到 Solr 的未来版本可能要求您在升级前切换回默认编解码器并优化索引以将其重写为默认编解码器,或在升级后从头重新构建整个索引。

字段默认属性

这些属性既可以在字段类型上指定,也可以在各个字段上指定,以覆盖字段类型提供的值。

每个属性的默认值取决于底层的 FieldType 类,而该类又可能取决于 <schema/>version 属性。下表包括 Solr 提供的大多数 FieldType 实现的默认值,假设架构声明了 version="1.6"

属性 说明 隐式默认值

indexed

如果为 true,字段的值可用于查询以检索匹配的文档。

true

stored

如果为 true,字段的实际值可通过查询检索。

true

docValues

如果为 true,字段的值将放入面向列的 DocValues 结构中。

false

sortMissingFirstsortMissingLast

当排序字段不存在时,控制文档的放置。

false

multiValued

如果为 true,表示单个文档可能包含此字段类型的多个值。

false

uninvertible

如果为 true,表示在查询时可以“取消反转”indexed="true" docValues="false" 字段,以构建大型内存数据结构,以代替 DocValues由于历史原因,默认为 true,但强烈建议用户将其设置为 false 以获得稳定性,并根据需要使用 docValues="true"

true

omitNorms

如果为 true,则忽略与此字段关联的规范(这将禁用字段的长度规范化,并节省一些内存)。对于所有原始(未分析)字段类型(如 int、float、data、bool 和 string)默认为 true。只有全文字段或需要索引时提升的字段才需要规范。

*

omitTermFreqAndPositions

如果为 true,则从该字段的发布中省略词频、位置和有效负载。对于不需要该信息的字段,这可以提高性能。它还减少了索引所需的存储空间。对具有此选项的字段发出的依赖于位置的查询将静默失败,无法找到文档。对于所有非文本字段,此属性默认为 true。

*

omitPositions

类似于 omitTermFreqAndPositions,但保留词频信息。

*

termVectorstermPositionstermOffsetstermPayloads

这些选项指示 Solr 为每个文档维护完整的词向量,可以选择包括这些向量中每个词条出现的的位置、偏移和有效负载信息。这些信息可用于加速高亮显示和其他辅助功能,但在索引大小方面会产生很大的开销。对于 Solr 的典型用途,它们不是必需的。

false

required

指示 Solr 拒绝任何尝试添加没有此字段值的文档。此属性默认为 false。

false

useDocValuesAsStored

如果字段启用了 DocValues,则将其设置为 true 将允许在 fl 参数 中匹配“*”时,将该字段返回为存储字段(即使它有 stored=false)。

true

large

大字段始终延迟加载,并且只有当实际值 < 512KB 时,才占用文档缓存中的空间。此选项需要 stored="true"multiValued="false"。它适用于可能具有非常大值的字段,以便它们不会缓存在内存中。

false

选择合适的数字类型

对于一般的数字需求,请考虑使用 IntPointFieldLongPointFieldFloatPointFieldDoublePointField 类之一,具体取决于您期望的特定值。这些基于“维度点”的数字类使用经过特殊编码的数据结构来支持高效的范围查询,无论所用范围的大小如何。根据需要,在这些字段上启用 DocValues 以进行排序和/或分面。

某些 Solr 功能可能无法与“维度点”配合使用,在这种情况下,您可能需要考虑同等的 TrieIntFieldTrieLongFieldTrieFloatFieldTrieDoubleField 类。这些字段类型已弃用,并且可能会在未来的 Solr 主要版本中删除,但如果需要,仍可以使用它们。如果您希望最小化索引大小,请配置 precisionStep="0",但如果您希望用户对数字类型执行频繁的范围查询,请使用默认的 precisionStep(通过不指定它)或将其指定为 precisionStep="8"(这是默认值)。这以增加索引大小为代价,为范围查询提供了更快的速度。

使用文本

正确处理文本将通过为用户提供文本搜索的最佳可能结果,从而让他们满意。

一种技术是使用文本字段作为关键字搜索的万能方法。大多数用户对他们的搜索并不精通,最常见的搜索可能是简单的关键字搜索。您可以使用 copyField 来获取各种字段,并将它们全部汇集到一个文本字段中以进行关键字搜索。

在 Solr 附带的“techproducts”示例的架构中,copyField 声明用于将 catnamemanufeaturesincludes 的内容转储到单个字段 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。有关更多详细信息以及配置全局和按类型相似性的示例,请参阅 相似性