【问题标题】:Solr: Cannot correctly tokenize query termsSolr:无法正确标记查询词
【发布时间】:2014-05-02 13:33:58
【问题描述】:

我为特定字段类型的查询和索引设置了以下分析器。它应该拆分诸如 "java/cpp" => "java" "cpp" 之类的术语,即由于我在 schema.xml 中定义的 PatternTokenizer 而产生的 2 个令牌。这在索引时正确应用,但在查询时不正确。在 Solr 中使用分析仪 GUI 测试仪进行测试,它似乎工作正常。这是分析器链的开始:

<analyzer type="query">

        <!-- Collapse hyphens around alpha words -->
        <charFilter class="solr.PatternReplaceCharFilterFactory"
                    pattern="([a-zA-Z])(-+)([a-zA-Z])"
                    replacement="$1$3"/>
        <charFilter class="solr.PatternReplaceCharFilterFactory"
                    pattern="([0-9])(,)([0-9])"
                    replacement="$1$3"/>

        <!-- Else Split on hyphens (numbers, etc), plus other splitable chars -->
        <tokenizer class="solr.PatternTokenizerFactory" pattern="([\\*/\),\(\-]|\s)+" />
        ...........
</analyzer>

如果我发送如下查询:

http://mysolrserver.com/solr/core1/select?q=java%2Fcpp&rows=2&fl=score%2Ctitle%2Ccity&df=title&wt=xml&indent=true&debugQuery=true&defType=edismax&qf=title&tie=1.0

其中 q(查询)参数设置为:java/cpp(无引号),并且查询字段 (qf) 指向该字段类型(标题)的字段,debugQuery 选项在响应中显示以下内容:

<lst name="debug">
  <str name="rawquerystring">java/cpp</str>
  <str name="querystring">java/cpp</str>
  <str name="parsedquery">(+DisjunctionMaxQuery((title:"java cpp")~1.0))/no_coord</str>
  <str name="parsedquery_toString">+(title:"java cpp")~1.0</str>

因此,尽管我发送的查询中省略了引号,但它似乎将 java/cpp 作为短语查询发送。它似乎正在应用我的 schema.xml 中的其他分析器转换,但它似乎没有适当地标记查询中的单词。由于上面定义的 PatternTokenizerFactory,它应该将其分为两个术语。难道我做错了什么?

【问题讨论】:

  • 为什么这被否决了?这对我来说是个大问题。如果有人投反对票,请让发帖者知道原因,以便他们了解原因并从中学习。

标签: java solr lucene information-retrieval solr4


【解决方案1】:

原来我将 fieldtype 节点的 autoGeneratePhraseQueries 属性设置为 true。这会为分词器拆分的术语生成短语。这不是我想要的。将此设置为 false 可解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多