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 <julian.maurice@biblibre.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
if (!defined $all_mappings{$self->index}) {
$sort_fields{$self->index} = {};
# Clone the general mapping to break ties with the original hash
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 {
my $marcflavour = lc C4::Context->preference('marcflavour');
$self->_foreach_mapping(
sub {
- $mappings->{data}{properties}{$name} = _get_elasticsearch_field_config('search', $es_type);
+ $mappings->{properties}{$name} = _get_elasticsearch_field_config('search', $es_type);
- $mappings->{data}{properties}{ $name . '__facet' } = _get_elasticsearch_field_config('facet', $es_type);
+ $mappings->{properties}{ $name . '__facet' } = _get_elasticsearch_field_config('facet', $es_type);
- $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) {
}
# 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;
}
}
);
$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}});
$all_mappings{$self->index} = $mappings;
}
$self->sort_fields(\%{$sort_fields{$self->index}});
my $elasticsearch = $self->get_elasticsearch();
my $mappings = $self->get_elasticsearch_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::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::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();
}
$self->set_index_status_ok();
}
my $result = $elasticsearch->bulk(
index => $self->index_name,
type => 'data',
my $result = $elasticsearch->bulk(
index => $self->index_name,
type => 'data',
+ include_type_name => JSON::true(),
body => \@body,
);
if ($result->{errors}) {
body => \@body,
);
if ($result->{errors}) {
$m = exists $koha_to_index_name->{$m} ? $koha_to_index_name->{$m} : $m;
push @indexes, $m;
$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
}
for ( my $i = 0 ; $i < @$value ; $i++ ) {
next unless $value->[$i]; #clean empty form values, ES doesn't like undefined searches
my ($self, $f) = @_;
my $mappings = $self->get_elasticsearch_mappings();
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 {
if (!defined $self->sort_fields()->{$f} || $self->sort_fields()->{$f}) {
$f .= '__sort';
} else {