【问题标题】:elasticsearch custom tokenizer - split token by lengthelasticsearch 自定义分词器 - 按长度拆分令牌
【发布时间】:2015-04-08 10:03:14
【问题描述】:

我使用的是弹性搜索 1.2.1 版。 我有一个用例,我想创建一个自定义标记器,它将令牌的长度分解到某个最小长度。例如,假设最小长度为 4,则标记“abcdefghij”将被拆分为: "abcd efgh ij"。

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

提前致谢。

【问题讨论】:

  • 这与您提供的示例有点不同,但NGram Tokenizer 可能值得研究。

标签: elasticsearch lucene tokenize stringtokenizer analyzer


【解决方案1】:

根据您的要求,如果您不能使用pattern tokenizer 来实现,那么您需要自己编写一个自定义的 Lucene Tokenizer 类。你可以为它创建一个自定义的 Elasticsearch 插件。有关如何为自定义分析器创建 Elasticsearch 插件的示例,您可以参考 this。

【讨论】:

  • 我正在尝试听从您的建议并使用模式标记器,但我不确定是否可以实现此功能。我尝试了以下模式:“([.]{0,5})”,但它似乎将令牌分解为字符(可能是因为贪婪的正则表达式)。
  • 根据文档,不要认为模式标记器适用于此处:“重要提示:正则表达式应匹配标记分隔符,而不是标记本身。”但就我而言,我没有实际的分隔符。
  • 我也怀疑过。似乎用自定义分析器编写 Elasticsearch 插件是唯一的选择。
  • 第二个链接坏了,它只是指向主页
【解决方案2】:

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
    }
  ]
}

【讨论】:

  • 为什么逗号不是标记的一部分?来自正则表达式的. 也应该匹配逗号。
  • 在我的测试中,我得到了标记中包含的逗号,请查看更新后的答案以及包含的结果
  • 令人惊讶的是,如果您使用链接:localhost:9200/my_index/… 而不是 curl 命令,结果会有所不同。也许逗号得到了奇怪的编码,但不确定。感谢您的更新,这确实是一种按长度拆分令牌的巧妙方法。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多