0

我的经验与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 和正常查询上失败。

我会错过什么?

4

1 回答 1

0

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

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

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

将 copyfield 作为 copyfield 标签的来源是行不通的。
copyfield 源必须是一个实际的字段,它有一些值并且没有级联。

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

于 2013-06-25T05:17:14.847 回答