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

时间:2018-08-20 11:41:18

标签: java elasticsearch lucene tokenize elasticsearch-analyzers

我收到以下类型的文字。 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,foob,fooba,foo bar。

这导致 analyze 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为准。还请让我知道我的分析器代码是否正确?

1 个答案:

答案 0 :(得分:1)

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

在代码中,如果您希望代码中的行为与使用analyst API测试的行为相同,则需要用barcodescanner .scan({ ... }) .then( (result) => { console.log("Scan format : " + result.format); console.log("Scan text : " + result.text); this.text = result.text; }, (error) => { console.log("No scan: " + error); } ); } 替换EdgeNGramTokenizer