奇怪的查询行为需要一些帮助来调试它

时间:2010-09-15 18:36:59

标签: lucene solr

以下是架构的有趣部分:

    <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> 

2 个答案:

答案 0 :(得分:0)

当我们查询“标题:哈利*”时,它实际上是一个短语搜索默认搜索字段。

这是如何处理它并被分配到默认搜索字段,在我的情况下是文本。  “用户名:哈里·”  “用户名:哈里·”  PhraseQuery(statusText:“用户名哈里”)  文字:“用户名哈里”

“Title:Potter *”将返回与“Title:Potter”相同数量的结果 这听起来非常奇怪,我猜两个都是0

我建议使用参数debugQuery = on来查看查询的确切解析方式。 “标题:哈利”正在返回结果,因为必须有包含该短语的文字。 希望这有帮助

答案 1 :(得分:0)

原因是LowerCaseFilterFactory和通配符查询的混合。在编制索引时,这(当然)会降低您所用字母中的所有字母 - 让“哈利”和“哈里”都匹配。

当您执行通配符查询时,例如“Harry *”,no analysis is done on the query terms - 即它不是小写的。只要您没有任何要求区分大小写的要求,您就可以通过降低客户端的查询来规避问题。