【发布时间】:2019-01-26 12:57:49
【问题描述】:
我输入了以下类型的文本。
foo bar、hello 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