当我的查询中有特殊字符时,我得到了奇怪的结果。Solr Dismax处理程序 - 空格和特殊字符行为
这里是我的要求:
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>
因为Solr的是做一个OR(应和)我已经得到了17000分的结果。
我没有问题,当我使用的,而不是一个特殊字符一个空白:
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管理分析的第一行,用详细输出,查询='史-法国”:
org.apache.solr.analysis.PatternReplaceCharFilterFactory {replacement= , pattern=([,;./\\'&-]), luceneMatchVersion=LUCENE_32}
text histoire france
在 ' - ' 所取代 '',然后通过WhitespaceTokenizerFactory记号化。不过,对于'histoire-france'和'histoire france',我仍然有不同的结果。
我错过了什么吗?
你重新索引数据?你需要重新索引数据才能看到任何变化 – Dorin
是的我重新编制了数据 –
你说你有你可以改变它为 restart SOLR并分享每个查询的结果数量。如果我猜这是真的,我会在稍后给你更详细的解释。 –
Dorin