字段类型定义和属性

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

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

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

  • 实现类名称(必需)。

  • 如果字段类型是 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

必需

默认值:无

fieldType 的名称。此值在字段定义中的 "type" 属性中使用。强烈建议名称仅包含字母数字或下划线字符,且不以数字开头。目前这并非严格强制执行。

class

必需

默认值:无

用于存储和索引此类型数据的类名。请注意,您可以使用 "solr." 作为包含的类名的前缀,Solr 将自动找出要搜索类的包 - 因此 solr.TextField 可以工作。

如果您正在使用第三方类,您可能需要使用完全限定的类名。solr.TextField 的完全限定等效名称是 org.apache.solr.schema.TextField

positionIncrementGap

可选

默认值:无

对于多值字段,指定多个值之间的距离,这可以防止出现虚假的短语匹配。

autoGeneratePhraseQueries

可选

默认值:无

对于文本字段。如果为 true,则 Solr 会自动为相邻词生成短语查询。如果为 false,则词必须用双引号括起来才能被视为短语。

synonymQueryStyle

可选

默认值:as_same_term

用于组合重叠查询词(即,同义词)的分数查询。考虑搜索 "蓝色 T 恤",其中查询时同义词为 tshirt,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 同义词和分类:我的过错讨论了 Solr 在同义词扩展方面的行为。

enableGraphQueries

可选

默认值:true

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

对于包含当某些标记缺失时仍能匹配文档的过滤器的查询分析器的字段类型,请使用 false,例如 Shingle 过滤器

docValuesFormat

可选

默认值:无

定义一个自定义的 DocValuesFormat 用于此类型的字段。这需要使用 schema-aware 编解码器,例如Schema Codec Factory

postingsFormat

可选

默认值:无

定义一个自定义的 PostingsFormat 用于此类型的字段。这需要使用 schema-aware 编解码器,例如Schema Codec Factory

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

字段默认属性

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

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

属性 描述 隐式默认值

indexed

如果为 true,则可以在查询中使用该字段的值来检索匹配的文档。

true

stored

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

true

docValues

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

对于大多数字段,为 true

sortMissingFirstsortMissingLast

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

false

multiValued

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

false

uninvertible

如果为 true,则表示一个 indexed="true" docValues="false" 字段可以在查询时被“反转”,以构建大型内存数据结构来代替DocValues

false

omitNorms

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

*

omitTermFreqAndPositions

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

*

omitPositions

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

*

termVectorstermPositionstermOffsetstermPayloads

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

false

required

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

false

useDocValuesAsStored

如果该字段启用了DocValues,则将此属性设置为 true 将允许该字段像存储字段一样返回 (即使它具有 stored=false) ,当在fl 参数中匹配 "*" 时。

true

large

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

false

选择合适的数字类型

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

某些 Solr 功能可能尚不适用于“维度点”,在这种情况下,您可能需要考虑等效的 TrieIntFieldTrieLongFieldTrieFloatFieldTrieDoubleField 类。这些字段类型已弃用,并可能在未来的主要 Solr 版本中删除,但如果需要,仍然可以使用它们。如果您希望尽量减少索引大小,请配置 precisionStep="0",但是如果您希望用户对数字类型进行频繁的范围查询,请使用默认的 precisionStep(通过不指定它)或将其指定为 precisionStep="8"(这是默认值)。这可以提高范围查询的速度,但会增加索引大小。

使用文本

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

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

在 Solr 附带的“techproducts”示例的 schema 中,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。有关更多详细信息和配置全局和每种类型相似度的示例,请参见相似度