diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-09-14 13:10:18 +0000 |
---|---|---|
committer | Geir Storli <geirst@yahooinc.com> | 2022-09-14 13:10:18 +0000 |
commit | 478610966b8f235cb9da78099e77e1b2a9b38dce (patch) | |
tree | dc211233fc11a53b489a83d60c6495187e61ad31 /container-search/src/main/java/com/yahoo/prelude | |
parent | 736524f0c11604d167d73f5dffab65d7692e0d73 (diff) |
Handle array of string fields when converting the backend binary highlighting.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java b/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java index 44c490b8ed1..4fc3f7919cf 100644 --- a/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java @@ -11,6 +11,11 @@ import com.yahoo.component.ComponentId; import com.yahoo.component.chain.dependencies.After; import com.yahoo.component.chain.dependencies.Before; import com.yahoo.component.chain.dependencies.Provides; +import com.yahoo.data.access.ArrayTraverser; +import com.yahoo.data.access.Inspectable; +import com.yahoo.data.access.Inspector; +import com.yahoo.data.access.Type; +import com.yahoo.data.access.simple.Value; import com.yahoo.prelude.Index; import com.yahoo.prelude.IndexFacts; import com.yahoo.search.Searcher; @@ -104,14 +109,51 @@ public class JuniperSearcher extends Searcher { for (Index index : indexFacts.getIndexes(searchDefinitionField.toString())) { if (index.getDynamicSummary() || index.getHighlightSummary()) { - HitField fieldValue = fastHit.buildHitField(index.getName(), true); - if (fieldValue != null) - insertTags(fieldValue, bolding, index.getDynamicSummary()); + var field = fastHit.getField(index.getName()); + if (StringArrayConverter.shouldHandleField(field)) { + new StringArrayConverter(fastHit, index, field, bolding); + } else { + HitField fieldValue = fastHit.buildHitField(index.getName(), true); + if (fieldValue != null) { + insertTags(fieldValue, bolding, index.getDynamicSummary()); + } + } } } } } + private class StringArrayConverter implements ArrayTraverser { + + private Index index; + private boolean bolding; + private Value.ArrayValue convertedField = new Value.ArrayValue(); + + /** + * This converts the backend binary highlighting of each item in an array of string field, + * and creates a new field that replaces the original. + */ + StringArrayConverter(FastHit hit, Index index, Object field, boolean bolding) { + this.index = index; + this.bolding = bolding; + ((Inspectable)field).inspect().traverse(this); + hit.setField(index.getName(), convertedField); + } + + static boolean shouldHandleField(Object field) { + return (field instanceof Inspectable) && + (((Inspectable)field).inspect().type() == Type.ARRAY); + } + + @Override + public void entry(int idx, Inspector inspector) { + // This is how HitField is instantiated in Hit.buildHitField() when forceNoPreTokenize=true. + var hitField = new HitField(index.getName(), inspector.asString(), false); + insertTags(hitField, bolding, index.getDynamicSummary()); + convertedField.add(hitField.getContent()); + } + } + private void insertTags(HitField field, boolean bolding, boolean dynteaser) { boolean insideHighlight = false; for (ListIterator<FieldPart> i = field.listIterator(); i.hasNext();) { |