2009-11-11 103 views
6

剛裝的Solr,編輯schema.xml,和我現在正試圖指數,並用一些測試數據搜索就可以了。SOLR不搜索某些領域

在我發送到Solr的XML文件,我的領域之一是這樣的:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field> 

有HTML那裏,所以我在CDATA包裹着它。

在我的Solr schema.xml,該字段的定義是這樣的:

<field name="PageContent" type="text" indexed="true" stored="true"/> 

當我跑的發佈工具,一切正常,但是當我搜索內容,我知道的是PageContent領域內,我沒有結果。

然而,當我在<defaultSearchField>節點設置爲PageContent,它的工作原理。但如果我將它設置爲任何其他領域,它不PageContent搜索。

我做錯了什麼?有什麼問題?


要澄清錯誤:

我上傳了「DOC」具有下列數據:

<field name="PageID">928</field> 
<field name="PageName">some name</field> 
<field name="PageContent"><![CDATA[<p>html content</p>]]></field> 

在我的架構,我定義的字段爲這樣:

<field name="PageID" type="integer" indexed="true" stored="true" required="true"/> 
<field name="PageName" type="text" indexed="true" stored="true"/> 
<field name="PageContent" type="text" indexed="true" stored="true"/> 

和:

<uniqueKey>PageID</uniqueKey> 
<defaultSearchField>PageName</defaultSearchField> 

現在,當我使用Solr管理工具,然後搜索「some name」我得到一個結果。但是,如果我搜索 「html content」, 「html」, 「content」 或 「928」,我沒有得到任何結果

爲什麼?

回答

7

您提到您的默認搜索字段設置爲PageName,我不希望搜索「內容」返回任何內容。

你可能意味着把「PageContent:內容」,在搜索框查找在這一領域的數據。如果你想搜索多個字段,你需要檢查http://wiki.apache.org/solr/DisMaxRequestHandler。 Solr管理控制檯並不是一個可以兼容所有DisMax搜索選項的工具,您只需要操作網址即可。

無論如何,我同意前面的海報,如果你的分析設置沒有設置正確處理HTML,你很可能得到各種意外的搜索結果。僅剝離HTML和索引文本。

如果你想讓你的標準查詢處理程序針對所有的字段進行搜索,你可以在你的solrconfig.xml文件中改變它(我總是添加第二個查詢處理程序而不是修改「standard」.qf字段是你的字段列表要搜索對,這是一個空格分隔列表。

<requestHandler name="standard" class="solr.DisMaxRequestHandler"> 

    <lst name="defaults"> 
      <str name="echoParams">all</str> 
      <str name="hl">true</str> 

      <str name="fl">*</str> 
      <str name="qf">PageName PageContent</str> 
    </lst> 

</requestHandler> 
+0

很酷,謝謝Trey。所以讓我弄清楚這一點。我有點困惑。因此,如果我只是發送一個搜索查詢,即「solr /?q = hi我住在內容節點中」,SOLR只會對單個字段進行查找?當我運行示例vanilla SOLR設置時,我感覺像一個簡單的查詢搜索所有字段?我錯了嗎? – andy 2009-11-12 23:39:04

+1

由於評論中沒有語法突出顯示,我在上面用一個建議來澄清。 – Trey 2009-11-13 23:49:48

+0

+1親愛的,謝謝你,我會試試看,並回復給你 – andy 2009-11-15 23:26:40

1

你要確保你嘗試在它在進行搜索之前,你的數據發生了,對不對?

另外,如果你想存儲原始的HTML它可能是最好的實際刪除HTML。你可以在你的應用程序或使用Solr的solr.HTMLStripWhitespaceTokenizerFactory做到這一點,如:

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

,你在你的字段類型定義聲明爲「文本」。您可能希望創建一個新的字段類型只是爲你的HTML,也許像text_html,你可以使用它像這樣:

<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldtype> 

我不知道你的意思是:

However, when I set the node to PageContent, it works. But if I set it to any other field, it doesn't search in PageContent.

燦你請詳細說明一下?

+0

cool cody,上面的代碼真的很有用,我一定會去掉html。至於PageContent問題,我已經更新了上面的問題。非常感謝。 – andy 2009-11-11 05:57:51

1

fl是查詢返回的字段列表.. qf是你想指到列表中,它不支持通配符..

搜索所有字段而不徵用它們的唯一方法是擁有一個可以捕獲所有字段的副本字段然後模仿搜索所有字段搜索

0

在我的schema.xml中,我有如下所示將以_t結尾的每個字段的值複製到文本字段中。

<defaultSearchField>text</defaultSearchField> 
<copyField source="*_t" dest="text" maxChars="3000"/> 
0

參數fl指定字段對查詢,但字段在響應中返回。

你可以只添加到schema.xml

<field name="fieldContainingEverything" type="text" indexed="true" stored="true" multiValued="true" /> 

<defaultSearchField>fieldContainingEverything</defaultSearchField> 

<copyField source="*" dest="fieldContainingEverything" maxChars="3000"/> 

現在,當索引,每場將被複制到fieldContainingEverything這裏的問題是,如果你想進一步評估這些信息,你就失去了內容來自的領域。如果有人對此有所瞭解,我會很高興。


我發現有些功能的解決方案:

爲了描述的場景多一點細節:我有很多領域對指數的MySQL數據庫表,並只導入各個領域這樣做無需指定每個字段(SELECT * FROM ...)。我想查詢表中的每個字段的索引,並想知道哪個字段與查詢匹配。這是不可能的,因爲熒光筆只是告訴你匹配查詢的字段是fieldContainingEverything。通過使用dismax查詢處理程序我發現,即使據說在每個字段中搜索,我似乎都無法通過qf參數中未指定的字段進行搜索。現在的想法是通過添加索引每個字段:

<dynamicField name="*" type="string" indexed="true" stored="true"/> 

到您的schema.xml。現在,當您通過dismaxhl.true&hl.fl=*查詢Solr時,您可以將qf=fieldContainingEverything^1添加到您的參數列表中。 Solr現在搜索每個索引字段,但也會突出顯示包含查詢字詞的每個字段。這種方法的缺點顯然是增加的指數大小,在大多數情況下,我認爲這不應該是相關的。