【发布时间】:2011-10-25 10:21:12
【问题描述】:
当我的查询中有特殊字符时,我得到了奇怪的结果。
这是我的要求:
q=histoire-france&start=0&rows=10&sort=score+desc&defType=dismax&qf=any^1.0&mm=100%
解析查询:
<str name="parsedquery_toString">+((any:histoir any:franc)) ()</str>
我有 17000 个结果,因为 Solr 正在执行 OR(应该是 AND)。
当我使用空格而不是特殊字符时,我没有问题:
q=histoire france&start=0&rows=10&sort=score+desc&defType=dismax&qf=any^1.0&mm=100%
<str name="parsedquery_toString">+(((any:histoir) (any:franc))~2) ()</str>
此查询的 2000 个结果。
这是我的 schema.xml(相关部分):
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.CommonGramsFilterFactory" words="stopwords_french.txt" ignoreCase="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_french.txt" enablePositionIncrements="true"/>
<filter class="solr.SnowballPorterFilterFactory" language="French" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!--<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>-->
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" preserveOriginal="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.CommonGramsFilterFactory" words="stopwords_french.txt" ignoreCase="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_french.txt" enablePositionIncrements="true"/>
<filter class="solr.SnowballPorterFilterFactory" language="French" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
</fieldType>
我什至尝试使用 PatternTokenizerFactory 对空格和特殊字符进行标记,但没有改变...
我目前的解决方法是在向 Solr 发送查询之前用空格替换所有特殊字符,但这并不令人满意。
编辑:即使使用 charFilter (PatternReplaceCharFilterFactory) 来用空格替换特殊字符,它也不起作用...
通过 solr admin 进行第一行分析,输出详细,查询 = 'histoire-france':
org.apache.solr.analysis.PatternReplaceCharFilterFactory {replacement= , pattern=([,;./\\'&-]), luceneMatchVersion=LUCENE_32}
text histoire france
'-' 被 ' ' 替换,然后由 WhitespaceTokenizerFactory 标记。但是,对于“histoire-france”和“histoire France”,我仍然有不同数量的结果。
我错过了什么吗?
【问题讨论】:
-
从 WhiteSpaceTOckenizer 更改为 PatternTokenizer 后,您是否重新索引数据?您需要重新索引数据以查看任何更改
-
你说你有
你能把它改成 重启 SOLR 并分享每个查询的结果数。如果我的猜测是真的,我稍后会给你更详细的解释。 -
我更改了 defaultOperator 并重新启动了 solr。不用找了。无论如何,我认为 Dismax 处理程序正在使用“mm”(最小匹配)参数而不是默认运算符。这里我的 mm=100% 与默认处理程序的 defaultOperator="AND" 相同。
-
如果我使用 mm=0% (defaultOperator="OR") 每个查询都有 17000 个结果
-
我认为 DISMAX 在构建查询时并不关心 defaultOperator,它将“histoire-france”视为一个单词,将“histoire france”视为两个单独的单词。抱歉,我帮不上忙。
标签: solr lucene tokenize dismax