计算Solr中多值文本字段的完整匹配

时间:2014-10-01 12:48:09

标签: solr information-retrieval

我根据他们撰写的文本文档有一个人的索引。这是字段类型:

    <fieldtype name="TField" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
        <analyzer>
           <tokenizer class="solr.StandardTokenizerFactory"/>
           <filter class="solr.LowerCaseFilterFactory" />
           <filter class="solr.StopFilterFactory" />
           <filter class="solr.PorterStemFilterFactory" />
           <filter class="solr.PositionFilterFactory" />
        </analyzer>
    </fieldtype>

现场声明本身:

    <field name="Publication"             type="TField"           indexed="true"          stored="true"   multiValued="true" />

请求处理程序配置:

    <requestHandler name="/select/" class="solr.StandardRequestHandler" default="true" >
        <lst name="defaults" >
          <str name="defType">edismax</str>
          <str name="qf">Publication</str>
          <str name="fl">ID,score</str>
          <str name="q.alt">*:*</str>
          <str name="rows">10</str>
        </lst>
    </requestHandler>

理想情况是处理文本查询并返回评分文本查询匹配的出版物数量的人。例如:

人A有三个文件,内容为“猫狗鼠标”,“猫狗屋”,“香蕉”

B人有三个文件,内容为“猫狗”,“猫”,“狗”

人C有两个文件,内容为“cat”,“dog”,“banana”

如果文本查询是“猫狗”,我希望人A在评分2(匹配“猫狗鼠标”,“猫狗屋”)中排名第一,人B在评分1中排名第二(匹配“猫狗鼠标“)和人物C根本不归还。

我目前的实施未能在两个方面做到这一点。首先,它返回Person C,因为Solr似乎将multiValued字段的内容变成了一个,所以cat和dog出现在Person A的单独的Publication条目中的事实似乎并不重要。

其次,与第一个强烈相关,文档的评分是TF-IDF,基于Publication字段中所有值的串联内容。因此,A和B人最终得分相同,因为猫和狗在整个文档语料库中出现的次数相同。

有没有办法实现我想要的?更一般地说,有没有办法根据匹配multiValued字段的各个条目而不是将所有条目作为一个整体来对文档进行评分?

1 个答案:

答案 0 :(得分:1)

经过大量的谷歌搜索后,似乎对于评分和检索目的,在multiValued字段中具有多个条目并且单个条目是值的串联是等效的。我们通过创建一个自己编写的文档的索引,然后搜索该索引并面向作者来部分地解决了我们特定情况的问题。这将根据他们撰写的相关文档的数量生成一份作者列表。此解决方案绝不是完美的,并且存在许多问题,例如不知道可用结果的总数(因为您无法计算方面的条目数),或者无法对作者执行更复杂的过滤

我以为我分享了我的死路。