我使用的是弹性搜索1.2.1版本。我有一个用例,在这个用例中,我想创建一个自定义的令牌化器,它将按令牌的长度将令牌分解到某个最小长度。例如,假设最小长度为4,则令牌"abcdefghij"将被拆分为:"abcd efgh ij"。
我想知道我是否可以在不需要编码自定义Lucene Tokenizer类的情况下实现这个逻辑?
提前谢谢。
Pattern Tokenizer支持参数"group"
它的默认值是"-1",这意味着使用模式进行拆分,这就是您所看到的。
但是,通过在模式中定义一个>=0的组并设置组参数,就可以做到这一点!例如,以下令牌化器将输入拆分为4个字符的令牌:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": "(.{4})",
"group": "1"
}
}
}
}
}
通过以下方式分析文档:
POST my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "comma,separated,values"
}
产生以下令牌:
{
"tokens": [
{
"token": "comm",
"start_offset": 0,
"end_offset": 4,
"type": "word",
"position": 0
},
{
"token": "a,se",
"start_offset": 4,
"end_offset": 8,
"type": "word",
"position": 1
},
{
"token": "para",
"start_offset": 8,
"end_offset": 12,
"type": "word",
"position": 2
},
{
"token": "ted,",
"start_offset": 12,
"end_offset": 16,
"type": "word",
"position": 3
},
{
"token": "valu",
"start_offset": 16,
"end_offset": 20,
"type": "word",
"position": 4
}
]
}
对于您的需求,如果您不能使用模式标记器来完成,那么您需要自己编写一个自定义的Lucene标记器类。你可以为它创建一个自定义的Elasticsearch插件。你可以参考这个例子来了解如何为自定义分析器创建Elasticsearch插件。