Lucene/Solr 测试不一致的endOffset

Lucene/Solr Test inconsistent endOffset

我正在使用 BaseTokenStreamTestCase 执行一些测试...针对自定义 TokenFilter。

测试以无法解释的方式失败。 您可以从我的调试输出中看到,它所抱怨的令牌的 endOffset 为 17...

不一致的 endOffset 1 pos=1 posLen=1 token=hello 预期:<11> 但实际是:<17>

   original: wheel chair hello there foo bar
  increment:      1        1     1      1   
     tokens: wheel chair hello there foo bar
  positions: ----------- ----- ----- -------
    lengths:      2        1     1      2   
   sequence:      1        2     3      4   
             0123456789012345678901234567890
                      10        20        30
  start-end: 1:[0-11], 2:[12-17], 3:[18-23], 4:[24-31]

测试代码如下:

assertAnalyzesTo(analyzer, input,
        new String[] {"wheel chair", "hello", "there", "foo bar"},
        new int[] {0, 12, 18, 24},  // start offsets
        new int[] {11, 17, 23, 31}, // end offsets
        null,                       // types
        new int[] {1, 1, 1, 1},     // positionIncrement
        new int[] {2, 1, 1, 2});    // positionLength

为什么它认为第二个标记应该在 11 结束?

BaseTokenStreamTestCase 正在从以下来源生成错误: ...在第 248 行附近

  final int endPos = pos + posLength;

  if (!posToEndOffset.containsKey(endPos)) {
    // First time we've seen a token arriving to this position:
    posToEndOffset.put(endPos, endOffset);
    //System.out.println("  + e " + endPos + " -> " + endOffset);
  } else {
    // We've seen a token arriving to this position
    // before; verify the endOffset is the same:
    //System.out.println("  + ve " + endPos + " -> " + endOffset);
    assertEquals("inconsistent endOffset " + i + " pos=" + pos + " posLen=" + posLength + " token=" + termAtt, posToEndOffset.get(endPos).intValue(), endOffset);
  }

因为 endPos 被计算为 pos + posLength 测试假设 posToEndOffset.get(endPos)将return当前代币位置+长度的结束位置偏移量。

这意味着它的预读 1 个令牌,因为第一个令牌有一个 length = 2
这就是测试失败的原因。长度使用不当。

length 属性 设置为默认值 1 更正了测试错误。