2015-03-31 34 views
0

我的停用詞不按預期工作。 這裏是我的架構的一部分:Solr無用詞魔術

<fieldType name="text_general" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType class="solr.TextField" name="text_auto"> 
    <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false"/> 
    </analyzer> 
    <analyzer type="query"> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/> 
    </analyzer> 
</fieldType> 

<field name="deal_title_terms" type="text_auto" indexed="true" stored="false" required="false" multiValued="true"/> 

<field name="deal_description" type="text_general" indexed="true" stored="true" required="false" multiValued="false"/> 

在stopWords.txt中,我接下來的話:在,是一個;
我也有我的領域下一個數據:

deal_description - 這是我的描述
deal_title_terms - 這是處理標題條款(將在條款分裂)

當我嘗試搜索deal_description :
例1:「deal_description:他是第m」 - 我希望這份文件與deal_description「這是我的描述」將返回
例2:「deal_description:是個」 - 我希望不hing會被發現,因爲「is」和「the」是停用詞。

當我嘗試搜索deal_title_terms:
例1:「deal_title_terms:」 - 我想,沒有什麼會被發現,因爲「是」是停用詞。
示例2:「deal_title_terms:是交易」 - 我預計「is」和「the」將被忽略,術語「deal」將被找到。
示例3:「deal_title_terms:標題條款」 - 我預計「a」將被忽略,術語「標題詞」將被找到。

問題1:爲什麼停用詞不適用於「deal_description」字段?
問題2:爲什麼現場「deal_title_terms」禁用詞對我的查詢不會被刪除(當我試圖找到標題條款它不會找到「稱號條款」一詞)
問題3:有什麼辦法在搜索結果中顯示停用詞,但阻止他們搜索?例如:

數據:這是很酷的搜索引擎
搜索查詢: 「爲COO」 - >回報 「這是酷搜索引擎」
搜索查詢: 「」 - >返回任何
搜索查詢:「這科爾」 - >回報「這是酷搜索引擎」

問題4:在哪裏可以找到詳細的描述(可能與示例)禁用詞是如何工作的solr?因爲它看起來很神奇。

+0

要觀察您的查詢會發生什麼,可以使用solr管理頁面:http:// yourWebsite:8983/solr /#/ yourCore/analysis。把你的查詢和clic分析值。 – alexf 2015-04-01 07:28:52

+0

我正在使用這個工具。使用這個工具,我發現查詢分析器從我的查詢中刪除了停用詞,但是我仍然能夠找到「the」,「is」等等。如果我的停用詞僅用於查詢分析器。 – 2015-04-01 07:37:28

+0

你用來查詢的字段是什麼? – alexf 2015-04-01 07:46:40

回答

1

對問題1的回答:替換「KeywordTokenizerFactory」,因爲它沒有實際的標記,因此整個輸入字符串保存爲單個標記。改爲使用StandardTokenizerFactory。

或者使用下面的fieldType。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
<tokenizer class="solr.StandardTokenizerFactory"/> 
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
<analyzer type="query"> 
<tokenizer class="solr.StandardTokenizerFactory"/> 
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

停用詞將按預期的方式用於「deal_description」字段。

對問題3的回答:是的。僅在類型=「query」的分析器中添加StopFilterFactory。它會阻止他們搜索,而不會在索引時添加它們。

答到Quesion 4:https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

答到Quesion 2:您創建的自定義字段似乎不正確。文本必須首先使用標記器進行標記,但首先使用濾鏡。 使用solr分析頁面查看分析結果。

+1

我無法使用KeywordTokenizerFactory。我的搜索(像這個字段:*這是我的搜索*)將無法使用這個過濾器,因爲它看起來像它分割字符串的空格。此頁面https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters沒有停用詞的詳細說明。 – 2015-04-01 15:08:53