sobota, 28 września 2013

[FullTextSearch] ElasticSearch: Faceting

Terminem Faceting określa się technikę agregowania danych gromadzonych w indeksach ElasticSearch. Wysyłając odpowiednie zapytania możemy pobrać pewne informacje statystyczne na temat dokumentów, jakie przechowujemy. Pierwszy rodzaj statystyki, jaką możemy sobie stworzyć to grupowanie po tokenach utworzonych na danym polu, a następnie zliczenie ilości. Wysyłamy zapytanie...

POST http://localhost:9200/books/book/_search HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 135

{
 "query" : { "match_all" : {} },
 "facets" : {
  "author_facet" : {
   "terms" : {
    "field" : "author"
   }
  }
 }
}

...i w odpowiedzi otrzymujemy:

{
   "took":4,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "failed":0
   },
   "hits":{
      "total":5,
      "max_score":1.0,
      "hits":[
       (...)
      ]
   },
   "facets":{
      "author_facet":{
         "_type":"terms",
         "missing":0,
         "total":10,
         "other":0,
         "terms":[
            {
               "term":"michio",
               "count":3
            },
            {
               "term":"kaku",
               "count":3
            },
            {
               "term":"roger",
               "count":2
            },
            {
               "term":"penrose",
               "count":2
            }
         ]
      }
   }
}

Dane możemy także agregować definiując zakresy, na przykład

POST http://localhost:9200/books/book/_search HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 246

{
 "query" : { "match_all" : {} },
 "facets" : {
  "ranges_facet_result" : {
   "range" : {
    "field" : "year",
    "ranges" : [
     { "to" : 1995 },
     { "from" : 1995, "to" : 2000 },
     { "from" : 2000 }
    ]
   }
  }
 }
}

Zwrócone nam zostanie więcej informacji niż poprzednio, ponieważ agregujemy po polu typu numerycznego

{
   "took":145,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "failed":0
   },
   "hits":{
      "total":5,
      "max_score":1.0,
      "hits":[

      ]
   },
   "facets":{
      "ranges_facet_result":{
         "_type":"range",
         "ranges":[
            {
               "to":1995.0,
               "count":2,
               "min":1989.0,
               "max":1993.0,
               "total_count":2,
               "total":3982.0,
               "mean":1991.0
            },
            {
               "from":1995.0,
               "to":2000.0,
               "count":1,
               "min":1995.0,
               "max":1995.0,
               "total_count":1,
               "total":1995.0,
               "mean":1995.0
            },
            {
               "from":2000.0,
               "count":2,
               "min":2004.0,
               "max":2006.0,
               "total_count":2,
               "total":4010.0,
               "mean":2005.0
            }
         ]
      }
   }
}

Powyższe zapytanie możemy także wykonać przy równomiernym rozłożeniu danych (tak jak w histogramie).

POST http://localhost:9200/books/book/_search HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 156

{
 "query" : { "match_all" : {} },
 "facets" : {
  "total_histogram" : {
   "histogram" : {
    "field" : "year",
    "interval" : 5
   }
  }
 }
}

Najwięcej danych do analizy dostarcza nam jednak zapytanie typu statistical.

POST http://localhost:9200/books/book/_search HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 139

{
 "query" : { "match_all" : {} },
 "facets" : {
  "statistical_test" : {
   "statistical" : {
    "field" : "price"
   }
  }
 }
}

ElasticSearch zwraca między innymi zakres, średnią, wariancję, odchylenie standardowe i sumę kwadratów.

{
   "took":55,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "failed":0
   },
   "hits":{
      "total":5,
      "max_score":1.0,
      "hits":[(...)]
   },
   "facets":{
      "statistical_test":{
         "_type":"statistical",
         "count":5,
         "total":114.67999999999999,
         "min":12.06,
         "max":42.0,
         "mean":22.936,
         "sum_of_squares":3157.3112,
         "variance":105.40214400000013,
         "std_deviation":10.266554631423345
      }
   }
}

Brak komentarzy:

Prześlij komentarz