2014-07-08 25 views
24

W realizacji elasticsearch, mam kilka prostych agregacji na podstawie kilku dziedzinach, jak pokazano poniżej -elastyczne wyszukiwanie - Agregacja zwraca hasła w kluczu, ale nie w pełnym polu, jak mogę uzyskać pełne pole zwrócone?

"aggs" : { 
    "author" : { 
     "terms" : { "field" : "author" 
      , "size": 20, 
      "order" : { "_term" : "asc" } 
     } 
    }, 
    "title" : { 
     "terms" : { "field" : "title" 
      , "size": 20 
     } 
    }, 
    "contentType" : { 
     "terms" : { "field" : "docType" 
      , "size": 20 
     } 
    } 
} 

agregacji działać dobrze i uzyskać wyniki odpowiednio. ale zwrócone pole klucza tytułu (lub dowolne inne pole - wiele słów) ma agregację pojedynczego słowa i wyniki. Potrzebuję pełnego tytułu w zwracanym wyniku, a nie tylko słowa - które nie ma większego sensu. jak mogę to zdobyć.

Aktualne wyniki (tylko fragment) -

"title": { 
    "buckets": [ 
     { 
      "key": "test", 
      "doc_count": 1716 
     }, 
     { 
      "key": "pptx", 
      "doc_count": 1247 
     }, 
     { 
      "key": "and", 
      "doc_count": 661 
     }, 
     { 
      "key": "for", 
      "doc_count": 489 
     }, 
     { 
      "key": "mobile", 
      "doc_count": 487 
     }, 
     { 
      "key": "docx", 
      "doc_count": 486 
     }, 
     { 
      "key": "pdf", 
      "doc_count": 450 
     }, 
     { 
      "key": "2012", 
      "doc_count": 397 
     } ] } 

oczekiwane rezultaty -

"title": { 
     "buckets": [ 
      { 
       "key": "test document for stack overflow ", 
       "doc_count": 1716 
      }, 
      { 
       "key": "this is a pptx", 
       "doc_count": 1247 
      }, 
      { 
       "key": "its another document and so on", 
       "doc_count": 661 
      }, 
      { 
       "key": "for", 
       "doc_count": 489 
      }, 
      { 
       "key": "mobile", 
       "doc_count": 487 
      }, 
      { 
       "key": "docx", 
       "doc_count": 486 
      }, 
      { 
       "key": "pdf", 
       "doc_count": 450 
      }, 
      { 
       "key": "2012", 
       "doc_count": 397 
      } } 

Przeszedłem przez wiele dokumentacji, wyjaśnia różne sposoby do agregacji wyników, ale nie mogłem dowiedzieć się, jak uzyskać pełny tekst, jeśli pole w kluczu w wyniku, proszę doradzić, w jaki sposób mogę to osiągnąć?

Odpowiedz

28

Trzeba mieć untokenized kopie terminów w indeksie, w użyciu mapowania multi-fields:

{ 
    "test": { 
     "mappings": { 
      "book": { 
       "properties": {     
        "author": { 
         "type": "string", 
         "fields": { 
          "untouched": { 
           "type": "string", 
           "index": "not_analyzed" 
          } 
         } 
        }, 
        "title": { 
         "type": "string", 
         "fields": { 
          "untouched": { 
           "type": "string", 
           "index": "not_analyzed" 
          } 
         } 
        }, 
        "docType": { 
         "type": "string", 
         "fields": { 
          "untouched": { 
           "type": "string", 
           "index": "not_analyzed" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

W celach kwerendy agregacji na untokenized pola:

"aggs" : { 
    "author" : { 
     "terms" : { 
      "field" : "author.untouched", 
      "size": 20, 
      "order" : { "_term" : "asc" } 
     } 
    }, 
    "title" : { 
     "terms" : { 
      "field" : "title.untouched", 
      "size": 20 
     } 
    }, 
    "contentType" : { 
     "terms" : { 
      "field" : "docType.untouched", 
      "size": 20 
     } 
    } 
} 
+1

dziękuję bardzo Dan !! Spróbuję tego, wygląda bardzo obiecująco! – dev123

+0

Co powiesz na pytanie o pole, które muszę mieć tokenizowane dla zapytania wyszukiwania, ale jednocześnie niezestrializowane dla agregacji? – ulkas

+1

Powyższe odwzorowanie to powoduje, że indeksuje pole przy użyciu domyślnego analizatora (analizator standardowy) i indeksuje nieznikcjonowaną wersję pola. Na przykład dla wyszukiwania użyj nazwy pola 'title' (tokenized), w przypadku agregacji użyj nazwy pola' title.untouched' (untokenized). –

0

Wpadłem na podobny problem. Kiedy wpadłem polecenie:

curl -XGET "localhost:9200/logstash*/_mapping?pretty" 

miał następującą odpowiedź w tym, co było przydatne:

"host" : { 
    "type" : "string", 
     "norms" : { 
     "enabled" : false 
     }, 
     "fields" : { 
     "raw" : { 
      "type" : "string", 
      "index" : "not_analyzed", 
      "ignore_above" : 256 
     } 
     } 
    },... 

niż zdałem sobie sprawę, że dodanie .raw należy zmienić wyjście i będzie uzyskać pożądany wynik.

więc coś takiego:

 "aggs": { 
     "computes": { 
      "terms": { 
      "field": "host.raw", 
      "size": 0 
      } 
     }   
     } 

wystarczyły dla mnie.

Newbie do elasticsearch ale widzę, że wiele pól typu string ma "surowe" pole, które może być użyte w zapytaniu.

Byłoby dobrze, gdyby niektórzy eksperci mogli rzucić światło na moje odkrycia. Prawidłowe/Częściowo poprawne/Nieprawidłowe?!

+0

Wtyczka wyjściowa logstash tworzy domyślny szablon indeksu w Elasticsearch, który jest stosowany do każdego indeksu, którego nazwa zaczyna się od 'logstash-'. Gdy ten szablon jest używany, domyślnie tworzone jest pole 'raw' dla każdej właściwości, która jest typu' string'. To jest szablon: https://github.com/logstash-plugins/logstash-output-elasticsearch/blob/v0.2.4/lib/logstash/outputs/elasticsearch/elasticsearch-template.json#L18-L27 –