2016-03-08 39 views
1

我有我的自定义分析器,如下所示。但我不明白如何实现我的目标。使用带有edgeNGram的word_delimiter忽略Word_Delimiter令牌

我的目标是,我想有空格分隔倒排索引,但我想在用户输入分钟3个字符后有自动完成功能。对于我虽然对word_delimiter和edgeNGram令牌结合如下

{ 
    "settings": { 
    "index": { 
     "analysis": { 
     "analyzer": { 
      "my_analyzer": { 
      "tokenizer": "whitespace", 
      "filter": [ 
       "standard", 
       "lowercase", 
       "my_word_delimiter", 
       "my_edge_ngram_analyzer" 
      ], 
      "type": "custom" 
      } 
     }, 
     "filter": { 
      "my_word_delimiter": { 
      "catenate_all": true, 
      "type": "word_delimiter" 
      }, 
      "my_edge_ngram_analyzer": { 
      "min_gram": 3, 
      "max_gram": 10, 
      "type": "edgeNGram" 
      } 
     } 
     } 
    } 
    } 
} 

这会给结果为“兄弟TN-200”,如下图。但我期待“tn”也在恢复索引,因为我有word_delimiter令牌。为什么它不在倒排索引中?我怎样才能做到这一点?

url -XGET "localhost:9200/myIndex/_analyze?analyzer=my_analyzer&pr 
    etty=true" -d "Brother TN-200" 
    { 
     { 
     "token" : "bro", 
     "start_offset" : 14, 
     "end_offset" : 21, 
     "type" : "word", 
     "position" : 2 
     }, { 
     "token" : "brot", 
     "start_offset" : 14, 
     "end_offset" : 21, 
     "type" : "word", 
     "position" : 2 
     }, { 
     "token" : "broth", 
     "start_offset" : 14, 
     "end_offset" : 21, 
     "type" : "word", 
     "position" : 2 
     }, { 
     "token" : "brothe", 
     "start_offset" : 14, 
     "end_offset" : 21, 
     "type" : "word", 
     "position" : 2 
     }, { 
     "token" : "brother", 
     "start_offset" : 14, 
     "end_offset" : 21, 
     "type" : "word", 
     "position" : 2 
     }, { 
     "token" : "tn2", 
     "start_offset" : 22, 
     "end_offset" : 28, 
     "type" : "word", 
     "position" : 3 
     }, { 
     "token" : "tn20", 
     "start_offset" : 22, 
     "end_offset" : 28, 
     "type" : "word", 
     "position" : 3 
     }, { 
     "token" : "tn200", 
     "start_offset" : 22, 
     "end_offset" : 28, 
     "type" : "word", 
     "position" : 3 
     }, { 
     "token" : "200", 
     "start_offset" : 25, 
     "end_offset" : 28, 
     "type" : "word", 
     "position" : 4 
     }] 
    } 

UPDATE:

当然

,如果我用“min_gram”:2,“TN”将在恢复指数,但我不想这样,因为如果任何其他字由“TN”内单词,它会出现在结果列表中。
例如,关于“hp”关键字。我正在为“惠普”购买产品,因为我的产品就像“hp xxx”,但我也得到了一种名为“tech hpc”的产品。我不希望这个产品被显示,直到我输入“hpc”。这就是我之所以设置3

如果我不使用edgeNGram分词器,但只有word_delimiter,“TN”在倒排索引作为兄弟TN-200将被索引为兄弟,TN和200,这就是为什么我预计word_delimiter使“tn”处于倒排索引。如果我使用edgeNGram,它没有用处吗? -

回答

1

my_edge_ngram_analyzermin_gram设置为3,结果长度小于3个码点的任何令牌都不会显示出来。 如果您想要显示TN,则需要将其设置为2。

实施例:

get <my_index>/_analyze?tokenizer=whitespace&filters=my_edge_ngram_analyzer&text=TN 

上述呼叫将返回0令牌。

+0

是的,我知道它应该是2,但我更喜欢3,因为我不希望如果任何其他产品包含“tn”应显示在结果列表中。例如关于“hp”。我正在为“惠普”购买产品,因为我的产品就像“hp xxx”,但我也得到了一种名为“tech hpc”的产品。我不希望这个产品被显示,直到我输入“hpc”。 – batmaci

+0

另一方面,如果我不使用edgeNGram标记器,但只有word_delimiter,“tn”在倒排索引中。这就是为什么我期望word_delimiter使“tn”被索引。如果我使用edgeNGram,它没有用处吗? – batmaci

+0

如果单词分隔符过滤器产生2个或更少的代码点的标记,则它们被'my-edge-ngram'忽略,就像忽略任何代号为2或更小的代码,如果单词分隔符不存在。另外我不明白为什么当你为产品“hp xxx”输入“hp”时会得到“hewlett packard”。 'my_edge_ngram'应该从倒排索引中删除“hp”,并且只有'hpc'将保留'curl -Xget“http:// /_analyze?analyzer = my_analyzer&text = hp xxx”' – keety