【问题标题】:solr: string field does not yield partial match result using qf parametersolr:使用 qf 参数的字符串字段不会产生部分匹配结果
【发布时间】:2013-06-24 19:28:20
【问题描述】:

我的经验与http://lucene.472066.n3.nabble.com/string-field-does-not-yield-exact-match-result-using-qf-parameter-td4060096.html相反

当我将 'qf' 添加到 dismax 查询时,除非完全匹配,否则我不会得到任何结果。

我使用 NGramFilterFactory 如下:

 <fieldType name="text_edgengrams" class="solr.TextField">
   <analyzer type="index">
     <tokenizer class="solr.LowerCaseTokenizerFactory"/>
     <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15"/>
   </analyzer>
   <analyzer type="query">
     <tokenizer class="solr.LowerCaseTokenizerFactory"/>
   </analyzer>
 </fieldType>

 ...


 <field name="text_ngrams" type="text_edgengrams" indexed="true" stored="false" multiValued="true" />

 ...

 <field name="domain" type="string" indexed="true" stored="true"/>

 ...

 <copyField source="domain" dest="text_ngrams"/>

如果我将 yengas.com 编入索引,我可以搜索 yengas.com 但不能搜索 yengas。但是,如果我放弃 'qf',我可以搜索 yengas。

搜索示例:

 $ curl "http://localhost:8282/solr/links/select?q=domain:yengas&wt=json&indent=on&fl=id,domain,score"
 => "response":{"numFound":0,"start":0,"docs":[]


 $ curl "http://localhost:8282/solr/links/select?q=domain:yengas.com&wt=json&indent=on&fl=id,domain,score"
 => "response":{"numFound":3,"start":0,"docs":[]

 $ curl "http://localhost:8282/solr/links/select?defType=dismax&q=yengas&qf=domain^4&pf=domain&ps=0&fl=id,domain,score"
 => "response":{"numFound":0,"start":0,"docs":[]


 $ curl "http://localhost:8282/solr/links/select?defType=dismax&q=yengas.com&pf=domain&ps=0&fl=id,domain,score"
 => "response":{"numFound":3,"start":0,"docs":[]

dismax 和正常查询时部分匹配失败。

我可能会错过什么?

【问题讨论】:

  • 看起来部分匹配不适用于原始字段,但复制到字段。这工作$ curl "http://localhost:8282/solr/links/select?q=text_ngrams:yengas&amp;wt=json&amp;indent=on&amp;fl=id,domain,score"

标签: solr solr4 dismax


【解决方案1】:

CopyField 不会更改原始字段。
同样,复制字段不会将原始分析应用于已复制字段。

文档@http://wiki.apache.org/solr/SchemaXml#Copy_Fields

复制是在流源级别完成的,没有复制馈送到另一个副本。

将复制域作为复制域标记的来源不起作用。
copyfield 源必须是一个实际的字段,它有一些值并且没有级联。

所以原始和复制字段将按照定义运行,在您的情况下是字符串和 ngram。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多