Solr停用词的魔法

3
我的停用词没有按预期工作。 以下是我的架构的一部分:
<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文件中,我有以下单词:the、is、a;同时,在我的字段中有以下数据:
deal_description - 这是我的描述 deal_title_terms - 这是交易标题的术语(将被分成术语)
当我尝试搜索deal_description时: 示例1:“deal_description:his is the m” - 我期望返回带有deal_description“这是我的描述”的文档。 示例2:“deal_description:is th” - 我期望没有找到任何内容,因为“is”和“the”是停用词。
当我尝试搜索deal_title_terms时: 示例1:“deal_title_terms:is” - 我期望没有找到任何内容,因为“is”是停用词。 示例2:“deal_title_terms:is the deal” - 我期望忽略“is”和“the”,并且能够找到术语“deal”。 示例3:“deal_title_terms:title a terms” - 我期望忽略“a”,并且能够找到术语“title terms”。
问题1:为什么停用词对于“deal_description”字段无效? 问题2:为什么在“deal_title_terms”字段中,停用词没有从我的查询中删除?(当我尝试查找title a terms时,它不会找到“title terms”术语) 问题3:是否有任何方法可以在搜索结果中显示停用词,但防止它们被搜索?例如: 数据:这是很酷的搜索引擎 搜索查询:“is coo” -> 返回“这是很酷的搜索引擎” 搜索查询:“is” -> 返回空 搜索查询:“This coll” -> 返回“这是很酷的搜索引擎”
问题4:我在哪里可以找到详细描述(可能带有示例),说明停用词在solr中的工作原理?因为它看起来像魔法。

要观察查询的情况,您可以使用Solr管理页面:http://yourWebsite:8983/solr/#/yourCore/analysis。输入您的查询并点击分析值。 - alexf
我正在使用这个工具。通过这个工具,我发现停用词已经被查询分析器从我的查询中删除,但我仍然能够找到“the”、“is”等单词。这种情况只会在我的查询分析器中有停用词的情况下出现。 - Alex Sylka
你用来查询的字段是什么? - alexf
我正在使用带有注释的stopFilterFactory,将“deal_title_terms”用于分析器类型=“index”。在重新启动solr并重新索引数据后,我能够找到像“the”这样的字符串。http://postimg.org/image/ixl40cspp/ - Alex Sylka
如果您正在使用edismax查询解析器,则可以进行仅停用词搜索-这是为了解决“生存还是毁灭”的难题。 - David George
1个回答

5

回答问题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即可。这将防止它们在搜索时被添加,而不是在索引时添加它们。

问题4的答案:https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

问题2的答案:您创建的自定义字段似乎不正确。必须先使用标记器对文本进行标记化,但您却首先使用了过滤器。请使用solr分析页面检查其分析情况。


2
我无法使用KeywordTokenizerFactory。我的搜索(类似于field:this is my search)将无法与此过滤器一起使用,因为它似乎会通过空格拆分字符串。这个页面https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters没有停用词的详细描述。 - Alex Sylka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接