2016-01-02 13 views
6

iPhone için Elasticsearch içinde arama yaparken iPhone maçı yapmak için mücadele.Elasticsearch'te CamelCase tokenizer ürününü hariç bırak

Bazı kaynak kodları söz konusu olduğundan, kesinlikle CamelCase tokenizer'a ihtiyacım var, ancak iPhone'u iki açıdan kırıyor gibi görünüyor, bu yüzden iphone bulunamıyor.

Herkes, camelCase kelimelerini jetonlara (deve + case) bölmek için istisnalar eklemenin bir yolunu biliyor mu?

GÜNCELLEME: netleştirmek için, NullPointerException öğesinin [null, pointer, exception] olarak belirtilmesini istiyorum, ancak iPhone'un [i, telefon] olmasını istemiyorum.

Başka herhangi bir çözüm?

UPDATE 2: @ ChintanShah'ın yanıtı bize daha da fazlasını veren farklı bir yaklaşım önermektedir - NullPointerException, [null, pointer, exception, nullpointer, pointerexception, nullpointerexception] olarak belirlenir ve bu, kesinlikle bakış açısından çok daha yararlıdır. arama yapandan. Ve endeksleme de daha hızlı! Fiyatın ödenmesi endeks büyüklüğündedir, ancak bu üstün bir çözümdür.

+0

Küçük harfli filtreyi niye kullanmıyorsunuz? Tüm sözcükleri küçültecek – ChintanShah25

+0

@ ChintanShah25 Bu, tokenizer'ı nasıl onarmaya yardımcı olur? (ve btw - küçük harfli filtre kullanıyorum) – tishma

+0

tokenizatörleri filtrelerden farklıdır. iPhone, küçük boyutlu filtreli iphone olarak dizine eklenecektir. Eğer tüm yanlış almazsa, belirteci göndermeden ve – ChintanShah25

cevap

6

word_delimiter token filter ile gereksinimlerinizi karşılayabilirsiniz. olarak kalacaktır This yüzden NullPointerExceptionboş, pointer ve istisna olarak simgeleþtirilmiþ gibi değişiklikler davayla ilgili kelimeleri bölecek

{ 
    "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": { 
    } 
} 

benim kurulduğundan ama iPhone ve WiFi korumalı olduğu gibi. word_delimiter, esneklik için birçok seçeneğe sahiptir. Ayrıca çok yardımcı olacak preserve_original.

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

Sonucu

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

Sonuç ile Şimdi

{ 
    "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 
     } 
    ] 
} 

diğer yaklaşım farklı analizörleriyle iki kez alanını analiz etmektir ama word_delimiter yapacak hissetmek hile.

Bu yardımcı olur mu?

+0

Çok yardımcı oluyor! Preserve_original artı catenate_all bile bir catch-all çözüm olduğu gibi bir zorunluluk olduğunu düşünüyorum. NullPointerException'ı ararken, sadece bunun parçalarını ararken, NullPointerException'ı bulmayı kim beklemezdi! – tishma

+0

Dediğim gibi Çok fazla seçeneği var, çeşitli gereksinimlerinize göre ayarlayabilirsiniz. – ChintanShah25

+0

itici olmaya gerek yok;) Soruyu biraz değiştirmeyi düşünüyorum, çünkü word_delimiter aslında daha genel bir durum için bir çözüm. Btw, letter tokenizer benim için boşluktan çok daha iyi çalıştı. Ve tüm deve vakaları için dokümanlarda önerilen kalıbı kullanmanın% 15-40 daha hızlı! – tishma

İlgili konular