一尘不染

使用Edge N Gram分析器和char过滤器创建分析器,用新行替换空间

elasticsearch

我有以下类型的文本中来了。 foo barhello world等我使用边缘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 bar。

这会导致 分析 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事实如此。还请让我知道我的分析器代码是否正确?


阅读 258

收藏
2020-06-22

共1个答案

一尘不染

您使用分析API测试的是edge-ngram
令牌过滤器
,它不同于edge-ngram
令牌生成器

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

2020-06-22