Solr索引与存储


69

我对Solr字段的索引行为和存储的样式表示什么感到困惑。

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

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

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

Answers:


120

那是对的。通常,您将希望对字段进行索引或存储,或同时对两者进行索引。如果将两者都设置为false,则该字段将在Solr文档中不可用(用于搜索或显示)。当您希望将两者都设置为false时,请参见Alexandre的答案以了解特殊情况。

如前所述这里indexed=true让一个字段搜索(和排序和facetable)。对于例如,如果您有一个名为场test1indexed=true,那么你就可以搜索它想q=test1:foo,这里foo是您正在搜索的价值。如果是indexed=falsefor字段,test1那么即使您在Solr中有一个test1值为的文档,该查询也不会返回任何结果foo

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


1
我如何喜欢您的答案?:)
Fisher Coder'Sep

我认为您无需为排序,构面编制索引。您可以设置docValues = true。
Gibbs

29

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

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

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

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


1
没有意识到索引和存储都设置为false的字段的这种用例。
2014年

4
如果逐行阅读示例配置,您将学到很多奇怪而奇妙的东西。
Alexandre Rafalovitch 2014年

如果我只存储索引而不存储字段值,那么它将对性能产生影响,因为我总是可以将字段值存储在其他数据库中,并在Solr给我搜索结果后从那里返回数据。它会帮助我减少索引文件的大​​小并提高性能

1
Solr文档允许就地更新都设置为false的字段。有什么意义吗?更新不可搜索和不可存储的字段有什么实际意义?
Max Chernopolsky

1
因为该特定示例启用了docValues,因此再次以不同的方式存储内容。而且,即使将storage设置为false,也可以返回docValue。这是新的Solr功能(6+),在回答上述问题时不存在。
亚历山大·拉法洛维奇

9

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

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

分离的部分原因是Solr / Lucene将输入数据“分析”或转换为更有效的形式,以便更快,更相关地进行搜索/查找。不幸的是,分析/转换的数据通常不再适合显示和人类消费。换句话说,分析/转换不是双向的/可逆的。设置“ stored = true”可确保可以原始格式检索原始数据。


3
“经过分析/转换的数据通常不再适合显示和供人类使用...” 我想知道为什么如果将字段的值设置为index =“ true”,而存储为=“ false”,那么我们就无法显示该字段的值。您已经清除了。谢谢!
AlexMelw

3

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


这与现有答案有何不同?
MatsLindh '18

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,但不会返回结果中的项目字段。

问候

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.