代码之家  ›  专栏  ›  技术社区  ›  Amit

使用Edge N Gram analyzer和char filter创建analyzer,后者用新行替换空格

  •  1
  • Amit  · 技术社区  · 6 年前

    我收到了以下类型的短信。 foo bar , hello world 等。 我使用Edge NGram标记器创建了一个分析器,并使用它在标记下面创建的analyze 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”传递给方法 令牌流 foo酒吧 .

    这导致返回的令牌不匹配 分析 添加一个char过滤器,该过滤器移除文本中的空格,并对文本中的各个术语应用Edge NGram标记器。

    所以,在 例如,它应该创建下面的标记。当我打电话 令牌流 方法。

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

    我尝试将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 就像它一样。也请让我知道我的代码分析器是否正确?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Val    6 年前

    使用analyze API测试的是 edge-ngram token filter edge-ngram tokenizer .

    EdgeNGramTokenizer 通过 EdgeNGramTokenFilter