2016-01-02 35 views
6

在Elasticsearch中搜索iphone時,努力讓iPhone匹配。排除Elasticsearch中的CamelCase標記器

由於我有一些關於源代碼的問題,我當然需要CamelCase tokenizer,但它似乎將iPhone分成兩個術語,因此無法找到iphone。

任何人都知道添加例外的方法來將camelCase單詞分成標記(駱駝+大小寫)?

更新:爲了說清楚,我希望將NullPointerException標記爲[null,指針,異常],但我不希望iPhone變成[我,電話]。

任何其他解決方案?更新2:@ChintanShah的答案提出了一個讓我們更加不同的方法 - NullPointerException將被標記爲[null,指針,異常,空指針,pointerexception,nullpointerexception],從視角來看,它肯定更有用搜索的那個。索引也更快!要支付的價格是指數大小,但它是一個優秀的解決方案。

+0

什麼不使用小寫過濾器?它將小寫所有單詞 – ChintanShah25

+0

@ ChintanShah25這如何幫助修復tokenizer? (和順便說一句 - 我使用小寫字母過濾器) – tishma

+0

標記化器不同於過濾器。 iPhone將被索引爲帶有小寫過濾器的iphone。它會幫助,如果你發佈你現在的anlayzer和映射 – ChintanShah25

回答

6

您可以通過word_delimiter token filter實現您的要求。 這是我的設置

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "camel_analyzer": { 
      "tokenizer": "whitespace", 
      "filter": [ 
      "camel_filter", 
      "lowercase", 
      "asciifolding" 
      ] 
     } 
     }, 
     "filter": { 
     "camel_filter": { 
      "type": "word_delimiter", 
      "generate_number_parts": false, 
      "stem_english_possessive": false, 
      "split_on_numerics": false, 
      "protected_words": [ 
      "iPhone", 
      "WiFi" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    } 
} 

這將分裂的話就情況變化所以NullPointerException將被標記化作爲指針例外iPhone無線仍將作爲這是因爲他們是保護word_delimiter有很多靈活性選項。你也可以preserve_original這將幫助你很多。

GET logs_index/_analyze?text=iPhone&analyzer=camel_analyzer 

結果

{ 
    "tokens": [ 
     { 
     "token": "iphone", 
     "start_offset": 0, 
     "end_offset": 6, 
     "type": "word", 
     "position": 1 
     } 
    ] 
} 

現在用

GET logs_index/_analyze?text=NullPointerException&analyzer=camel_analyzer 

結果

{ 
    "tokens": [ 
     { 
     "token": "null", 
     "start_offset": 0, 
     "end_offset": 4, 
     "type": "word", 
     "position": 1 
     }, 
     { 
     "token": "pointer", 
     "start_offset": 4, 
     "end_offset": 11, 
     "type": "word", 
     "position": 2 
     }, 
     { 
     "token": "exception", 
     "start_offset": 11, 
     "end_offset": 20, 
     "type": "word", 
     "position": 3 
     } 
    ] 
} 

另一種方法是用不同的分析儀兩次分析自己的領域,但我覺得word_delimiter會做招。

這有幫助嗎?

+0

它有很多幫助!我認爲preserve_original plus甚至catenate_all是必須的,因爲它是一個全面的解決方案。當查找NullPointerException而不是僅在查找它的一部分時,誰不希望發現NullPointerException! – tishma

+0

正如我所說它有很多選擇,你可以根據你的各種要求調整它。 – ChintanShah25

+0

不需要冒險;)我正在考慮改變這個問題,因爲word_delimiter實際上是一個更一般情況下的解決方案。順便說一句,信件分詞器爲我工作比空白好得多。而且這比使用駱駝案件中的文檔建議的模式快15-40%! – tishma