Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Return value of Search::Elasticsearch search query

by Laurent_R (Canon)
on Jul 09, 2016 at 09:00 UTC ( [id://1167497]=note: print w/replies, xml ) Need Help??


in reply to Return value of Search::Elasticsearch search query

I thinlk that this:
foreach my $sheet (keys %{ $doc{'_source'}{'sheets'} }) { foreach my $columns (@{ $doc{'_source'}{'sheets'}{$sheet}{'formula +tes'} }) { # ...
is uselessly complicated.

If you use the values function instead of the keys function, you don't have to dereference the whole structure several times.

For example, re-using the $doc variable definition provided by Athanasius, you could access the formulas this way:

for my $sheet (values %{ $doc->{_source}{sheets} }) { for my $columns ( values %{$sheet} ) { for my $one ( @{ $columns }) { print "$_->{formula} \n" for values %{$one}; } } }
Which prints out:
((DelvSts = Deleted + RcdTyp = DelAck) & RcdTyp = DelRecpt) ((DelvSts = UserIncomingSMBarred & LFR = SMSC_PR_LC_SMSC_Encoding_Erro +r) | RcdTyp = DelRecpt) (RcdTyp = DelAck + OrigInf = SMPP)
HTH.

Replies are listed 'Best First'.
Re^2: Return value of Search::Elasticsearch search query
by ravi45722 (Pilgrim) on Jul 09, 2016 at 17:37 UTC

    Very nice. Tq But I got another problem. After changing the values in the hash I tried to insert the doc into ES again. But its showing below mentioned error.

    [Request] ** [http://172.16.15.153:9200]-[400] [mapper_parsing_excepti +on] failed to parse, called from sub Search::Elasticsearch::Role::Cli +ent::Direct::__ANON__ at ./complex_regex_bkp.pl line 93. With vars: { +'body' => {'status' => 400,'error' => {'root_cause' => [{'reason' => +'failed to parse','type' => 'mapper_parsing_exception'}],'reason' => +'failed to parse','type' => 'mapper_parsing_exception','caused_by' => + {'reason' => 'Mixing up field types: class org.elasticsearch.index.m +apper.core.StringFieldMapper$StringFieldType != class org.elasticsear +ch.index.mapper.internal.IndexFieldMapper$IndexFieldType on field _in +dex','type' => 'illegal_state_exception'}}},'request' => {'serialize' + => 'std','path' => '/my_app/blog_post/1','ignore' => [],'mime_type' +=> 'application/json','body' => {'_source' => {'sheets' => {'sheet1' +=> {'Sheet_Name' => 'Ex-Sheet','forumle' => [{'1' => {'colName' => 'E +x-Col1','formula' => '{"query":{"constant_score":{"filter":{"bool":{" +should":[{"bool":{"must":[{"term":{"column08":"Submit"}},{"term":{"co +lumn10":"Delivered"}},{"term":{"column09":"Something"}}]}},{"bool":{" +must":[{"term":{"column08":"Delivered"}},{"term":{"column09":"Somethi +ng"}}]}}]}}}}}','total' => 'false'},'0' => {'colName' => 'Ex-Col1','f +ormula' => '{"query":{"constant_score":{"filter":{"bool":{"should":[{ +"bool":{"must":[{"term":{"column08":"Submit"}},{"term":{"column10":"D +elivered"}},{"term":{"column09":"Something"}}]}},{"bool":{"must":[{"t +erm":{"column08":"Delivered"}},{"term":{"column09":"Something"}}]}},{ +"bool":{"must":[{"term":{"column08":"Submit"}},{"term":{"column10":"D +elivered"}},{"term":{"column09":"Something"}}]}},{"bool":{"must":[{"t +erm":{"column08":"Delivered"}},{"term":{"column09":"Something"}}]}}]} +}}}}','total' => 'false'},'2' => {'colName' => 'Ex-Col1','formula' => + '{"query":{"constant_score":{"filter":{"bool":{"must":[{"term":{"col +umn08":"Submit"}},{"term":{"column10":"Delivered"}},{"term":{"column0 +9":"Something"}}]}}}}}','total' => 'false'}}]}}},'_index' => 'testing +','_id' => '2','_type' => 'mytype','found' => bless( do{\(my $o = 1)} +, 'JSON::XS::Boolean' ),'_version' => 20},'qs' => {},'method' => 'POS +T'},'status_code' => 400}

    I know the elastic search needs JSON data as a body. So I tried to convert this into JSON.

    #my $temp = bless $doc; #my $json = encode_json \%temp;

    Then the data is updated without error but the data in DB is like "_source": {"main:HASH(0x25d3100)}". Any help on inserting the data back again

      Please read the error message:

      'reason' => 'failed to parse','type' => 'mapper_parsing_exception','ca +used_by' => {'reason' => 'Mixing up field types: class org.elasticsea +rch.index.mapper.core.StringFieldMapper$StringFieldType != class org. +elasticsearch.index.mapper.internal.IndexFieldMapper$IndexFieldType o +n field _index','type' => 'illegal_state_exception'}}}

      What you submit does not match what Elasticsearch expects for the string field. So you should lean what Elasticsearch expects and then submit the appropriate data types.

      You don't need to convert the Perl data structure to JSON yourself. The Search::Elasticsearch wrappers handle that for you.

        As per the error I am passing multi types(Hash & JSON). I am changing the ES query into JSON. Due to the error I am trying to pass the hash directly. This is my input doc

        { "sheets": { "sheet1": { "Sheet_Name": "Ex-Sheet", "formulating": [ { "0": { "colName": "Ex-Col1", "formula": "((column08=Submit | column10=Deliv +ered | column09=Something) & (column08=Delivered | column09=Something +))", "total": "false" }, "1": { "colName": "Ex-Col1", "formula": "((column08=Submit | column10=Deliv +ered | column09=Something) & (column08=Delivered | column09=Something +))", "total": "false" }, "2": { "colName": "Ex-Col1", "formula": "(column08=Submit & column10=Delive +red & column09=Something)", "total": "false" } } ] } } }

        From this input I am taking the formula field and changing into a ES query (hash). As Athanasius mentioned in the above reply I am replacing the formulae with my hash.

         $columns->{$one}{'formula'} = %main_hash; #main_hash contains ES query

        But its replacing as '1/8'. So I passed that as a address

         $columns->{$one}{'formula'} = \%main_hash;

        But now its working only for first element in the loop. For the second element its showing as

        [$VAR1->{'request'}{'body'}{'_source'}{'sheets'}{'sheet1'}{'forumle'}[ +0]{'1'}{'formula'}{'query'}{'constant_score'}{'filter'}{'bool'}{'shou +ld'}[0],$VAR1->{'request'}{'body'}{'_source'}{'sheets'}{'sheet1'}{'fo +rumle'}[0]{'1'}{'formula'}{'query'}{'constant_score'}{'filter'}{'bool +'}{'should'}[1],{'....

        How to replace my hash in the loop????

        if { ..... } else { my %main_hash = (); $main_hash{"query"}{"constant_score"}{"filter"} = @condition_array +[(int($condition)-1)]; my $json = encode_json \%main_hash; print Dumper \%main_hash; #printing very fine he +re $columns->{$one}{'formula'} = \%main_hash; #$columns is a address + in $doc print Dumper $doc; #Working only for firs +t element #exit; #print $json,$/; }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1167497]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (6)
As of 2024-04-23 10:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found