2014-04-18 18 views
5

Dizin üzerinde sorgulayan ve daha sonra belirli bir alana bağlı olarak sender_not_analyzed toplayan bir elasticsearch sorgum var. Daha sonra, üst "gönderenler" için kovalar döndüren sender_not_analyzed aynı alanda bir terim topluca kullanın. Benim sorgusu şu anda geçerli:Elasticsearch Sorgu benzersiz altyazılar tarafından toplu hale getirildi (e-posta etki alanı)

benziyor kova döndürür
{ 
    "size": 0, 
    "query": { 
     "regexp": { 
     "sender_not_analyzed": ".*[@].*" 
     } 
    }, 
    "aggs": { 
     "sender-stats": { 
     "terms": { 
      "field": "sender_not_analyzed" 
     } 
     } 
    } 
} 

: Ben her benzersiz e-posta etki alanı için tek kova şekilde toplanmış olarak yazabilirsiniz nasıl

"aggregations": { 
     "sender-stats": { 
     "buckets": [ 
      { 
       "key": "<Mike <[email protected]>@MISSING_DOMAIN>", 
       "doc_count": 5017 
      }, 
      { 
       "key": "[email protected]", 
       "doc_count": 3963 
      }, 
      { 
       "key": "[email protected]", 
       "doc_count": 2857 
      }, 
      { 
       "key": "[email protected]", 
       "doc_count":1544 
      } 

, örneğin foo.com bir doc_count olurdu (3963 + 2857) 6820? Bunu regex birleştirme ile yapabilir miyim, veya dizeyi @ dizesinin sonuna kadar bölmek için bir çeşit özel analizci yazmam gerekir mi?

cevap

3

Bu oldukça geç, ama bu pattern_replace char filter kullanılarak yapılabilir düşünüyorsun, regex ile alan adını yakalamak, bu alan adını yakalayacaktır benim kurulum İşte

POST email_index 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_custom_analyzer": { 
      "char_filter": [ 
      "domain" 
      ], 
      "tokenizer": "keyword", 
      "filter": [ 
      "lowercase", 
      "asciifolding" 
      ] 
     } 
     }, 
     "char_filter": { 
     "domain": { 
      "type": "pattern_replace", 
      "pattern": ".*@(.*)", 
      "replacement": "$1" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "your_type": { 
     "properties": { 
     "domain": { 
      "type": "string", 
      "analyzer": "my_custom_analyzer" 
     }, 
     "sender_not_analyzed": { 
      "type": "string", 
      "index": "not_analyzed", 
      "copy_to": "domain" 
     } 
     } 
    } 
    } 
} 

domain char filter, biz gereken etki alanı olduğu gibi almak için keyword tokenizer kullanın, lowercase süzgeci kullanıyorum, ancak kullanmak veya kullanmak istemediğinizde size kalmış. copy_to parametresini kullanarak sender_not_analyzed değerini domain alanına kopyalayın, ancak _source alanı bu değeri içerecek şekilde değiştirilmeyecek ancak sorgulanabilir.

GET email_index/_search 
{ 
    "size": 0, 
    "query": { 
    "regexp": { 
     "sender_not_analyzed": ".*[@].*" 
    } 
    }, 
    "aggs": { 
    "sender-stats": { 
     "terms": { 
     "field": "domain" 
     } 
    } 
    } 
} 

Bu, istediğiniz sonucu verecektir.