2014-10-06 105 views
0

我正在试验Solr 4.10中的示例数据库,而不理解dynamicFields如何工作。该架构定义Solr dynamicField不在查询中搜索没有字段名称

dynamicField name="*_s" type="string" indexed="true" stored="true" 

如果我添加一个新的项目以便与新的字段名称(比如"example_s":"goober" JSON格式),就像

?q=goober 

没有返回匹配项的查询,而

?q=example_s:goober 

会找到匹配项。我错过了什么?

回答

0

我想从您正在使用的solrconfig.xml文件中查看SearchHandler来执行上述查询。

在SearchHandler中,我们通常有默认查询字段,即qf参数。

检查您的动态字段example_s是否存在于solrconfig文件的查询字段列表中,否则您可以在向查询处理程序发送查询时传递它。

希望这会帮助你解决你的问题。

+0

我认为你的答案是正确的,但是在更新qf参数中的字段列表,重新启动Solr以及重新索引文档之后,它仍然不起作用。 Solr似乎采取了与Elasticsearch相反的方法;我在几分钟内就开始使用Elasticsearch运行,因为默认配置会索引所有内容。除非你告诉它索引什么,Solr的默认配置基本上什么都没有索引。 – user3528023 2014-10-07 14:36:03

0

如果您使用的是默认的模式,这里发生的事情:

  1. 您可能正在使用默认的终点(/选择),所以你得到的搜索类型,并从该参数的定义。这意味着,它是默认(lucene)搜索和the field searched is text
  2. 该文本字段是聚合并由copyField instruction from other fields填充。
  3. 您的dynamic field definition for *_s允许您使用以_s结尾的任何名称(例如example_s)对文本编制索引。它的索引(所以你可以直接搜索它)和存储(所以你可以看到它,当你问所有领域)。但它不会将其作为一般文本进行搜索。注意(与ElasticSearch不同),Solr字符串必须完全匹配。如果你在其中有多个单词文本,几乎没有任何一点搜索它。 “goober”是一个词,所以它不是一个很好的例子来理解这里的区别。
  4. 最简单的解决方案是添加另一个copyField指令: <copyField source="*_s" dest="text"/>,那么您的所有* _s动态字段也将被搜索。但请注意,搜索分析程序而不是是用于* _s定义的搜索分析程序,但for the text field's definition不是字符串,而是text_general,在文件中的其他位置定义。

至于Solr与ElasticSearch,他们都在魔法的不同方面犯错。 Solr使您能够配置系统,并且可以非常轻松地查看当前的配置。 ElasticSearch会隐藏所有的配置,但您必须重新发现它,这是您想要改变默认行为的第二个配置。最终,结果可能是相似的,并在中间的某个地方遇到。