LP1844418 Direct indexing experiment WIP
authorBill Erickson <berickxx@gmail.com>
Tue, 18 Feb 2020 21:03:10 +0000 (16:03 -0500)
committerBill Erickson <berickxx@gmail.com>
Fri, 21 Feb 2020 21:20:33 +0000 (16:20 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Elastic/BibSearch.pm
Open-ILS/src/perlmods/lib/OpenILS/Elastic/BibSearch/XSLT.pm

index bb8067a..46c6918 100644 (file)
@@ -252,12 +252,17 @@ sub create_index_properties {
 
     my $fields = $self->get_dynamic_fields;
 
+    $logger->info('ES ' . OpenSRF::Utils::JSON->perl2JSON($fields));
+
     for my $field (@$fields) {
+        
 
         my $field_name = $field->name;
         my $search_group = $field->search_group;
         $field_name = "$search_group|$field_name" if $search_group;
 
+        $logger->info("ES ONE FIELD name=$field_name: " . OpenSRF::Utils::JSON->perl2JSON($field));
+
         my $def;
 
         if ($search_group) {
@@ -363,7 +368,8 @@ sub create_index {
             $self->es->indices->put_mapping({
                 index => $index_name,
                 type  => 'record',
-                body  => {dynamic => 'strict', properties => {$field => $properties->{$field}}}
+                #body  => {dynamic => 'strict', properties => {$field => $properties->{$field}}}
+                body  => {properties => {$field => $properties->{$field}}}
             });
         };
 
index bdbb823..8f70a05 100644 (file)
@@ -20,18 +20,32 @@ sub new {
     my ($class, %args) = @_;
     return bless(\%args, $class);
 }
-
+sub name {
+    my $self = shift;
+    return $self->{name};
+}
+sub search_group {
+    my $self = shift;
+    return $self->{search_group};
+}
 sub search_field {
-    return $self->{search_field} ? 't' : 'f';
+    my $self = shift;
+    return $self->{purpose} eq 'search' ? 't' : 'f';
 }
 sub facet_field {
-    return $self->{facet_field} ? 't' : 'f';
+    my $self = shift;
+    return $self->{purpose} eq 'facet' ? 't' : 'f';
 }
 sub sorter {
-    return $self->{sorter} ? 't' : 'f';
+    my $self = shift;
+    return $self->{purpose} eq 'sorter' ? 't' : 'f';
+}
+sub filter {
+    my $self = shift;
+    return $self->{purpose} eq 'filter' ? 't' : 'f';
 }
-
 sub weight {
+    my $self = shift;
     return $self->{weight} || 1;
 }
 
@@ -74,14 +88,23 @@ sub xsl_sheet {
 
 my @seen_fields;
 sub add_dynamic_field {
-    my ($self, $fields, $purpose, $class, $name) = @_;
-    my $tag = $purpose . ($class || '') . $name;
+    my ($self, $fields, $purpose, $search_group, $name, $weight) = @_;
+    return unless $name;
+    $search_group ||= '';
+    $weight ||= 1;
+
+    my $tag = $purpose . ($search_group || '') . $name;
     return if grep {$_ eq $tag} @seen_fields;
+    push(@seen_fields, $tag);
+
+    $logger->info("ES adding dynamic field purpose=$purpose ".
+        "search_group=$search_group name=$name weight=$weight");
 
     my $field = OpenILS::Elastic::BibSearch::BibField->new(
         purpose => $purpose, 
-        class => $class, 
-        name => $name
+        search_group => $search_group, 
+        name => $name,
+        weight => $weight
     );
 
     push(@$fields, $field);
@@ -98,28 +121,29 @@ sub get_dynamic_fields {
     for my $node ($doc->findnodes('//xsl:call-template[@name="add_search_entry"]')) {
         my $class = $node->findnodes('./xsl:with-param[@name="field_class"]/text()');
         my $name = $node->findnodes('./xsl:with-param[@name="index_name"]/text()');
-        $self->add_dynamic_field($fields, 'search', $class, $name);
+        my $weight = $node->findnodes('./xsl:with-param[@name="weight"]/text()');
+        $self->add_dynamic_field($fields, 'search', "$class", "$name", "$weight");
     }
 
     for my $node ($doc->findnodes('//xsl:call-template[@name="add_facet_entry"]')) {
         my $class = $node->findnodes('./xsl:with-param[@name="field_class"]/text()');
         my $name = $node->findnodes('./xsl:with-param[@name="index_name"]/text()');
-        $self->add_dynamic_field($fields, 'facet', $class, $name);
+        $self->add_dynamic_field($fields, 'facet', "$class", "$name");
     }
 
     for my $node ($doc->findnodes('//xsl:call-template[@name="add_filter_entry"]')) {
         my $name = $node->findnodes('./xsl:with-param[@name="name"]/text()');
-        $self->add_dynamic_field($fields, 'filter', undef, $name);
+        $self->add_dynamic_field($fields, 'filter', undef, "$name");
     }
 
     for my $node ($doc->findnodes('//xsl:call-template[@name="add_composite_filter_entry"]')) {
         my $name = $node->findnodes('./xsl:with-param[@name="name"]/text()');
-        $self->add_dynamic_field($fields, 'filter', undef, $name);
+        $self->add_dynamic_field($fields, 'filter', undef, "$name");
     }
 
     for my $node ($doc->findnodes('//xsl:call-template[@name="add_sorter_entry"]')) {
         my $name = $node->findnodes('./xsl:with-param[@name="name"]/text()');
-        $self->add_dynamic_field($fields, 'sorter', undef, $name);
+        $self->add_dynamic_field($fields, 'sorter', undef, "$name");
     }
 
     return $fields;
@@ -137,36 +161,28 @@ sub get_bib_data {
         my $output = $self->xsl_sheet->output_as_chars($result);
 
         my @rows = split(/\n/, $output);
-        my $first = 1;
         for my $row (@rows) {
             my @parts = split(/ /, $row);
-            my $purpose = $parts[0];
 
+            my $purpose = $parts[0];
             my $field = {purpose => $purpose};
 
-            if ($first) {
-                # Stamp the first field with the additional bib metadata.
-                $field->{$_} = $db_rec->{$_} for 
-                    qw/id bib_source metarecord create_date edit_date/;
-                $first = 0;
-            }
-
-            if ($purpose eq 'search') {
+            if ($purpose eq 'search' || $purpose eq 'facet') {
+                next unless @parts > 3;
                 $field->{search_group} = $parts[1];
                 $field->{name} = $parts[2];
-                $field->{weight} = $parts[3];
-                $field->{value} = join(' ', $parts[4..$#parts]);
+                $field->{value} = join(' ', @parts[3 .. $#parts]);
 
-            } elsif ($purpose eq 'facet') {
-                $field->{search_group} = $parts[1];
-                $field->{name} = $parts[2];
-                $field->{value} = join(' ', $parts[3..$#parts]);
-
-            } elsif ($purpose eq 'filter' || $purpose eq 'sorter') {
+            } else { # filter or sorter
+                next unless @parts > 2;
                 $field->{name} = $parts[1];
-                $field->{value} = join(' ', $parts[2..$#parts]);
+                $field->{value} = join(' ', @parts[2 .. $#parts]);
             }
 
+            # Stamp each field with the additional bib metadata.
+            $field->{$_} = $db_rec->{$_} for 
+                qw/id bib_source metarecord create_date edit_date deleted/;
+
             push(@$bib_data, $field);
         }
     }