2015-03-31 122 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