以下是架构的有趣部分:
<fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
<filter class="solr.ASCIIFoldingFilterFactory" />
</analyzer>
</fieldType>
我使用此fieldType获得了一个名为Title的字段,以及一些标题包含“Harry Potter”的产品
查询:“标题:哈利*”将返回0结果,而“标题:哈利”将返回很多。 但问题是“标题:波特*”将返回与“标题:波特”相同数量的结果
那么为什么“Title:Harry *”没有返回任何结果?
编辑:我找到了一个使用查询的解决方法:'标题:“哈利*”' (注意使用“)
这是查询标题的调试:Harry,标题:Harry *,标题:“Harry *”
名称:哈利
<str name="rawquerystring">Title:Harry</str>
<str name="querystring">Title:Harry</str>
<str name="parsedquery">Title:harri</str>
<str name="parsedquery_toString">Title:harri</str>
标题:哈利*
<str name="rawquerystring">Title:Harry*</str>
<str name="querystring">Title:Harry*</str>
<str name="parsedquery">Title:Harry*</str>
<str name="parsedquery_toString">Title:Harry*</str>
标题: “哈里*”
<str name="rawquerystring">Title:"Harry*"</str>
<str name="querystring">Title:"Harry*"</str>
<str name="parsedquery">Title:harri</str>
<str name="parsedquery_toString">Title:harri</str>
答案 0 :(得分:0)
当我们查询“标题:哈利*”时,它实际上是一个短语搜索默认搜索字段。
这是如何处理它并被分配到默认搜索字段,在我的情况下是文本。 “用户名:哈里·” “用户名:哈里·” PhraseQuery(statusText:“用户名哈里”) 文字:“用户名哈里”
“Title:Potter *”将返回与“Title:Potter”相同数量的结果 这听起来非常奇怪,我猜两个都是0
我建议使用参数debugQuery = on来查看查询的确切解析方式。 “标题:哈利”正在返回结果,因为必须有包含该短语的文字。 希望这有帮助
答案 1 :(得分:0)
原因是LowerCaseFilterFactory和通配符查询的混合。在编制索引时,这(当然)会降低您所用字母中的所有字母 - 让“哈利”和“哈里”都匹配。
当您执行通配符查询时,例如“Harry *”,no analysis is done on the query terms - 即它不是小写的。只要您没有任何要求区分大小写的要求,您就可以通过降低客户端的查询来规避问题。