2014-10-01 76 views
1

我有基于他们已撰写的文本文档的人员索引。这是字段类型:计算Solr中多值文本字段的完整匹配

<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> 

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

某甲与内容“猫狗鼠”,“猫狗之家”,“香蕉”

某乙有内容“猫狗鼠”,“猫”三个文件三个文件, “狗”

人C有内容“猫”,“狗”,“香蕉”

如果文本查询是“猫狗”两个文件,我想人一个是顶部比分2 (匹配“猫狗老鼠”,“猫狗屋”),与得分1(匹配“猫狗老鼠”)和Person C完全不归还的人B。

我目前的实现无法在两个方面做到这一点。首先,它返回Person C,因为Solr似乎将multiValued字段的内容合并为一个,所以猫和狗出现在单独的A出版物条目中似乎并不重要。

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

有什么方法可以实现我在找的东西吗?更一般地说,有没有办法根据匹配multiValued字段的单个条目对文档进行评分,而不是将所有条目作为一个整体进行评分?

回答

1

经过大量的使用Google搜索之后,似乎出于评分和检索的目的,在多值字段中有多个条目并且这些值串联起来的单个条目是等效的。我们通过创建自己创作的文档索引,然后搜索该索引并为作者创作版面,部分解决了我们特定情况下的问题。这产生一个作者列表,按照他们撰写的相关文档的数量排序。这个解决方案并不完美,并且存在许多问题,例如不知道可用结果总数(因为您无法计算方面的条目数量),或者无法对作者执行更复杂的过滤。

想到我会分享我的死胡同。