【问题标题】:Tokenizer vs token filters标记器与标记过滤器
【发布时间】:2016-09-07 05:11:44
【问题描述】:

我正在尝试使用 Elasticsearch 实现自动完成功能,我认为我了解如何做到这一点...

我正在尝试通过使用 ES 的 edge_n_grams 来构建多词(短语)建议,同时为抓取的数据编制索引。

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

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

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

【问题讨论】:

    标签: elasticsearch token tokenize


    【解决方案1】:

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

    边缘 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 标记过滤器

    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 对应每个令牌。

    【讨论】:

      【解决方案2】:

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

      例如,假设输入是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 标记过滤器,您将获得以下标记

      • T, Th, The
      • q, qu, qui, quic, quick
      • b, br, bro, brow, brown
      • f, fo, fox

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

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

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

      【讨论】:

      • 我使用 ES 1.7,它产生的输出与这个答案所暗示的不同。标记器和过滤器之间的许多标记和标记本身是相同的:t, th, the, q, qu, qui, ... 但偏移量和位置不同。过滤器:{"token": "qui", "start_offset": 4, "end_offset": 9, "position": 2}。分词器:{"token": "qui", "start_offset": 4, "end_offset": 7, "position": 6}
      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2017-03-18
      • 2016-06-17
      相关资源
      最近更新 更多