我对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字段。
对