Solr索引vs存储



我对Solr字段的索引和存储属性的行为有点困惑。

例如,如果我在Schema.xml

中有以下内容
<field name="test1" type="text" indexed="false"
        stored="false" required="false" />

字段test1是否不存储在Solr文档中,即使我创建了一个包含该字段的文档,并为该字段设置了一个值,并将文档提交给Solr。由于我有stored=false属性,这是否意味着该字段的值在Solr中丢失而不持久?

正确。通常,您会希望您的字段要么被索引,要么被存储,或者两者兼而有之。如果将两者都设置为false,则该字段将无法在Solr文档中使用(无论是用于搜索还是显示)。在特殊情况下,当你想将两者都设置为false时,请参阅Alexandre的回答。

如这里所述:indexed=true使字段可搜索(并且可排序和可表)。例如,如果您有一个名为test1的字段,其中包含indexed=true,那么您可以像搜索q=test1:foo一样搜索它,其中foo是您正在搜索的值。如果indexed=false对应字段test1,那么该查询将不会返回任何结果,即使您在Solr中有一个test1的值为foo的文档。

stored=true意味着您可以在搜索时检索该字段。如果您想在查询中显式检索字段的值,您将在查询中使用fl参数,就像fl=test1一样(默认是fl=*,表示检索所有存储的字段)。只有当stored=true对应test1时,才会返回该值。

将两者都设置为false的主要目的是显式跳过该特定字段。

例如,如果您有一个存储/索引dynamicField映射,并且您想忽略一个特定的名称,否则它将属于dynamicField模式。

或者你可以使用dynamicField来忽略来自第三方的具有相同前缀/后缀的一整套字段。例如,Tika将向您发送一大堆您可能只想忽略的元数据字段。参见Solr示例schema.xml中定义的,并在solrconfig.xml

中使用。

在Solr的后续版本中,您还可以使用IgnoreFieldUpdateProcessorFactory(请参阅其他完整列表),这将在索引过程中更早地删除这些字段。

引用Solr邮件线程中的响应:

"索引"one_answers"存储"是独立的、正交的属性——你可以使用真与假的四种组合之一"indexed"用于搜索或查询,即处理查询请求的"查找"部分。一旦完成搜索/查询/查找,并选择一组文档,"存储"字段集的值是否可用于显示或返回

分离的部分原因是Solr/Lucene"分析"或将输入数据转换为更有效的形式,从而更快、更高效相关搜索/查询。不幸的是,分析/转换的数据是经常不再适合展示和人类消费。在其他总之,分析/转换不是双向的/可逆的。设置"stored=true"保证原始数据可以在其原始形式。

如果两者都为假,则丢失该字段中的数据。如果索引为true,则数据是可搜索的,但不能显示。如果您将stored设置为true,您将无法搜索该字段,但它可以显示(在这种情况下,您可以编写copyfield规则将信息从该字段复制到默认的可搜索字段)。

indexed = true表示该字段可以在搜索中使用。例如,如果我将item字段设置如下,并尝试在搜索

中执行该字段
<field name="item" type="text_general" uninvertible="true" indexed="false" stored="true"/>

fq = item: "网球"将标记错误。

stored = true表示该字段可以在查询后显示的字段列表中检索。例如,如果item字段定义如下

<field name="item" type="text_general" uninvertible="true" indexed="true" stored="false"/>

您将能够搜索fq = item: "Tennis" correctly,但它不会在结果中返回item字段。

最新更新