From 1ea2780871d5d980f62057069bbc8006bf37b9cd Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Mon, 28 Mar 2022 12:00:25 +0000 Subject: [PATCH] Bug 25669: Use include_type_name parameter in ES calls This patch includes the parameter: include_type_name on our ES calls It removes the deprecation warning we are seeing, and should allow using ES7 with no other chnages. For ES8 we will need to remove the hardcoded type, I would suggest a second patch, with a new syspref "ElasticsearchLegacyType" set to 'True' by default. Description can explain that this must be set to false, and data reindexed after upgrading to ES7 and before upgrading to ES8 - then we can drop this pref when we drop ES7 support When we drop ES6 support the pref can be set default true for upgrades, default 'false' for new installs Signed-off-by: Julian Maurice Signed-off-by: Martin Renvoize Signed-off-by: Tomas Cohen Arazi (cherry picked from commit 150a4b03f337f6a58869c67d3681caa64441d53a) Signed-off-by: Lucas Gass (cherry picked from commit 99757c2d975d224ea191622116e6eb839fff70c1) Rebased-by: Victor Grousset/tuxayo Signed-off-by: Arthur Suzuki (cherry picked from commit a1fdcc4f440601272c2e30e92843a60a3850bd6b) Signed-off-by: Victor Grousset/tuxayo --- Koha/SearchEngine/Elasticsearch.pm | 14 ++++---- Koha/SearchEngine/Elasticsearch/Indexer.pm | 36 +++++++++---------- .../Elasticsearch/QueryBuilder.pm | 4 +-- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch.pm b/Koha/SearchEngine/Elasticsearch.pm index 7d54e6448d..4d09ca20ea 100644 --- a/Koha/SearchEngine/Elasticsearch.pm +++ b/Koha/SearchEngine/Elasticsearch.pm @@ -190,9 +190,7 @@ sub get_elasticsearch_mappings { if (!defined $all_mappings{$self->index}) { $sort_fields{$self->index} = {}; # Clone the general mapping to break ties with the original hash - my $mappings = { - data => clone(_get_elasticsearch_field_config('general', '')) - }; + my $mappings = clone(_get_elasticsearch_field_config('general', '')); my $marcflavour = lc C4::Context->preference('marcflavour'); $self->_foreach_mapping( sub { @@ -215,25 +213,25 @@ sub get_elasticsearch_mappings { } if ($search) { - $mappings->{data}{properties}{$name} = _get_elasticsearch_field_config('search', $es_type); + $mappings->{properties}{$name} = _get_elasticsearch_field_config('search', $es_type); } if ($facet) { - $mappings->{data}{properties}{ $name . '__facet' } = _get_elasticsearch_field_config('facet', $es_type); + $mappings->{properties}{ $name . '__facet' } = _get_elasticsearch_field_config('facet', $es_type); } if ($suggestible) { - $mappings->{data}{properties}{ $name . '__suggestion' } = _get_elasticsearch_field_config('suggestible', $es_type); + $mappings->{properties}{ $name . '__suggestion' } = _get_elasticsearch_field_config('suggestible', $es_type); } # Sort is a bit special as it can be true, false, undef. # We care about "true" or "undef", # "undef" means to do the default thing, which is make it sortable. if (!defined $sort || $sort) { - $mappings->{data}{properties}{ $name . '__sort' } = _get_elasticsearch_field_config('sort', $es_type); + $mappings->{properties}{ $name . '__sort' } = _get_elasticsearch_field_config('sort', $es_type); $sort_fields{$self->index}{$name} = 1; } } ); - $mappings->{data}{properties}{ 'match-heading' } = _get_elasticsearch_field_config('search', 'text') if $self->index eq 'authorities'; + $mappings->{properties}{ 'match-heading' } = _get_elasticsearch_field_config('search', 'text') if $self->index eq 'authorities'; $all_mappings{$self->index} = $mappings; } $self->sort_fields(\%{$sort_fields{$self->index}}); diff --git a/Koha/SearchEngine/Elasticsearch/Indexer.pm b/Koha/SearchEngine/Elasticsearch/Indexer.pm index 0c9b3ff380..5143a96181 100644 --- a/Koha/SearchEngine/Elasticsearch/Indexer.pm +++ b/Koha/SearchEngine/Elasticsearch/Indexer.pm @@ -251,24 +251,23 @@ sub update_mappings { my $elasticsearch = $self->get_elasticsearch(); my $mappings = $self->get_elasticsearch_mappings(); - foreach my $type (keys %{$mappings}) { - try { - my $response = $elasticsearch->indices->put_mapping( - index => $self->index_name, - type => $type, - body => { - $type => $mappings->{$type} - } - ); - } catch { - $self->set_index_status_recreate_required(); - my $reason = $_[0]->{vars}->{body}->{error}->{reason}; - my $index_name = $self->index_name; - Koha::Exceptions::Exception->throw( - error => "Unable to update mappings for index \"$index_name\". Reason was: \"$reason\". Index needs to be recreated and reindexed", - ); - }; - } + try { + my $response = $elasticsearch->indices->put_mapping( + index => $self->index_name, + type => 'data', + include_type_name => JSON::true(), + body => { + data => $mappings + } + ); + } catch { + $self->set_index_status_recreate_required(); + my $reason = $_[0]->{vars}->{body}->{error}->{reason}; + my $index_name = $self->index_name; + Koha::Exceptions::Exception->throw( + error => "Unable to update mappings for index \"$index_name\". Reason was: \"$reason\". Index needs to be recreated and reindexed", + ); + }; $self->set_index_status_ok(); } @@ -350,6 +349,7 @@ sub delete_index { my $result = $elasticsearch->bulk( index => $self->index_name, type => 'data', + include_type_name => JSON::true(), body => \@body, ); if ($result->{errors}) { diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index b1591b28e3..2955075c1e 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -577,7 +577,7 @@ sub build_authorities_query_compat { $m = exists $koha_to_index_name->{$m} ? $koha_to_index_name->{$m} : $m; push @indexes, $m; - warn "Unknown search field $m in marclist" unless (defined $mappings->{data}->{properties}->{$m} || $m eq '' || $m eq 'match-heading'); + warn "Unknown search field $m in marclist" unless (defined $mappings->{properties}->{$m} || $m eq '' || $m eq 'match-heading'); } for ( my $i = 0 ; $i < @$value ; $i++ ) { next unless $value->[$i]; #clean empty form values, ES doesn't like undefined searches @@ -1123,7 +1123,7 @@ sub _sort_field { my ($self, $f) = @_; my $mappings = $self->get_elasticsearch_mappings(); - my $textField = defined $mappings->{data}{properties}{$f}{type} && $mappings->{data}{properties}{$f}{type} eq 'text'; + my $textField = defined $mappings->{properties}{$f}{type} && $mappings->{properties}{$f}{type} eq 'text'; if (!defined $self->sort_fields()->{$f} || $self->sort_fields()->{$f}) { $f .= '__sort'; } else { -- 2.20.1