我有以下类型的文本中来了。 foo bar,hello world等我使用边缘NGRAM分词器,并使用分析它产生以下令牌API创建的分析。
foo bar
hello world
{ "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事实如此。还请让我知道我的分析器代码是否正确?
lu2424
您使用分析API测试的是edge-ngram 令牌过滤器 ,它不同于edge-ngram 令牌生成器 。
在代码中,如果您希望代码中的行为与使用analyze API测试的行为相同EdgeNGramTokenizer,EdgeNGramTokenFilter则需要替换为。
EdgeNGramTokenizer
EdgeNGramTokenFilter