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

Kar*_*kar 14 token analyzer elasticsearch

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

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

And*_*fan 24

我认为文档非常明确:

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

nGram令牌化器的最佳示例再次来自文档:

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
Run Code Online (Sandbox Code Playgroud)

使用此tokenizer定义:

                    "type" : "nGram",
                    "min_gram" : "2",
                    "max_gram" : "3",
                    "token_chars": [ "letter", "digit" ]
Run Code Online (Sandbox Code Playgroud)

简而言之:

  • 根据配置,tokenizer将创建令牌.在这个例子中:FC,Schalke,04.
  • nGram从输入文本生成最小min_gram大小和最大max_gram大小的字符组.基本上,令牌被分成小块,每个块都锚定在一个角色上(这个角色在哪里都无关紧要,所有这些都会创建块).
  • edgeNGram做同样的事情,但块总是从每个令牌的开头开始.基本上,块被锚定在令牌的开头.

对于与上面相同的文本,edgeNGram生成此:FC, Sc, Sch, Scha, Schal, 04.考虑文本中的每个"单词",对于每个"单词",第一个字符是起点(F来自FC,S来自Schalke0来自04).


Ahm*_*mad 9

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

Text: Red Wine

Options:
    ngram_min: 2
    ngram_max: 3

Result: Re, Red, ed, Wi, Win, in, ine, ne
Run Code Online (Sandbox Code Playgroud)

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


ngram_edge执行与以下完全相同的操作,ngram但不移动光标:

Text: Red Wine

Options:
    ngram_min: 2
    ngram_max: 3

Result: Re, Red
Run Code Online (Sandbox Code Playgroud)

为什么没有回来Win?因为光标不移动,所以它总是从位置零开始,移动ngram_min几次并返回到同一位置(始终为零)。


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

Text: Red Wine

Options:
    ngram_min: 2
    ngram_max: 3

Result: Re, Red, ed, Wi, Win, in, ine, ne
Run Code Online (Sandbox Code Playgroud)

使用 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"
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我见过的最好的解释谢谢! (2认同)