2014-01-11 38 views
2

我正在使用Solr 4.6.0,並且試圖按年分組獲得最頻繁的術語。由於我的停用詞可能會經常更改,因此我不會在索引時間應用停用詞。相反,在查詢時間使用所有動態詞列表,如停用詞,原子詞和同義詞。但是,儘管停用詞列表包含諸如「of」和「the」之類的術語,但它們仍顯示在結果列表中(請參閱結果)。Solr方面在查詢時忽略停用詞

問題:我怎樣才能多面和禁用詞過濾的結果,如果我只用在查詢時StopFilterFactory

信息

如果我使用StopFilterFactory索引時間,如預期的一切。當我運行我的查詢時,「of」和「the」等術語被過濾掉。

我還使用Solr管理分析工具測試了field_name text_en的功能,結果如預期的那樣 - 「of」和「the」被過濾掉。這意味着不知何故SearchHandler不會調用正確的分析儀

查詢

http://ip:port/solr/collection1/select?q=*:*&rows=0&facet=true&facet.pivot=year,text

結果

[..] 
<lst name="facet_pivot"> 
    <arr name="year,text"> 
    <lst> 
     <str name="field">year</str> 
     <int name="value">2009</int> 
     <int name="count">139</int> 
     <arr name="pivot"> 
     <lst> 
      <str name="field">text</str> 
      <str name="value">of</str> 
      <int name="count">135</int> 
     </lst> 
     <lst> 
      <str name="field">text</str> 
      <str name="value">the</str> 
      <int name="count">135</int> 
     </lst> 
     <lst> 
      <str name="field">text</str> 
      <str name="value">and</str> 
      <int name="count">123</int> 
[..] 

Schema.xml的

<field name="year" type="int" indexed="true" stored="true" /> 
    <field name="text" type="text_en" indexed="true" stored="true" multiValued="true" /> 
    [..] 
    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
      <analyzer type="index"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPossessiveFilterFactory"/> 
      <filter class="solr.PorterStemFilterFactory"/> 
      </analyzer> 
      <analyzer type="query"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" /> 
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPossessiveFilterFactory"/> 
      <filter class="solr.PorterStemFilterFactory"/> 
      </analyzer> 
     </fieldType> 
+0

你能否詳細解釋爲什麼你的停用詞經常變化?我想知道是否需要在這裏採用不同的方法。 –

回答

1

是不是因爲您的查詢?

http://ip:port/solr/collection1/select?q=*:*&rows=0&facet=true&facet.pivot=year,text 

從我所看到的,你正在尋找的一切,所以這意味着它也會返回停用詞。我的意思是,如果查詢獲取傳遞到分析儀,過濾器類分析儀只看到

*:* 

的查詢,所以我不認爲它會從查詢字符串中刪除任何的方式。

如果您確實想搜索所有內容,但沒有任何停用詞,您可以嘗試使用negative query進行搜索。當然,如果你使用這個,你將需要一個不同的配置,它不會過濾查詢的任何停用詞,然後你可以手動將停用詞作爲否定查詢來過濾掉它們。所以你基本上搜索任何東西,但是忽略包含否定查詢的結果。

但是,一個簡單的方法(和根據我的意見更好的方式)來得到你想要的是實際上在字段配置中使用複製字段。但是這會增加你的索引大小。所以我們在這裏與我們的solr做的是,除了正常字段,我們還有其他語言字段,如text_en,text_de,text_es等。我們有一個語言檢測器,可以檢測語言,將字段複製到適當的語言,運行正確的停用詞過濾器。

如果需要,也可以在schema.xml中創建一個新字段text_en_filtered,並將text_en中的文本複製到那裏,並在那裏過濾停用詞。然後你可以在那個沒有任何停用詞的領域搜索。

<field name="text_en_filtered" type="text_en_filtered" indexed="true" stored="false" multiValued="false"/> 
<copyField source="text" dest="text_en_filtered"/> 
<fieldType name="text_en_filtered" class="solr.TextField" positionIncrementGap="100"> 
    ... // Analyzer with stopwords filtering here.. 
</fieldType> 
0

對不起,你的問題不清楚。 所以我猜測並試圖回答可能是你的問題。 下面是如何處理停用詞。如果您在索引時間內有<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />,Solr將不索引停用詞,並且您不會在結果構面中看到這些詞。此外,您需要在查詢時間內使用它來進行適當的匹配。

如果您在查詢期間有<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />,您只需在Solr執行查詢之前從查詢短語中刪除停用詞。

更新您對分析鏈的錯誤理解似乎是您混淆的原因。您的q參數爲「」,所以如果您在查詢期間有StopFilterFactory,如上所述,您將從查詢結果中過濾來自「」的停用詞詞彙。由於您在文本方面進行了分析,因此您的結果中仍然會出現停頓詞。您需要明白,查詢時間分析不在結果上,而是「QUERY」。您的「文本」仍然會顯示結果中會顯示的停用詞。在這種情況下,刪除客戶端不需要的結果會更好也更容易。

+0

我剛剛編輯了我的問題。我希望現在一切都清楚。我也嘗試瞭解你的答案,但我不完全清楚。 – Vilius

+0

好吧,將Stoppard過濾器從查詢移動到索引並重新索引。 – Arun

+0

正如我所指出的那樣,查詢時刪除停用詞對我至關重要。如果我在索引時間使用停用詞過濾器,那麼每次更改停用詞表時都必須重新索引。這不符合我的需求。 – Vilius

1

請參閱Solr郵件列表中的線程 - does solr support query time only stopwords?

這聽起來與您的要求非常相似,它們的解決方法是在索引時啓用stopFilterFactory,但是沒有指定停用詞文件以使其按預期工作。

+0

「而停止詞查詢返回0匹配」恕我直言,該解決方案不適用於這種情況,因爲StopFilter應用於查詢本身,因此爲什麼0匹配,(這不是面的情況..) –

0

恐怕你不得不重新編制索引,除非你可以深入分析代碼並在聚合過程之前將其過濾掉。 您可以通過將文檔設置爲僅針對包含新停用詞/的文檔進行重新索引來加速該過程。