2016-08-01 16 views
0

私はElasticsearchを初めて使いました。フィールドの部分文字列の別々の出現を数えようとしています。弾性検索電子メールのドメイン集約

メールログインデックスの一部として電子メールの受信者があり、インデックス内の別個のドメインの数をカウントしたいとします。

たとえば、インデックスに3つのメールログがあり、それらが次のアドレスから来た場合、[email protected],[email protected]および[email protected];私はを参照したいと思っていますb.comドメインから2つのメールとe.comドメインから1つのメール。

答えて

1

は、@の後にキャプチャする必要があります。また、テキストの元分析を台無しに、私は元emailフィールドにサブフィールドを追加することを提案し、これだけ特定の集計のためにそれでは動作しません:

PUT /test 
{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "email_domains": { 
      "type": "pattern_capture", 
      "preserve_original" : 0, 
      "patterns": [ 
      "@(.+)" 
      ] 
     } 
     }, 
     "analyzer": { 
     "email": { 
      "tokenizer": "uax_url_email", 
      "filter": [ 
      "email_domains", 
      "lowercase", 
      "unique" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "emails": { 
     "properties": { 
     "email": { 
      "type": "string", 
      "fields": { 
      "domain": { 
       "type": "string", 
       "analyzer": "email" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

は、いくつかのテストデータを試し:

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

そして、あなたの特定のユースケースのために、以下のような単純な集計はそれを行う必要があります。

GET /test/emails/_search 
{ 
    "size": 0, 
    "aggs": { 
    "by_domain": { 
     "terms": { 
     "field": "email.domain", 
     "size": 10 
     } 
    } 
    } 
} 

、結果はこのようなものです:

"aggregations": { 
     "by_domain": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "outlook.com", 
       "doc_count": 3 
      }, 
      { 
       "key": "gmail.com", 
       "doc_count": 2 
      }, 
      { 
       "key": "yahoo.com", 
       "doc_count": 1 
      } 
     ] 
     } 
    }