elasticsearch elasticsearch自定义标记器-按长度拆分标记
我使用的是elasticsearch版本1.2.1。 我有一个用例,在这个用例中,我想创建一个自定义标记器,它将根据标记的长度将其拆分为某个最小长度。例如,假设最小长度为4,则标记“abcdefghij”将拆分为: “abcd efgh ij” 我想知道我是否可以在不需要编写自定义Lucene标记器类的情况下实现这个逻辑elasticsearch elasticsearch自定义标记器-按长度拆分标记,elasticsearch,lucene,tokenize,stringtokenizer,analyzer,elasticsearch,Lucene,Tokenize,Stringtokenizer,Analyzer,我使用的是elasticsearch版本1.2.1。 我有一个用例,在这个用例中,我想创建一个自定义标记器,它将根据标记的长度将其拆分为某个最小长度。例如,假设最小长度为4,则标记“abcdefghij”将拆分为: “abcd efgh ij” 我想知道我是否可以在不需要编写自定义Lucene标记器类的情况下实现这个逻辑 提前感谢。对于您的需求,如果您不能使用,那么您需要自己编写一个自定义Lucene标记器类。您可以为其创建自定义Elasticsearch插件。有关如何为自定义分析器创建Elas
提前感谢。对于您的需求,如果您不能使用,那么您需要自己编写一个自定义Lucene标记器类。您可以为其创建自定义Elasticsearch插件。有关如何为自定义分析器创建Elasticsearch插件的示例,请参阅。模式标记器支持一个参数 它的默认值为“-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
}
]
}
这与您提供的示例有点不同,但可能值得研究。我尝试按照您的建议使用模式标记器,但我不确定是否可以实现此功能。我尝试了以下模式:“([.]{0,5})”,但它似乎将标记拆分为字符(可能是因为贪婪的正则表达式)。基于文档,不要认为模式标记器适用于这里:“重要:正则表达式应该匹配标记分隔符,而不是标记本身。”但就我而言,我并没有真正的分离机。我也怀疑这一点。似乎使用自定义分析器编写Elasticsearch插件是唯一的选择。为什么逗号不是标记的一部分<来自正则表达式的code>也应该与逗号匹配。在我的测试中,我得到了包含在标记中的逗号,如果使用link:而不是curl命令,请查看包含结果的更新答案。也许逗号的编码很奇怪,但不确定。感谢您的更新,这真是一种按长度分割代币的好方法。