字段类型定义和属性
字段类型定义了在索引文档或将查询发送到索引时,将对字段进行的分析。
字段类型定义可以包括四种类型的信息
-
字段类型的名称(必需)。
-
实现类名称(必需)。
-
如果字段类型是
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
-
必需
默认值:无
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
对于包含当某些标记缺失时仍能匹配文档的过滤器的查询分析器的字段类型,请使用
false
,例如 Shingle 过滤器。
docValuesFormat
-
可选
默认值:无
定义一个自定义的
DocValuesFormat
用于此类型的字段。这需要使用 schema-aware 编解码器,例如Schema Codec Factory。 postingsFormat
-
可选
默认值:无
定义一个自定义的
PostingsFormat
用于此类型的字段。这需要使用 schema-aware 编解码器,例如Schema Codec Factory。
Lucene 索引向后兼容性仅支持默认编解码器。如果选择在 schema 中自定义 |
字段默认属性
这些属性可以在字段类型上指定,也可以在单个字段上指定以覆盖字段类型提供的值。
每个属性的默认值取决于底层的 FieldType
类,而该类又可能取决于 <schema/>
的 version
属性。下表包括 Solr 提供的大多数 FieldType
实现的默认值,假设 schema 声明了 version="1.6"
。
属性 | 描述 | 隐式默认值 |
---|---|---|
|
如果为 |
|
|
如果为 |
|
|
如果为 |
对于大多数字段,为 |
|
控制当排序字段不存在时文档的放置位置。 |
|
|
如果为 |
|
|
如果为 |
|
|
如果为 |
* |
|
如果为 |
* |
|
与 |
* |
|
这些选项指示 Solr 为每个文档维护完整的词向量,可以选择包括这些向量中每个词出现的的位置、偏移量和有效负载信息。 这些可以用来加速高亮显示和其他辅助功能,但会给索引大小带来相当大的成本。 它们对于 Solr 的典型用途来说不是必需的。 |
|
|
指示 Solr 拒绝任何尝试添加此字段没有值的文档。此属性默认为 false。 |
|
|
如果该字段启用了DocValues,则将此属性设置为 true 将允许该字段像存储字段一样返回 (即使它具有 |
|
|
大型字段始终是延迟加载的,并且只有当实际值 < 512KB 时才会占用文档缓存中的空间。此选项需要 |
|
选择合适的数字类型
对于一般数字需求,请考虑使用 IntPointField
、LongPointField
、FloatPointField
或 DoublePointField
类中的一个,具体取决于您期望的特定值。这些基于“维度点”的数字类使用经过特殊编码的数据结构来支持高效的范围查询,而无需考虑所用范围的大小。根据需要为这些字段启用DocValues,以便进行排序和/或分面。
某些 Solr 功能可能尚不适用于“维度点”,在这种情况下,您可能需要考虑等效的 TrieIntField
、TrieLongField
、TrieFloatField
和 TrieDoubleField
类。这些字段类型已弃用,并可能在未来的主要 Solr 版本中删除,但如果需要,仍然可以使用它们。如果您希望尽量减少索引大小,请配置 precisionStep="0"
,但是如果您希望用户对数字类型进行频繁的范围查询,请使用默认的 precisionStep
(通过不指定它)或将其指定为 precisionStep="8"
(这是默认值)。这可以提高范围查询的速度,但会增加索引大小。
使用文本
正确处理文本将通过为用户提供最佳的文本搜索结果来让他们满意。
一种技术是使用文本字段作为关键字搜索的包罗万象。大多数用户对搜索不精通,最常见的搜索可能是简单的关键字搜索。您可以使用 copyField
来获取各种字段,并将它们全部输入到单个文本字段以进行关键字搜索。
在 Solr 附带的“techproducts”示例的 schema 中,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
。有关更多详细信息和配置全局和每种类型相似度的示例,请参见相似度。