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

时间:2015-02-08 16:55:06

标签: elasticsearch lucene tokenize stringtokenizer analyzer

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

我想知道我是否可以在不需要编写自定义Lucene Tokenizer类的情况下实现此逻辑?

提前致谢。

2 个答案:

答案 0 :(得分:3)

根据您的要求,如果您无法使用pattern tokenizer执行此操作,那么您需要自己编写自定义Lucene Tokenizer类。您可以为它创建自定义Elasticsearch插件。您可以参考this获取有关如何为自定义分析器创建Elasticsearch插件的示例。

答案 1 :(得分:2)

Pattern Tokenizer支持参数"group"

它的默认值为“-1”,这意味着使用模式进行拆分,这就是你所看到的。

但是,通过在模式中定义组> = 0并设置group-parameter,可以完成此操作!例如。以下标记生成器会将输入拆分为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
    }
  ]
}