我在Windows上使用Solr 1.4.1(lucene 2.9.3)并且我试图了解ShingleFilter。我编写了以下代码,发现如果我提供的字数多于字段中索引的实际短语,那么对该字段的搜索将失败,即debugQuery = true时该字段没有得分。
以下是我创建的一个示例,其中包含字段名称和索引的文档:
Id:1
title_1:Nina Simone
title_2:我给你施了一个咒语
发出以下查询(dismax):
- “Nina Simone I put”< - 没有得到title_1搜索的分数(使用debugQuery)
- “Nina Simone”< - SUCCESS
试图分析上述差异,当我使用Solr的场分析和'shingle'字段(下面给出)并尝试“Nina Simone I put”时,它成功了。因此,仅在查询期间不提供分数。我还检查了'parsedquery',它显示了disjunctionMaxQuery向title_1字段发出字符串“Nina_Simone Simone_I I_put”。
title_1和title_2字段的类型为“shingle”,定义为:
<fieldType name="shingle" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/>
</analyzer>
</fieldType>
请注意,我还有一个catchall字段,它是文本。我有qf设置为:'id ^ 2 catchall ^ 0.8'和pf设置为:'title_1 ^ 1.5 title_2 ^ 1.2'
我有什么遗漏或做错了吗?
答案 0 :(得分:0)
在dismax查询中,查询的分数是子查询的最大值。不是总和。我真的不太了解它是如何稀疏的查询,但如果它做了类似“(title1:(shingle1 shingle2 ...))(title2:(shingle1 shingle2 ...))”那么你应该期待看到只有一个字段有助于得分。