solr - SOLR - 在查询时被忽略的停用词
问题描述
我配置了一个在索引时间和查询时间都使用停用词的字段类型。但是,当我使用分析器分析此字段类型时,我看到这些停用词仅从索引端删除,而不是在查询端删除。这是 managed_schema 文件中的字段类型:
<fieldType class="solr.TextField" name="stopwords_test" stored="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="1"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
解决方案
您在KeywordTokenizer
查询端使用 a 。KeywordTokenizer 什么都不做 - 即它不拆分输入字符串输入多个标记。停止过滤器适用于标记,并且由于现在整个输入字符串是一个大标记,因此没有任何标记与停用词列表匹配。
给定,这将在由:和索引时the input string
分成三个标记。通常会被视为停用词并被删除,最终您会在索引中找到and 。StandardTokenizer
the
input
string
the
input
string
当您查询和输入 时the input string
,KeywordTokenizer 除了将所有内容保存为单个标记外,什么都不做,因此 StopFilter 只看到the input string
. 这不匹配任何停用词(除非您将整个字符串本身作为停用词),并且不会删除任何内容。
StandardTokenizer
如果这是您想要的行为,或者WhitespaceTokenizer
可能是不错的选择,您将不得不使用 Tokenizer 将字符串拆分为单独的标记。
推荐阅读
- java - 如何解决 401 - 在 springboot 2 web 应用程序中未经授权
- node.js - GCS 设置更改后 Cloud Build 一直失败
- angular - Angular 不会从 json 服务更新模型
- python - 在python中格式化
- angularjs - 过滤以从表 AngularJS 中删除一些数据
- autotools - 根据编译器动态更改“configure --help”字符串
- jquery - 如何在自定义 HTML 属性中包含带有样式的 HTML
- java - Java,将日志记录委托给不同的类是一种不好的做法吗?
- laravel-5 - 存储功能在 Laravel 中不起作用
- ios - 在 iOS 自定义键盘上隐藏键盘快捷键栏