2014-10-06 102 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會隱藏所有的配置,但您必須重新發現它,這是您想要改變默認行爲的第二個配置。最終,結果可能是相似的,並在中間的某個地方遇到。