我的 SOLR 3.5 实例中有以下分析器链(尽管我们没有设置 luceneMatch 版本):
<fieldtype name="text_pt" class="solr.TextField"
positionIncrementGap="100" autoGeneratePhraseQueries="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" protected="protwords.txt" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
preserveOriginal="1" catenateWords="1" catenateNumbers="1"
catenateAll="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="false"
words="portugueseStopWords.txt" />
<filter class="solr.BrazilianStemFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" protected="protwords.txt" />
<filter class="solr.SynonymFilterFactory" ignoreCase="true"
synonyms="portugueseSynonyms.txt" expand="true" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="0" preserveOriginal="1" catenateNumbers="0"
catenateAll="0" protected="protwords.txt" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="false"
words="portugueseStopWords.txt" />
<filter class="solr.BrazilianStemFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</fieldtype>
注意我们是如何拥有autoGeneratePhraseQueries="false"的。
显然,这应该可以防止查询解析器在查找标点符号时生成短语查询。然而,这并没有发生。
查看 &debugQuery 的输出:
<str name="querystring">title_search_pt:(looking,for peugeot)</str>
<str name="parsedquery">+PhraseQuery(title_search_pt:"looking for") +title_search_pt:peugeot</str>
如您所见,尽管逗号被正确标记,但现在最终成为短语查询。很多人复制粘贴文本进行搜索(带有标点符号),在我的逻辑下,标点符号不应该意味着“用那个做一个短语查询”。
如何禁用/防止这种情况发生?
StandardTokenizer 完全理解点和逗号,并且仅在必要时拆分(保留主机名、数字等),因此在查询 SOLR 之前替换客户端上的所有标点符号不是一种选择,因为我会丢失一些重要信息。
谢谢