2016-01-02 13 views
6

iPhoneをElasticsearchで検索するときにiPhoneを一致させるために苦労しています。ElasticsearchのCamelCaseトークナイザから除外する

私はいくつかのソースコードを持っているので、確かにCamelCase tokenizerが必要ですが、iPhoneを2つの言葉に分けるように見えるので、iphoneは見つかりません。

誰かが、キャメルケースの単語をトークン(キャメル+ケース)に分割する際に例外を追加する方法を知っていますか?

UPDATE:[null、pointer、exception]としてNullPointerExceptionをトークン化したいが、私はiPhoneを[i、phone]にしたくない。

他の解決方法はありますか?私はさらに、NullPointerExceptionは[null、ポインタ、例外、nullpointer、pointerexception、nullpointerexception]としてトークン化されますが、これは明らかに視点からはるかに有用です。検索する人のインデックス作成も高速です!支払う価格はインデックスのサイズですが、それは優れたソリューションです。

+0

小文字のフィルタを使用しないでください。それはすべての単語を小文字にします – ChintanShah25

+0

@ ChintanShah25それはどのようにトークナイザを修正するのに役立ちますか? (とbtw - 私は小文字のフィルタを使用します) – 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のWiFiとして残る変更しますそれらはそのまま保護です。 word_delimiterには柔軟性のための多くのオプションがあります。 preserve_originalでもお手伝いします。

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

結果

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

結果と今

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

{ 
    "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に加えてcatenate_allが必要であると思います。これはキャッチオールソリューションです。 NullPointerExceptionを探すときにだけでなく、NullPointerExceptionを探すときに、誰がNullPointerExceptionを見つけることを期待していないのですか? – tishma

+0

私はそれにはたくさんのオプションがあると言っていたので、あなたのさまざまな要求に応じてそれを微調整することができます。 – ChintanShah25

+0

私はちょっと質問を変えることを考えています。なぜなら、word_delimiterは実際にはもっと一般的なケースの解決策であるからです。 Btw、letter tokenizerは私のために空白よりもはるかに良く機能しました。そして、それはラクダのケースのためのドキュメントで提案されたパターンを使用するよりもすべて15-40%高速です! – tishma

関連する問題