elasticsearch elasticsearch自定义标记器-按长度拆分标记,elasticsearch,lucene,tokenize,stringtokenizer,analyzer,elasticsearch,Lucene,Tokenize,Stringtokenizer,Analyzer" /> elasticsearch elasticsearch自定义标记器-按长度拆分标记,elasticsearch,lucene,tokenize,stringtokenizer,analyzer,elasticsearch,Lucene,Tokenize,Stringtokenizer,Analyzer" />

elasticsearch elasticsearch自定义标记器-按长度拆分标记

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

我使用的是elasticsearch版本1.2.1。 我有一个用例,在这个用例中,我想创建一个自定义标记器,它将根据标记的长度将其拆分为某个最小长度。例如,假设最小长度为4,则标记“abcdefghij”将拆分为: “abcd efgh ij”

我想知道我是否可以在不需要编写自定义Lucene标记器类的情况下实现这个逻辑


提前感谢。

对于您的需求,如果您不能使用,那么您需要自己编写一个自定义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命令,请查看包含结果的更新答案。也许逗号的编码很奇怪,但不确定。感谢您的更新,这真是一种按长度分割代币的好方法。