我对Solr字段的索引和存储属性的行为有点困惑。
例如,如果我在Schema.xml中有以下内容
<field name="test1" type="text" indexed="false"
stored="false" required="false" />
字段 test1 是否会存储在Solr文档中,即使我在其中创建包含该字段的文档并将值设置为该字段并将文档提交给Solr。因为我有stored=false
属性,是否意味着该字段的值在Solr中丢失而不是持久存在?
答案 0 :(得分:95)
这是正确的。通常,您希望您的字段可以编入索引或存储,也可以两者都存在。如果将两者都设置为false,则该字段将无法在Solr文档中使用(用于搜索或显示)。如果你想将两者都设置为假,请参阅Alexandre对特殊情况的回答。
如上所述here:indexed=true
使字段可搜索(可排序且可分面)。例如,如果您有一个名为test1
且indexed=true
的字段,那么您可以像q=test1:foo
一样搜索,其中foo
是您要搜索的值。如果字段indexed=false
为test1
,那么即使您在Solr中有一个test1
的值为foo
的文档,该查询也不会返回任何结果。
stored=true
表示您可以在搜索时检索字段。如果要显式检索查询中字段的值,您将在查询中使用fl
param,如fl=test1
(默认为fl=*
,表示检索所有存储的字段)。仅当stored=true
为test1
时,才会返回该值。否则它将不会被退回。
答案 1 :(得分:26)
将两者都设置为false的要点是明确跳过该特定字段。
例如,如果您有一个存储/索引dynamicField映射,并且您想忽略一个特定的名称,否则该名称将属于dynamicField的模式。
或者,您可以使用dynamicField忽略来自第三方的具有相同前缀/后缀的整组字段。例如,Tika将向您发送一大堆您可能只想忽略的元数据字段。请参阅Solr的示例schema.xml中定义并在solrconfig.xml
中使用的内容在Solr的更高版本中,您也可以使用IgnoreFieldUpdateProcessorFactory(其他人请参阅full list),这将在索引过程中更早地删除这些字段。
答案 2 :(得分:6)
在Solr的邮件主题中引用this响应:
“索引”和“存储”是独立的,正交的属性 - 您可以使用 真假四种组合中的任何一种。 “indexed”用于搜索 或查询,处理查询请求的“查找”部分。一旦 搜索/查询/查找完成,选择一组文档,“存储” 是一组字段,其值可用于显示或返回 Solr的反应。
分离的部分原因是Solr / Lucene“分析”或 将输入数据转换为更有效的形式,以实现更快,更多 相关的搜索/查找。不幸的是,分析/转换的数据是 经常不再适合展示和人类消费。其他 分析/转换不是双向/可逆的。设置 “stored = true”保证可以在其中检索原始数据 原始形式。
答案 3 :(得分:1)
如果两者都是假的,则会丢失该字段中的数据。如果索引为true,则数据是可搜索的,但无法显示。如果设置存储为true,则无法搜索该字段但可以显示(在这种情况下,您可以编写copyfield规则以将信息从该字段复制到默认的可搜索字段)。两者都设置为true - &gt;你可以搜索和显示。
答案 4 :(得分:0)
indexed = true 表示可以在搜索中使用此字段。 例如,如果我将项目字段设置如下,然后尝试在搜索中执行该字段
<field name="item" type="text_general" uninvertible="true" indexed="false" stored="true"/>
fq =项:“网球”将标记为错误。
stored = true 表示可以在查询后显示的字段列表中检索此字段。 例如,如果item字段定义如下
<field name="item" type="text_general" uninvertible="true" indexed="true" stored="false"/>
您将能够搜索fq = item: "Tennis" correctly
,但不会返回结果中的项目字段。
致谢