search - Solr 停用词魔法

标签 search solr lucene solr4 stop-words

我的停用词没有按预期工作。 这是我的架构的一部分:

<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“This is the my 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”-> 返回“This is cool search engine”
搜索查询:“”-> 什么都不返回
搜索查询:“This coll”-> 返回“This is cool search engine”

问题 4:我在哪里可以找到停用词在 solr 中如何工作的详细说明(可能有示例)?因为它看起来像魔术。

最佳答案

问题 1 的答案:替换“KeywordTokenizerFactory”,因为它没有实际标记化,因此整个输入字符串保留为单个标记。改用 StandardTokenizerFactory。

或者使用下面的字段类型。

<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 的答案:是的。仅在 type="query"的分析器中添加 StopFilterFactory。这将阻止他们在索引时搜索而不是添加它们。

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

问题 2 的答案:您创建的自定义字段似乎不正确。文本必须首先使用分词器进行分词,但您首先使用过滤器。 用solr分析页面查看对它的分析。

关于search - Solr 停用词魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379159/

相关文章:

lucene - Nutch - 如何通过小块爬行?

java - 在 Lucene 中搜索句子并获得匹配的术语

javascript - 如何根据对象(而不是数组)的属性执行合并排序?

mysql - 如何处理 "questions that may already have your answer"?

java - 您建议如何过滤包含在巨大列表中定义的冒犯性词语的评论

solr 不标记 protected 单词

ruby-on-rails - 使用 'sunspot_rails' gem 更改 SOLR schema.xml 无效

java - 有人用过solr5.5吗? Mysql包应该放在哪个目录下?

apache - 安装 solr 和索引 mysql

php - 网站搜索的安全实现