在elasticsearch中索引字符串的最后一个单词

balp4ylt  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(264)

我正在寻找一种方法,将字段的最后一个单词(或者更一般地说:最后一个标记)索引到一个单独的子字段中。我已经研究了 predicate 脚本令牌过滤器,但在该上下文中,无痛脚本api只提供了toekn从原始输入字符串开始的绝对位置,因此我可以找到第一个令牌,如下所示:

GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "predicate_token_filter",
      "script": {
        "source": """
          token.position == 0
        """
      }
    }
  ],
  "text": "the fox jumps the lazy dog"
}

这样做的结果是:

{
  "tokens" : [
    {
      "token" : "the",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

但我需要最后一个标记,而不是第一个。在elasticsearch之外,是否有任何方法可以在不准备单独字段预索引的情况下实现这一点?

xpcnnkqh

xpcnnkqh1#

你在正确的道路上!!解决办法与你所拥有的并不遥远。。。当你知道你可以很容易地得到第一个令牌,但你需要的是最后一个。。。把绳子倒过来。。。
下面的分析器将只输出您需要的令牌,即。 dog . 我们首先反转整个字符串,然后按标记拆分,使用 predicate 脚本仅选择第一个字符串,然后再次反转该标记。瞧à!

POST test/_analyze
{
  "text": "the fox jumps the lazy dog",
  "tokenizer": "keyword",
  "filter": [
    "reverse",
    "word_delimiter",
    {
      "type": "predicate_token_filter",
      "script": {
        "source": """
          token.position == 0
        """
      }
    },
    "reverse"
  ]
}

结果:

{
  "tokens" : [
    {
      "token" : "dog",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "word",
      "position" : 0
    }
  ]
}

相关问题