Solr - 使用两个或更多单词搜索仅使用第一个单词进行评分

时间:2014-05-11 15:33:16

标签: search solr

当我发出查询时

q=fulltext:marina zadar

Solr仅使用“marina”一词来计算文档分数。如果我禁用索引术语频率和位置,则包含单词和仅包含单词“marina”的文档的文档的分数都相同。

这是我使用下面的请求处理程序

<requestHandler name="/select" class="solr.SearchHandler">
    <lst name="defaults">
        <str name="echoParams">explicit</str>
        <int name="rows">100</int>
        <str name="df">title</str>
     </lst>
</requestHandler>

当我将另一个请求处理程序定义为

<requestHandler name="/full" class="solr.SearchHandler">
    <lst name="defaults">
        <str name="echoParams">explicit</str>
        <int name="rows">100</int>
        <str name="df">fulltext</str>
    </lst>
</requestHandler>

并以

的形式向该处理程序发出查询
q=marina zadar

一切正常 - 包含两个搜索词的文档按预期得分更高。

为什么使用q=fulltext:marina zadar处理程序时,查询/select的评分文档与其他示例不同?

这是我的schma.xml

<schema name="example" version="1.5">

<fields>

    <field name="_version_" type="long" indexed="true" stored="true"/>
    <field name="id" type="long" indexed="true" stored="true" required="true" />
    <field name="name" type="string" indexed="true" stored="true" />
    <field name="subName" type="string" indexed="false" stored="true" />
    <field name="nearName" type="string" indexed="false" stored="true" />
    <field name="countryName" type="string" indexed="false" stored="true" />
    <field name="title" type="text_general_edge_ngram" indexed="true" stored="false" multiValued="true" />
    <field name="fulltext" type="text_general" indexed="true" stored="true" />

</fields>

<uniqueKey>id</uniqueKey>

<copyField source="name" dest="title" />
<copyField source="subName" dest="title" />

<!--<similarity class="com.pocketsail.solr.DescriptionSimilarity" />-->

<types>

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>

    <fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.LowerCaseTokenizerFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.LowerCaseTokenizerFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" omitNorms="true" omitTermFreqAndPositions="true">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
    </fieldType>

</types>

</schema>

1 个答案:

答案 0 :(得分:4)

事实证明,这些词需要括在括号中。如果我发出

  

q =全文:( marina zadar)

两个单词用于文档评分,结果按预期排序。发布q=fulltext:marina zadar会查找&#34; marina&#34;在全文中&#39;指定的字段和单词&#34; zadar&#34;在字段中,该字段设置为solrconfig.xml中使用的查询处理程序的默认值。

这可能是一个新手错误,但也许它将来会帮助某人。