Ale*_*lka 3 lucene search solr stop-words solr4
我的停用词没有按预期工作。这是我的架构的一部分:
<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"/>
Run Code Online (Sandbox Code Playgroud)
在 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:标题 a 条款” - 我预计“a”将被忽略,并且会找到术语“标题条款”。
问题 1:为什么停用词不适用于“deal_description”字段?
问题 2:为什么我的查询中“deal_title_terms”字段的停用词没有被删除?(当我尝试查找标题术语时,它不会找到“标题术语”术语)
问题 3:有没有办法在搜索结果中显示停用词,但是阻止他们搜寻?例子:
数据:这是很酷的搜索引擎
搜索查询:“ is coo ” -> 返回“这是很酷的搜索引擎”
搜索查询:“ is ” -> 不返回任何内容
搜索查询:“ This coll ” -> 返回“这是很酷的搜索引擎” ”
问题 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>
Run Code Online (Sandbox Code Playgroud)
对于“deal_description”字段,停用词将按预期工作。
问题 3 的回答:是的。仅在 type="query" 的分析器中添加 StopFilterFactory。它将阻止他们搜索并且在索引时不添加它们。
问题 4 的答案:https ://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
问题 2 的回答:您创建的自定义字段似乎不正确。必须首先使用标记器对文本进行标记,但您首先使用过滤器。通过solr分析页面查看其分析。