2011-09-07 171 views
3

我正在使用Solr的schema.xml,我知道我可以使用'default'属性来指定默认值,如果没有提供给定字段的值,那么将使用默认值。但是,假设我选择不设置“默认”属性,那么Solr会默认哪个默认值返回到?Solr:没有显式设置默认值的字段默认值是什么?

我会认为,我用于给定字段的字段类型将有一个默认值,可以使用,但我没有找到任何细节。或者,我认为不提供一个值并且不能有效地设置一个默认值就好像该字段对于特定文档不存在一样。

但是,我不知道,我想知道:-)

更新1

据我所看到的,只是Solr的抛出一个错误,并返回一个错误400如果未设置默认值并且没有为给定字段提供值,则为“错误请求”。换句话说,如果未提供任何值并且没有在schema.xml中设置默认值,Solr似乎不会应用任何“回退”默认值。

更新2

我上面的更新似乎是错误的。如果没有为字段提供任何值,并且没有为该字段设置默认值,则Solr会将该字段视为不存在该特定文档。当然,如果该字段是必需的,这种行为不适用。

回答

3

根据我的经验,如果您在加载文档时未指定字段,那么Solr将在索引文档时忽略该字段,并且您的语句“没有提供值并且没有有效设置默认值就好像那样字段不存在的特定文件“是真实的。问题在于,您只需指定要为给定文档添加的字段。查看Solr Distribution附带的xml exampledocs,查看包含不同字段集的文件的一些示例。

+0

这很奇怪。我试图通过故意遗漏在schema.xml中设置的某个字段来索引文档。索尔然后给了我一个400“坏请求”。一旦索引期间我为该领域提供了价值,Solr再次开心。你还记得你是否为schema.xml中的每个字段显式设置了'default'属性? – sbrattla

+0

不,我没有为我的任何字段设置“default”属性。如果我没有指定一个值,那么我希望从中得到一个问题的唯一字段应该是'uniqueKey'设置中标识的字段。 –

+0

看起来你是对的,而且我的“坏请求”肯定是由别的东西引起的。感谢您的输入。 – sbrattla

6

如果您在索引期间没有为字段提供值,solr将使用schema.xml文件中定义的默认值。如果未定义默认值,solr将忽略此字段。如果field在schema.xml中被标记为必需 - solr将会拒绝这个错误的文档。

例子:

<field name="comments" type="text" indexed="true" stored="true" required="true"/> 
<field name="timestamp" type="date" indexed="true" stored="true" default="NOW" /> 
+0

感谢您的输入!欣赏它! – sbrattla

2

虽然你定义在文件中的字段名为schema.xml,Solr的文件实际上schemeless。这意味着内部Solr引擎(Lucene)没有任何每个文档必须具有的字段的定义。使用Lucene,您可以轻松地将字段myCompletelyNewField添加到任何文档,而不会影响其他文档。

那么,schema.xml的原因是什么? Solr/Lucene中的每个字段都有几个属性,其中最着名的是indexedstored属性。而且,所有字段都必须绑定到某些内部数据类型和处理单元。例如,id字段必须存储为字符串,并且description字段必须用一些英文分析器进行分析,用停用词过滤器清理等。将所有这些信息都通过add请求传递给Solr非常不方便。既然您知道您将使用什么字段并且有权访问Solr服务器(至少在大多数情况下),将所有这些信息移动到单独的文件中会更容易。这个文件是schema.xml

所以,现在你必须明白,schema.xml定义是允许领域,但必须存在文件不田。其他修饰符如requireddefault只是在向索引添加文档之前提供附加服务。即required将强制Solr的“前端”检查新文档中是否存在指定的字段。如果是,则进一步传递文档,否则拒绝新的文档。 default会导致相同的检查,但如果字段不存在,则将其添加为默认值并进一步传递文档。

至于你的“错误请求”错误,我猜你在其他地方有错误,例如,在不允许的情况下添加空字段(字段存在,但其值为“”),或者为字段使用不正确的值,或者添加与实际字段相加的其他修饰符。

+0

感谢您的输入。这一切都是有道理的,我感谢你对它在幕后工作的全面描述! – sbrattla