1

我输入了以下类型的文本。 foo bar等等hello world。我使用 Edge NGram 标记器创建了一个分析器,并使用它在标记下创建的分析 api。

{
  "tokens": [
    {
      "token": "f",
      "start_offset": 0,
      "end_offset": 1,
      "type": "word",
      "position": 1
    },
    {
      "token": "fo",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 2
    },
    {
      "token": "foo",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 3
    },
    {
      "token": "b",
      "start_offset": 4,
      "end_offset": 5,
      "type": "word",
      "position": 4
    },
    {
      "token": "ba",
      "start_offset": 4,
      "end_offset": 6,
      "type": "word",
      "position": 5
    },
    {
      "token": "bar",
      "start_offset": 4,
      "end_offset": 7,
      "type": "word",
      "position": 6
    }
  ]
}

但是,当我在我的代码中将文本“foo bar”传递给方法tokenStream时,它会为foo bar创建下面的标记。

f, fo, foo, foo , foo b, foo ba, foo 酒吧。

这导致分析api 返回的令牌不匹配。我想知道如何添加一个 char 过滤器来删除文本中的空格并将 Edge NGram 标记器应用于文本中的各个术语。

因此,在foo bar示例中,它应该创建下面的令牌。当我调用tokenStream方法时。

f,fo,foo,b,ba,bar。

我尝试将 char 过滤器添加到我的创建分析器的 java 代码中。下面是它的代码。

@Override
    public TokenStream tokenStream(String fieldName, Reader reader) {
        NormalizeCharMap normalizeCharMap = new NormalizeCharMap();
        normalizeCharMap.add(" ", "\\u2424");
        Reader replaceDots = new MappingCharFilter(normalizeCharMap, reader);
        TokenStream result = new EdgeNGramTokenizer(replaceDots, EdgeNGramTokenizer.DEFAULT_SIDE, 1, 30);
        return result;
    }

但它lu2424就像它一样。另外请让我知道我的分析器代码是否正确?

4

1 回答 1

2

您使用分析 API 测试的是edge-ngram token filter,它与edge-ngram tokenizer不同。

在您的代码中,如果您希望代码中的行为与使用分析 API 测试的行为相同,则需要替换EdgeNGramTokenizer为。EdgeNGramTokenFilter

于 2018-08-20T11:49:44.167 回答