【问题标题】:Create analyzer with Edge N Gram analyzer and char filter which replaces space with new line使用 Edge N Gram 分析器和 char 过滤器创建分析器,用新行替换空格
【发布时间】:2019-01-26 12:57:49
【问题描述】:

我输入了以下类型的文本。 foo barhello 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 bar。

这导致 analyze api 返回的令牌不匹配。我想知道如何添加一个删除文本中空格的字符过滤器,并在文本中的各个术语上应用 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。另外请让我知道我的分析器代码是否正确?

【问题讨论】:

    标签: java elasticsearch lucene tokenize elasticsearch-analyzers


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。但是你的意思是在你的第一行中,我使用了标记器而不是标记过滤器,我需要用 edgeN gram 过滤器替换它?
    • 您想要的是一个边缘-ngram 标记过滤器(您使用分析 API 测试的),但您在代码中使用的是边缘-ngram 标记器。看我的第二句话
    • 但是analyze api应该使用我创建的分析器,并且在我的代码中我使用了edge-ngram标记器而不是过滤器,那么它怎么会给出过滤器的响应呢?我没有得到。
    • 我们没有看到您发送到分析 API 的内容。
    • 你说你想要f, fo, foo, b, ba, bar.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多