Lucene 增强多值字段

Lucene 增强多值字段,lucene,lucene.net,Lucene,Lucene.net,我有一组文档,其中包含我想要索引的评分项目。我们的数据结构如下所示: Document ID Text List<RelatedScore> RelatedScore ID Score 但是,计算的“范数”似乎适用于整个多字段-文档的所有RelatedScore“值最终将具有相同的分数 Lucene中是否有允许此功能的机制?我不想创建另一个索引来解释这一点-感觉应该有一种使用单个索引的方法。如果没有实现这一点的方法,我们必须补偿的一些想法是: 按降序插入多值字

我有一组文档,其中包含我想要索引的评分项目。我们的数据结构如下所示:

Document
  ID
  Text
  List<RelatedScore>

RelatedScore
  ID
  Score
但是,计算的“范数”似乎适用于整个多字段-文档的所有RelatedScore“值最终将具有相同的分数

Lucene中是否有允许此功能的机制?我不想创建另一个索引来解释这一点-感觉应该有一种使用单个索引的方法。如果没有实现这一点的方法,我们必须补偿的一些想法是:

  • 按降序插入多值字段项。然后以某种方式添加位置感知分析,为字段中的第一个项分配更高的提升/得分
  • 将高值分数多次添加到字段中。因此,分数==1的RelatedScore可能会添加三次,而分数==0.3的RelatedScore只会添加一次

  • 这两种情况都会导致这些字段的搜索保真度降低,是的,但它们可能已经足够好了。对此有何想法?

    这似乎是有效负载的一个使用案例。我不确定Lucene.NET中是否有此功能,因为我只使用了Java版本

    如果分数的绝对值没有那么重要,另一种方法是将它们离散化(根据值将它们放入桶中)并为每个bucket创建一个字段。因此,如果您的得分范围为1到100,则创建10个bucket,称为RelatedScore0\u 10、RelatedScore10\u 20等,对于在该bucket中包含RelatedScore的任何文档,在该字段中添加一个“true”值。然后,对于在OR查询上执行的每个搜索,如:

    (RelatedScore0_10:true^1 RelatedScore10_20:true^2 ...)
    

    这样做的好处是,您可以动态调整每个bucket的boost值。否则,您需要重新编制索引以更改每个字段的字段norm(boost)值。

    如果您使用Lucene.Net,您可能还没有有效负载功能。您可以做的是将0-100相关性分数从1-10转换为bucket(整数除以10),然后将每个索引值添加多次(但只存储一次值)。然后,如果搜索该字段,lucene内置的评分将考虑索引字段的频率(将根据相关性对其进行1-10次索引)。因此,结果可以按可变相关性排序

    foreach (var relatedScore in document.RelatedScores) {
      // get bucket for relevance...
      int bucket=relatedScore.Score / 10;
    
      var field = new Field("RelatedScore", relatedScore.ID,
                            Field.Store.YES, Field.Index.UN_TOKENIZED);
      luceneDoc.Add(field);
      // add more instances of field but only store the first one above...
      for(int i=0;i<bucket;i++)
      {
        luceneDoc.Add(new Field("RelatedScore", relatedScore.ID,
                            Field.Store.NO, Field.Index.UN_TOKENIZED));
      }
    } 
    
    foreach(文档中的var relatedScore.RelatedScores){
    //获取相关的桶。。。
    int bucket=relatedScore.Score/10;
    变量字段=新字段(“RelatedScore”,RelatedScore.ID,
    Field.Store.YES,Field.Index.UN_标记化);
    luceneDoc.Add(字段);
    //添加更多字段实例,但仅存储上面的第一个实例。。。
    
    for(int i=0;iI)能够使用有效负载存储分数,并通过自定义的相似性对象使用它。当我开始朝这个方向看时,我发现Grant Ingersoll最近在这里发布了一篇关于这个主题的文章:现在正确的链接是
    foreach (var relatedScore in document.RelatedScores) {
      // get bucket for relevance...
      int bucket=relatedScore.Score / 10;
    
      var field = new Field("RelatedScore", relatedScore.ID,
                            Field.Store.YES, Field.Index.UN_TOKENIZED);
      luceneDoc.Add(field);
      // add more instances of field but only store the first one above...
      for(int i=0;i<bucket;i++)
      {
        luceneDoc.Add(new Field("RelatedScore", relatedScore.ID,
                            Field.Store.NO, Field.Index.UN_TOKENIZED));
      }
    }