Tokenizer与令牌过滤器

时间:2016-05-11 16:47:13

标签: elasticsearch token tokenize

我尝试使用Elasticsearch实现自动完成功能,因为我知道如何理解它...

我正在尝试使用ES的edge_n_grams建立多字(短语)建议,同时索引已抓取的数据。

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

例如是一个token_filter ES用来搜索用户输入的内容?是一个令牌化器,ES用来制作令牌吗?什么是令牌?

ES是否可以使用这些内容创建多字建议?

2 个答案:

答案 0 :(得分:41)

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

例如,我们说输入为The quick brown fox。如果您使用edgeNGram tokenizer ,您将获得以下令牌:

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

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

  • TThThe
  • qququiquicquick
  • bbrbrobrowbrown
  • ffofox

正如您所看到的,在edgeNgram tokenizer 令牌过滤器之间进行选择取决于您希望如何对文本进行切片和切块以及如何搜索它。 / p>

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

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

答案 1 :(得分:1)

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

Edge n-gram标记器(默认)

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

GET {ELASTICSEARCH_URL}/_analyze

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

结果:

["H", "Ho"]

说明:一个令牌,min_gram = 1,max_gram = 2。

边缘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。

边缘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令牌过滤器

Tokenizer将文本转换为令牌流。

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

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

让我们使用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