2016-03-23 18 views
5

Używam wyszukiwania :: Elasticsearch i wyszukiwania :: Elasticsearch :: Przewiń do wyszukiwania i przejdź do mojego serwera elasticsearch.ElasticSearch (search_context_missing_exception) z wyszukiwaniem :: ElasticSearch :: Scroll

W procesie przewijania, dla niektórych querys, widzę kolejne błędy, a ja jestem przewijanie Wyniki wyszukiwania:

2016/03/22 11:03:38 - 265885 FATAL: [Daemon.pm][8221]: Something gone wrong, error $VAR1 = bless({ 
'msg' => '[Missing] ** [http://localhost:9200]-[404] Not Found, called from sub Search::Elasticsearch::Scroll::next at searcher.pl line 92. With vars: {\'body\' => {\'hits\' => {\'hits\' => [],\'max_score\' => \'0\',\'total\' => 5215},\'timed_out\' => bless(do{\\(my $o = 0)}, \'JSON::XS::Boolean\'),\'_shards\' => {\'failures\' => [{\'index\' => undef,\'reason\' => {\'reason\' => \'No search context found for id [4920053]\',\'type\' => \'search_context_missing_exception\'},\'shard\' => -1},{\'index\' => undef,\'reason\' => {\'reason\' => \'No search context found for id [5051485]\',\'type\' => \'search_context_missing_exception\'},\'shard\' => -1},{\'index\' => undef,\'reason\' => {\'reason\' => \'No search context found for id [4920059]\',\'type\' => \'search_context_missing_exception\'},\'shard\' => -1},{\'index\' => undef,\'reason\' => {\'reason\' => \'No search context found for id [5051496]\',\'type\' => \'search_context_missing_exception\'},\'shard\' => -1},{\'index\' => undef,\'reason\' => {\'reason\' => \'No search context found for id [5051500]\',\'type\' => \'search_context_missing_exception\'},\'shard\' => -1}],\'failed\' => 5,\'successful\' => 0,\'total\' => 5},\'_scroll_id\' => \'c2NhbjswOzE7dG90YWxfaGl0czo1MjE1Ow==\',\'took\' => 2},\'request\' => {\'serialize\' => \'std\',\'path\' => \'/_search/scroll\',\'ignore\' => [],\'mime_type\' => \'application/json\',\'body\' => \'c2Nhbjs1OzQ5MjAwNTM6bHExbENzRDVReEc0OV9UMUgzd3Vkdzs1MDUxNDg1OnJrQ3lsUkRKVHRxRWRWeURoOTB4WVE7NDkyMDA1OTpscTFsQ3NENVF4RzQ5X1QxSDN3dWR3OzUwNTE0OTY6cmtDeWxSREpUdHFFZFZ5RGg5MHhZUTs1MDUxNTAwOnJrQ3lsUkRKVHRxRWRWeURoOTB4WVE7MTt0b3RhbF9oaXRzOjUyMTU7\',\'qs\' => {\'scroll\' => \'1m\'},\'method\' => \'GET\'},\'status_code\' => 404} 
', 
'stack' => [ 
       [ 
       'searcher.pl', 
       92, 
       'Search::Elasticsearch::Scroll::next' 
       ] 
      ], 
'text' => '[http://localhost:9200]-[404] Not Found', 
'vars' => { 
      'body' => { 
         'hits' => { 
            'hits' => [], 
            'max_score' => '0', 
            'total' => 5215 
            }, 
         'timed_out' => bless(do{\(my $o = 0)}, 'JSON::XS::Boolean'), 
         '_shards' => { 
             'failures' => [ 
                 { 
                  'index' => undef, 
                  'reason' => { 
                     'reason' => 'No search context found for id [4920053]', 
                     'type' => 'search_context_missing_exception' 
                     }, 
                  'shard' => -1 
                 }, 
                 { 
                  'index' => undef, 
                  'reason' => { 
                     'reason' => 'No search context found for id [5051485]', 
                     'type' => 'search_context_missing_exception' 
                     }, 
                  'shard' => -1 
                 }, 
                 { 
                  'index' => undef, 
                  'reason' => { 
                     'reason' => 'No search context found for id [4920059]', 
                     'type' => 'search_context_missing_exception' 
                     }, 
                  'shard' => -1 
                 }, 
                 { 
                  'index' => undef, 
                  'reason' => { 
                     'reason' => 'No search context found for id [5051496]', 
                     'type' => 'search_context_missing_exception' 
                     }, 
                  'shard' => -1 

                             }, 
                 { 
                  'index' => undef, 
                  'reason' => { 
                     'reason' => 'No search context found for id [5051500]', 
                     'type' => 'search_context_missing_exception' 
                     }, 
                  'shard' => -1 
                 } 
                 ], 
             'failed' => 5, 
             'successful' => 0, 
             'total' => 5 
             }, 
         '_scroll_id' => 'c2NhbjswOzE7dG90YWxfaGl0czo1MjE1Ow==', 
         'took' => 2 
         }, 
      'request' => { 
          'serialize' => 'std', 
          'path' => '/_search/scroll', 
          'ignore' => [], 
          'mime_type' => 'application/json', 
          'body' => 'c2Nhbjs1OzQ5MjAwNTM6bHExbENzRDVReEc0OV9UMUgzd3Vkdzs1MDUxNDg1OnJrQ3lsUkRKVHRxRWRWeURoOTB4WVE7NDkyMDA1OTpscTFsQ3NENVF4RzQ5X1QxSDN3dWR3OzUwNTE0OTY6cmtDeWxSREpUdHFFZFZ5RGg5MHhZUTs1MDUxNTAwOnJrQ3lsUkRKVHRxRWRWeURoOTB4WVE7MTt0b3RhbF9oaXRzOjUyMTU7', 
          'qs' => { 
             'scroll' => '1m' 
            }, 
          'method' => 'GET' 
          }, 
      'status_code' => 404 
      }, 
'type' => 'Missing' 
}, 'Search::Elasticsearch::Error::Missing'); 

