edge ngram标记过滤器与ngram标记过滤器的区别?

时间:2015-07-14 05:52:38

标签: elasticsearch token analyzer

由于我不熟悉弹性搜索,我无法识别 ngram令牌过滤器之间的区别 边缘ngram标记过滤器

这两者如何相互不同 处理令牌?

2 个答案:

答案 0 :(得分:21)

我认为documentation非常明确:

  

此标记器与nGram非常相似,但只保留从令牌开头开始的n-gram。

nGram令牌化程序的最佳示例再次来自documentation

curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d 'FC Schalke 04'


    # FC, Sc, Sch, ch, cha, ha, hal, al, alk, lk, lke, ke, 04

使用此标记器定义:

                    "type" : "nGram",
                    "min_gram" : "2",
                    "max_gram" : "3",
                    "token_chars": [ "letter", "digit" ]

简而言之:

  • 令牌化程序将根据配置创建令牌。在此示例中:FCSchalke04
  • nGram根据输入文字生成最小min_gram大小和最大max_gram大小的字符组。基本上,令牌被分成小块,每个块都锚定在一个角色上(这个角色所在的位置并不重要,所有这些都会创建块)。
  • edgeNGram做同样的事情,但是块总是从每个令牌的开头开始。基本上,块被锚定在令牌的开头。

对于与上述相同的文字,edgeNGram会生成以下内容:FC, Sc, Sch, Scha, Schal, 04。每个"字"在文本中考虑和每个"字"第一个字符是起点(F来自FC,来自S的{​​{1}}和来自Schalke的{​​{1}}。

答案 1 :(得分:2)

ngram在打破文本的同时移动光标:

Text: Red Wine

Options:
    ngram_min: 2
    ngram_max: 3

Result: Re, Red, ed, Wi, Win, in, ine, ne

如您在此处看到的,光标移动ngram_min到下一个片段,直到到达ngram_max


ngram_edgengram完全相同,但是它不会移动光标:

Text: Red Wine

Options:
    ngram_min: 2
    ngram_max: 3

Result: Re, Red

为什么它没有返回Win?因为光标不会移动,所以它将始终从零位置开始,移动ngram_min次并返回相同的位置(始终为零)。


ngram_edge视为其他编程语言(例如JavaScript)中的substring函数:

// ngram
let str = "Red Wine";
console.log(str.substring(0, 2)); // Re
console.log(str.substring(0, 3)); // Red
console.log(str.substring(1, 3)); // ed, start from position 1
// ...

// ngram_edge
// notice that the position is always zero
console.log(str.substring(0, 2)); // Re
console.log(str.substring(0, 3)); // Red

使用Kibana自己尝试一下:

PUT my_index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_ngram_tokenizer" : {
          "type" : "ngram",
          "min_gram": 2,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        },
        "my_edge_ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 3
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "tokenizer": "my_ngram_tokenizer",
  "text": "Red Wine"
}

POST my_index/_analyze
{
  "tokenizer": "my_edge_ngram_tokenizer", 
  "text": "Red Wine"
}