aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-09-14 13:10:18 +0000
committerGeir Storli <geirst@yahooinc.com>2022-09-14 13:10:18 +0000
commit478610966b8f235cb9da78099e77e1b2a9b38dce (patch)
treedc211233fc11a53b489a83d60c6495187e61ad31 /container-search/src/main/java/com/yahoo/prelude
parent736524f0c11604d167d73f5dffab65d7692e0d73 (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.java48
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();) {