代码之家  ›  专栏  ›  技术社区  ›  James Kolpack

增强多值字段

  •  4
  • James Kolpack  · 技术社区  · 15 年前

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

    Document
      ID
      Text
      List<RelatedScore>
    
    RelatedScore
      ID
      Score
    

    我的第一个想法是将每个RelatedScore添加为一个多值字段,使用字段的Boost属性在搜索时修改特定分数的值。

    foreach (var relatedScore in document.RelatedScores) {
      var field = new Field("RelatedScore", relatedScore.ID,
                            Field.Store.YES, Field.Index.UN_TOKENIZED);
      field.SetBoost(relatedScore.Score);
      luceneDoc.Add(field);
    }
    

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

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   bajafresh4life    15 年前

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

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

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

    这样做的好处是,您可以动态调整每个桶的提升值。否则,您需要重新索引以更改每个字段的字段规范(boost)值。

        2
  •  0
  •   Bob Bob    15 年前

    如果您使用Lucene.Net,您可能还没有有效负载功能。您可以做的是将0-100的相关性得分从1-10(整数除以10)转换为一个bucket,然后将每个索引值添加多次(但只存储一次)。然后,若您搜索该字段,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));
      }
    }