2015-05-10 3 views
0

Я хочу получить десять самых частых шаблонов в поиске с помощью elasticsearch.
Пример:Как получить счет наиболее частого шаблона в elasticsearch?

"cgn:4189, dfsdkfldslfs" 
"cgn:4210, aezfvdsvgds" 
"cgn:4189, fdsmpfjdjs" 
"cgn:4195, cvsf" 
"cgn:4189, mkpjd" 
"cgn:4210, mfsfgkpjd" 

Я хочу получить:

4189 : 3 
4210 : 2 
4195 : 1 

Я знаю, как сделать это в mysql или с помощью AWK/сортировки/голову ... но с elasticsearch я потерял.

ответ

0

Точно как он будет работать, зависит от вашего анализатора, но если вы используете только по умолчанию, standard analyzer, вы можете получить то, что хотите довольно легко, с помощью terms aggregation.

В качестве простого примера, я создал тривиальный индекс:

PUT /test_index 
{ 
    "settings": { 
     "number_of_shards": 1 
    } 
} 

Затем индексированные данные, размещенные, используя bulk api:

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"msg":"cgn:4189, dfsdkfldslfs"} 
{"index":{"_id":2}} 
{"msg":"cgn:4210, aezfvdsvgds"} 
{"index":{"_id":3}} 
{"msg":"cgn:4189, fdsmpfjdjs"} 
{"index":{"_id":4}} 
{"msg":"cgn:4195, cvsf"} 
{"index":{"_id":5}} 
{"msg":"cgn:4189, mkpjd"} 
{"index":{"_id":6}} 
{"msg":"cgn:4210, mfsfgkpjd"} 

Тогда я могу запустить агрегацию простых терминов в вернуть все термины и как часто они происходят (по умолчанию убывает по срочной частоте):

POST /test_index/_search?search_type=count 
{ 
    "aggs": { 
     "msg_terms": { 
     "terms": { 
      "field": "msg" 
     } 
     } 
    } 
} 

, которая возвращает:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 6, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "msg_terms": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "cgn", 
       "doc_count": 6 
      }, 
      { 
       "key": "4189", 
       "doc_count": 3 
      }, 
      { 
       "key": "4210", 
       "doc_count": 2 
      }, 
      { 
       "key": "4195", 
       "doc_count": 1 
      }, 
      { 
       "key": "aezfvdsvgds", 
       "doc_count": 1 
      }, 
      { 
       "key": "cvsf", 
       "doc_count": 1 
      }, 
      { 
       "key": "dfsdkfldslfs", 
       "doc_count": 1 
      }, 
      { 
       "key": "fdsmpfjdjs", 
       "doc_count": 1 
      }, 
      { 
       "key": "mfsfgkpjd", 
       "doc_count": 1 
      }, 
      { 
       "key": "mkpjd", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

Вот код, который я использовал:

http://sense.qbox.io/gist/a827095b675596c4e3d545ce963cde3fae932156