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

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

Replies are listed 'Best First'.
Re^3: Return value of Search::Elasticsearch search query
by Corion (Patriarch) on Jul 09, 2016 at 21:32 UTC

    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,$/; }

        You seem highly confused about data structures.</o>

        What do you mean by "working only for first element"? The first element of what? You never change $condition.

        Maybe you can manually create the data structure you want and then find out how to create that structure programmatically.