Solr 索引与存储

Posted

技术标签:

【中文标题】Solr 索引与存储【英文标题】:Solr index vs stored 【发布时间】:2014-04-12 19:31:26 【问题描述】:

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

例如,如果我在 Schema.xml 中有以下内容

<field name="test1" type="text" indexed="false"
        stored="false" required="false" />

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

【问题讨论】:

【参考方案1】:

没错。通常,您希望您的字段被索引或存储或两者兼而有之。如果您将两者都设置为 false,则该字段将在您的 Solr 文档中不可用(用于搜索或显示)。当您希望将两者都设置为 false 时,请参阅 Alexandre 对于特殊情况的回答。

如here 所述:indexed=true 使字段可搜索(并可排序和分面)。例如,如果您有一个名为test1indexed=true 的字段,那么您可以像q=test1:foo 一样搜索它,其中foo 是您要搜索的值。如果 indexed=false 用于字段 test1,则该查询将不返回任何结果,即使您在 Solr 中有一个文档,test1 的值为 foo

stored=true 表示您可以在搜索时检索该字段。如果您想在查询中显式检索字段的值,您将在查询中使用fl 参数,例如fl=test1(默认为fl=*,表示检索所有存储的字段)。仅当stored=truetest1 时,才会返回该值。否则不予退还。

【讨论】:

我怎样才能收藏您的答案? :) 我认为您不需要为排序、分面编制索引。您可以设置 docValues=true。【参考方案2】:

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

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

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

在更高版本的 Solr 中,您还可以改用 IgnoreFieldUpdateProcessorFactory(其他请参阅 full list),这将在索引过程中更早地删除这些字段。

【讨论】:

没有意识到索引和存储都设置为 false 的字段的这种用例。 如果你逐行阅读示例配置,你会学到很多奇怪而奇妙的东西。 如果我只存储索引而不是字段值,那么它将对性能产生影响,因为我总是可以将字段值存储在其他数据库中,并在 Solr 给我搜索结果后从那里返回数据。它会帮助我减少索引文件的大​​小和更好的性能吗 Solr documentation 允许对都设置为 false 的字段进行就地更新。这有什么意义吗?更新不可搜索和不可存储的字段有什么实际意义? 因为该特定示例启用了 docValues,它再次以不同的方式存储内容。即使存储设置为 false,您也可以返回 docValue。这是一个新的 Solr 功能 (6+),在回答上述问题时不存在。【参考方案3】:

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

“indexed”和“stored”是独立的正交属性——你可以使用 真假的四种组合中的任何一种。 “索引”用于搜索 或查询,处理查询请求的“查找”部分。一旦 搜索/查询/查找完成并选择了一组文档,“存储” 是一组字段,其值可用于显示或返回 Solr 响应。

分离的部分原因是 Solr/Lucene “分析”或 将输入数据转换为更有效的形式,以便更快、更多 相关搜索/查找。不幸的是,分析/转换的数据是 经常不再适合展示和人类消费。其他 话分析/转换不是双向/可逆的。环境 "stored=true" 保证原始数据可以在它的 原始形式。

【讨论】:

“分析/转换后的数据经常不再适合显示和人类消费......” 我想知道为什么我们不能显示字段的如果它设置为 index="true",但 store="false",则为 value。你已经把它清理干净了。谢谢!【参考方案4】:

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

【讨论】:

这与现有答案有何不同?【参考方案5】:

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

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

fq = item: "Tennis" 会标记错误。

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

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

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

问候

【讨论】:

以上是关于Solr 索引与存储的主要内容,如果未能解决你的问题,请参考以下文章

在HBase之上的solr中创建索引

Solr 索引时间提升 VS 查询时间提升?

solr 在哪里存储搜索索引,在数据库中还是在文件中?

solr亿万级索引优化实践

SolrCloud中索引数据存储于HDFS

Solr索引数据