2015-05-08 18 views
22

Aşağıdaki durum için Google veya ES'de mükemmel bir çözüm bulamadım, birilerinin burada yardımcı olabileceğini umuyoruz.E-postalar için ElasticSearch Analyzer ve Tokenizer

alan "e-posta" altında saklanır beş e-posta adresleri vardır varsayalım:

Aşağıdaki arama senaryoları yerine getirmek isteyen
1. {"email": "[email protected]"} 
2. {"email": "[email protected], [email protected]"} 
3. {"email": "[email protected]"} 
4. {"email": "[email protected]} 
5. {"email": "[email protected]"} 

:

[Arama -> al]

"John. [email protected]" -> 1,2

"[email protected]" -> 2,4

"[email protected]" -> 5

"john.doe" -> 1,2,3,4

"John" -> 1,2,3,4,5

"gmail.com" -> 1,2

"outlook.com" -> 2,3,4

ilk üç eşleştirmeler olan bir zorunluluktur, diğerleriyle daha hassas daha iyi . İndeks/arama analizörleri, belirteçler ve filtrelerin farklı kombinasyonlarını denediniz. Ayrıca eşleşme sorguları için koşmaya çalıştım, ama ideal bir çözüm bulamadı, herhangi bir düşünce hoş karşılandı, ve eşleme, analizör ya da hangi tür sorguların kullanılacağı konusunda bir sınır yok, teşekkürler.

cevap

32

Haritalama:

PUT /test 
{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "email": { 
      "type": "pattern_capture", 
      "preserve_original": 1, 
      "patterns": [ 
      "([^@]+)", 
      "(\\p{L}+)", 
      "(\\d+)", 
      "@(.+)", 
      "([^[email protected]]+)" 
      ] 
     } 
     }, 
     "analyzer": { 
     "email": { 
      "tokenizer": "uax_url_email", 
      "filter": [ 
      "email", 
      "lowercase", 
      "unique" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "emails": { 
     "properties": { 
     "email": { 
      "type": "string", 
      "analyzer": "email" 
     } 
     } 
    } 
    } 
} 

Test verileri:

POST /test/emails/_bulk 
{"index":{"_id":"1"}} 
{"email": "[email protected]"} 
{"index":{"_id":"2"}} 
{"email": "[email protected], [email protected]"} 
{"index":{"_id":"3"}} 
{"email": "[email protected]"} 
{"index":{"_id":"4"}} 
{"email": "[email protected]"} 
{"index":{"_id":"5"}} 
{"email": "[email protected]"} 

Sorgu kullanılacak:

GET /test/emails/_search 
{ 
    "query": { 
    "term": { 
     "email": "[email protected]" 
    } 
    } 
} 
+0

Büyük! Bu desen yakalama belirteç filtresini hiç denemedim, kısaca her bir alan için kaç jetonun üreteceği hakkında konuşabilir misiniz ve farklı senaryolar için doğru kombinasyonları bulmak için bir strateji var mı? – LYu

+3

Sadece belgelerden yürüdüm, neden bulamadığımı gerçekten anlamıyordum, tekrar teşekkürler, birilerinin buna ihtiyacı varsa, daha fazla açıklama gerekmiyor: [http://www.elastic.co/guide/en /elasticsearch/reference/1.5/analysis-pattern-capture-tokenfilter.html](http://www.elastic.co/guide/en/elasticsearch/reference/1.5/analysis-pattern-capture-tokenfilter.html) – LYu

İlgili konular