2016-03-08 40 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