分词器与分词过滤器

Tokenizer vs token filters

我正在尝试使用 Elasticsearch 实现自动完成,我认为我了解如何去做...

我正在尝试通过使用 ES 的 edge_n_grams 构建多词(短语)建议,同时索引已爬网数据。

tokenizertoken_filter 之间有什么区别 - 我已经阅读了关于这些的文档,但仍然需要更多地了解它们....

例如 token_filter ES 用来搜索用户输入的是什么? ES用来制作令牌的是分词器吗?什么是代币?

ES 是否可以使用这些东西创建多词建议?

标记器会将整个输入拆分为标记,标记过滤器会对每个标记应用一些转换。

例如,假设输入是 The quick brown fox。如果您使用 edgeNGram tokenizer,您将获得以下标记:

  • T
  • Th
  • The
  • The(最后一个字符是 space)
  • The q
  • The qu
  • The qui
  • The quic
  • The quick
  • The quick(最后一个字符是 space)
  • The quick b
  • The quick br
  • The quick bro
  • The quick brow
  • The quick brown
  • The quick brown(最后一个字符是 space)
  • The quick brown f
  • The quick brown fo
  • The quick brown fox

但是,如果您使用标准分词器将输入拆分为 words/tokens,然后使用 edgeNGram 分词过滤器,您将获得以下分词

  • TThThe
  • qququiquicquick
  • bbrbrobrowbrown
  • ffofox

如您所见,在 edgeNgram tokenizertoken filter 之间进行选择取决于您希望如何对文本进行切片和切块你想怎么搜索它。

我建议看看优秀的 elyzer 工具,它提供了一种可视化分析过程的方法,并查看每个步骤(标记化和标记过滤)中产生的内容。

从 ES 2.2 开始,_analyze 端点还支持 explain feature 显示分析过程中每个步骤的详细信息。

我想发布一些详细的用例。

边缘 n-gram 分词器(默认)

默认情况下,此标记生成器将所有文本视为单个标记,因为默认情况下标记可以包含任何字符(包括空格)。

GET {ELASTICSEARCH_URL}/_analyze

{
  "tokenizer": "edge_ngram",
  "text": "How are you?"
}

结果:

["H", "Ho"]

解释:一个令牌,min_gram = 1,max_gram = 2。

Edge n-gram 分词器(没有 token_chars 的自定义)

PUT {ELASTICSEARCH_URL}/custom_edge_ngram

{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_edge_ngram": {
          "tokenizer": "custom_edge_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "custom_edge_ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 7
        }
      }
    }
  }
}
GET {ELASTICSEARCH_URL}/custom_edge_ngram/_analyze

{
  "analyzer": "custom_edge_ngram",
  "text": "How old are you?"
}

结果:

["Ho", "How", "How ", "How o", "How ol", "How old"]

解释:还是一个令牌,min_gram = 2,max_gram = 7.

Edge n-gram 分词器(使用 token_chars 自定义)

PUT {ELASTICSEARCH_URL}/custom_edge_ngram_2

{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_edge_ngram": {
          "tokenizer": "custom_edge_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "custom_edge_ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 7,
          "token_chars": ["letter"]
        }
      }
    }
  }
}
GET {ELASTICSEARCH_URL}/custom_edge_ngram_2/_analyze

{
  "analyzer": "custom_edge_ngram",
  "text": "How old are you?"
}

结果:

["Ho", "How", "ol", "old", "ar", "are", "yo", "you"]

解释:4个标记Howoldareyou(标记只能包含字母,因为token_chars)、min_gram = 2,max_gram = 7,但句子中的最大标记长度为 3.

边缘 n-gram 标记过滤器

分词器将文本转换为标记流。

令牌过滤器适用于流中的每个令牌。

令牌过滤器可以通过添加、更新、删除其令牌来修改流。

让我们使用 standard 分词器。

GET {ELASTICSEARCH_URL}/_analyze

{
  "tokenizer": "standard",
  "text": "How old are you?"
}

结果:

["How", "old", "are", "you"]

现在让我们添加令牌过滤器。

GET {ELASTICSEARCH_URL}/_analyze

{
  "tokenizer": "standard",
  "filter": [
    { "type": "edge_ngram",
      "min_gram": 2,
      "max_gram": 7
    }
  ],
  "text": "How old are you?"
}

结果:

["Ho", "How", "ol", "old", "ar", "are", "yo", "you"]

解释:edge_nram 每个令牌。