Kod używam jest następny (uproszczony):

# Retrieve scroll 
my $scroll = $self->getScrollBySignature($item); 

# Retrieve all affected documents ids 
while (my @docs = $scroll->next(500)) { 
    # Do stuff with @docs 
} 

funkcja getScrollBySignature mieć następny kod, aby zadzwonić do elasticSearch

my $scroll = $self->{ELASTIC}->scroll_helper(
    index    => $self->{INDEXES}, 
    search_type  => 'scan', 
    ignore_unavailable => 1, 
    body    => { 
     size => $self->{PAGINATION}, 
     query => { 
      filtered => { 
       filter => { 
        bool => { 
         must => [{term => {signature_id => $item->{profileId}}}, {terms => {channel_type_id => $type}}] 
        } 
       } 
      } 
     } 
    } 
); 

Jak widzisz, robię zwój bez podania parametru przewijania, a następnie, jak mówi dokumentacja, czas przewijania to 1 minuta.

Elastyczne wyszukiwanie to klaster 3 serwerów, a zapytanie kończące się tym błędem pobiera nieco więcej niż 5000 dokumentów.

Moim pierwszym rozwiązaniem było zaktualizowanie czasu życia w celu przewinięcia do 5 minut, a błąd nie został wyświetlony.

Pytanie brzmi, jak rozumiem za każdym razem, gdy dzwonię do $ przewijania-> następnego() czas życia wyłączonego przewijania jest zwiększany o 1m więcej, to jak można otrzymać te błędy związane z kontekstem?

Robię coś w zły sposób?

Dziękuję wszystkim.

+0

Cześć, jestem stoi ten sam problem, nie masz żadnego rozdzielczość? – Himanshu

+0

HI @Himanshu, nie jest jasne rozwiązanie. Jak wyjaśniłem w mojej odpowiedzi, zaktualizowałem czas życia przewijania do 5 minut, a to zachowanie spowodowało magię.Oto przykład: 'moja $ scroll = $ własnym -> {ELASTIC} -> scroll_helper ( \t \t index => $ własnym -> {INDEXES}, \t \t search_type => 'scan', \t \t przewijania => '5m' \t \t ignore_unavailable => 1 \t \t ciało => { \t \t \t wielkość => $ samo -> {paginacji} \t \t \t zapytanie => { \t \t \t \t bool => { \t \t \t \t \t filtr => { \t \t \t \t \t \t termin => {media_id => $ item -> {ProfileID}} \t \t \t \t \t} \t \t \t \t} \t \t \t} } \t \t} \t); ' – jordivador

Odpowiedz

0

Dobra zasada jest w bloku ->next(), nie pozostań przez iterację więcej niż czas skonfigurowany w przewijaniu.

Pomiędzy każdym wywołaniem ->next() nie można pozostać dłużej niż skonfigurowany czas. Jeśli pozostaniesz dłużej, przewijanie może tam nie być i pojawi się błąd earch_context_missing_exception.

Moim rozwiązaniem tego problemu było to, że wewnątrz następnego bloku przechowywane są dane w strukturze tablicowej/hashowej, a po zakończeniu procesu przewijania praca z wszystkimi danymi.

Rozwiązanie przykład pytanie:

# Retrieve scroll 
    my $scroll = $self->getScrollBySignature($item); 

    # Retrieve all affected documents ids 
    my @allDocs; 
    while (my @docs = $scroll->next(500)) { 
     push @allDocs, map {$_->{_id}} @docs 
    } 

    foreach (@allDocs) { 
     # Do stuff with doc 
    } 
1

Pierwszą rzeczą, która przychodzi do głowy, jest to, że licznik czasu nie jest aktualizowany. Sprawdziłeś to? Możesz np. Wykonać zapytanie co 10 sekund i sprawdzić, czy przy 6. zapytaniu podaje błąd ...