diff options
Diffstat (limited to 'container-search/src/main/java')
9 files changed, 61 insertions, 29 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java index e0d18f2b571..2eec7109722 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java @@ -15,7 +15,7 @@ import com.yahoo.data.access.simple.Value.StringValue; * A regular hit from a Vespa backend * * @author bratseth - * @author steinar + * @author Steinar Knutsen */ public class FastHit extends Hit { @@ -271,12 +271,14 @@ public class FastHit extends Hit { public void addSummary(Docsum docsum) { LazyDocsumValue lazyDocsumValue = new LazyDocsumValue(docsum); + reserve(docsum.getDefinition().getFieldCount()); for (DocsumField field : docsum.getDefinition().getFields()) { setDocsumFieldIfNotPresent(field.getName(), lazyDocsumValue); } } void addSummary(DocsumDefinition docsumDef, Inspector value) { + reserve(docsumDef.getFieldCount()); for (DocsumField field : docsumDef.getFields()) { String fieldName = field.getName(); if (value.type() == Type.STRING && @@ -322,10 +324,6 @@ public class FastHit extends Hit { needXmlEscape = ! (fieldType instanceof XMLField); this.contents = contents; } - public RawField(byte [] contents) { - needXmlEscape = true; - this.contents = contents; - } public byte [] getUtf8() { return contents; } public boolean needXmlEscape() { return needXmlEscape; } @@ -359,10 +357,6 @@ public class FastHit extends Hit { return queryPacketData; } - public void clearQueryPacketData() { - queryPacketData = null; - } - CacheKey getCacheKey() { return cacheKey; } diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java index 3369eb64094..1a7e693caa7 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java @@ -396,6 +396,16 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { s.append(" location=") .append(query.getRanking().getLocation().toString()); } + + if (query.getGroupingSessionCache()) { + s.append(" groupingSessionCache=true"); + } + if (query.getRanking().getQueryCache()) { + s.append(" ranking.queryCache=true"); + } + if (query.getGroupingSessionCache() || query.getRanking().getQueryCache()) { + s.append(" sessionId=" + query.getSessionId(true)); + } List<Grouping> grouping = GroupingExecutor.getGroupingList(query); s.append(" grouping=").append(grouping.size()).append(" : "); diff --git a/container-search/src/main/java/com/yahoo/prelude/querytransform/NormalizingSearcher.java b/container-search/src/main/java/com/yahoo/prelude/querytransform/NormalizingSearcher.java index 3b9a03bb5da..02c8ecda60c 100644 --- a/container-search/src/main/java/com/yahoo/prelude/querytransform/NormalizingSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/querytransform/NormalizingSearcher.java @@ -52,10 +52,12 @@ public class NormalizingSearcher extends Searcher { } protected void normalize(Query query, IndexFacts.Session indexFacts) { - String oldQuery = (query.getTraceLevel() >= 2) ? query.getModel().getQueryTree().getRoot().toString() : ""; + String oldQuery = (query.getTraceLevel() >= 2) ? query.getModel().getQueryTree().getRoot().toString() : null; + normalizeBody(query, indexFacts); - if (query.getTraceLevel() >= 2) - if (!(oldQuery.equals(query.getModel().getQueryTree().getRoot().toString()))) query.trace(getFunctionName(), true, 2); + + if (query.getTraceLevel() >= 2 && ! query.getModel().getQueryTree().getRoot().toString().equals(oldQuery)) + query.trace(getFunctionName(), true, 2); } private Query normalizeBody(Query query, IndexFacts.Session indexFacts) { @@ -63,19 +65,18 @@ public class NormalizingSearcher extends Searcher { Language language = query.getModel().getParsingLanguage(); if (root instanceof BlockItem) { List<Item> rootItems = new ArrayList<>(1); - rootItems.add(root); ListIterator<Item> i = rootItems.listIterator(); - i.next(); normalizeBlocks(language, indexFacts, (BlockItem) root, i); - query.getModel().getQueryTree().setRoot(rootItems.get(0)); + if ( ! rootItems.isEmpty()) // give up normalizing if the root was removed + query.getModel().getQueryTree().setRoot(rootItems.get(0)); } else if (root instanceof CompositeItem) { query.getModel().getQueryTree().setRoot(normalizeComposite(language, indexFacts, (CompositeItem) root)); } return query; } - + private Item normalizeComposite(Language language, IndexFacts.Session indexFacts, CompositeItem item) { if (item instanceof PhraseItem) { return normalizePhrase(language, indexFacts, (PhraseItem) item); diff --git a/container-search/src/main/java/com/yahoo/search/Query.java b/container-search/src/main/java/com/yahoo/search/Query.java index 509a5f3d1de..53b39046f1d 100644 --- a/container-search/src/main/java/com/yahoo/search/Query.java +++ b/container-search/src/main/java/com/yahoo/search/Query.java @@ -153,7 +153,7 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { private QueryContext context = null; /** Used for downstream session caches */ - private final AtomicReference<UniqueRequestId> sessionId = new AtomicReference<>(); + private UniqueRequestId requestId = null; //--------------- Owned sub-objects containing query properties ---------------- @@ -936,6 +936,7 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { clone.setOffset(getOffset()); clone.setNoCache(getNoCache()); clone.setGroupingSessionCache(getGroupingSessionCache()); + clone.requestId = null; // Each clone should have their own requestId. } /** Returns the presentation to be used for this query, never null */ @@ -962,18 +963,13 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { * @return the session id of this query, or null if not set and create is false */ public SessionId getSessionId(boolean create) { - UniqueRequestId uniqId = sessionId.get(); - if (uniqId == null && ! create) return null; + if (requestId == null && ! create) return null; - if (uniqId == null && create) { - uniqId = UniqueRequestId.next(); - sessionId.compareAndSet(null, uniqId); - uniqId = sessionId.get(); + if (requestId == null && create) { + requestId = UniqueRequestId.next(); } - String rankProfile = getRanking().getProfile(); - - return new SessionId(uniqId, rankProfile); + return new SessionId(requestId, getRanking().getProfile()); } public boolean hasEncodableProperties() { diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java index 003ba9a5261..6b4d3594087 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java @@ -21,7 +21,6 @@ import com.yahoo.slime.BinaryFormat; import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; import com.yahoo.data.access.Inspector; -import com.yahoo.text.Utf8String; import com.yahoo.vespa.config.search.DispatchConfig; import java.util.Iterator; @@ -228,6 +227,7 @@ public class Dispatcher extends AbstractComponent { } private void fill(FastHit hit, Inspector summary) { + hit.reserve(summary.fieldCount()); summary.traverse((String name, Inspector value) -> { hit.setField(name, nativeTypeOf(value)); }); diff --git a/container-search/src/main/java/com/yahoo/search/query/SessionId.java b/container-search/src/main/java/com/yahoo/search/query/SessionId.java index c6e34e7e430..b065bd9a0a9 100644 --- a/container-search/src/main/java/com/yahoo/search/query/SessionId.java +++ b/container-search/src/main/java/com/yahoo/search/query/SessionId.java @@ -22,4 +22,19 @@ public class SessionId { } public Utf8String asUtf8String() { return id; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SessionId sessionId = (SessionId) o; + + return id.equals(sessionId.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java index c39f0387d46..dd8e261a6b7 100644 --- a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java +++ b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java @@ -488,7 +488,8 @@ public class JsonRenderer extends AsynchronousSectionedRenderer<Result> { if (id != null) generator.writeStringField(ID, id); - generator.writeNumberField(RELEVANCE, hit.getRelevance().getScore()); + generator.writeFieldName(RELEVANCE); + generator.writeNumber(hit.getRelevance().toString()); if (hit.types().size() > 0) { // TODO: Remove types rendering on Vespa 7 generator.writeArrayFieldStart(TYPES); diff --git a/container-search/src/main/java/com/yahoo/search/result/Hit.java b/container-search/src/main/java/com/yahoo/search/result/Hit.java index 815006edbf5..0bfbecfd9ab 100644 --- a/container-search/src/main/java/com/yahoo/search/result/Hit.java +++ b/container-search/src/main/java/com/yahoo/search/result/Hit.java @@ -101,8 +101,12 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi public static final String SDDOCNAME_FIELD = "sddocname"; private Map<String,Object> getFieldMap() { + return getFieldMap(16); + } + private Map<String,Object> getFieldMap(int minSize) { if (fields == null) { - fields = new LinkedHashMap<>(16); + // Compensate for loadfactor and then some, rounded up.... + fields = new LinkedHashMap<>(2*minSize); } return fields; } @@ -448,6 +452,14 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi public final Map<String,Object> fields() { return getUnmodifiableFieldMap(); } /** + * Will preallocate in order to avoid resizing. + * @param minSize + */ + public void reserve(int minSize) { + getFieldMap(minSize); + } + + /** * Fields * @return An iterator for traversing the fields * @since 5.1.3 diff --git a/container-search/src/main/java/com/yahoo/search/result/Relevance.java b/container-search/src/main/java/com/yahoo/search/result/Relevance.java index 7737b01cc14..2f6967ee794 100644 --- a/container-search/src/main/java/com/yahoo/search/result/Relevance.java +++ b/container-search/src/main/java/com/yahoo/search/result/Relevance.java @@ -47,6 +47,9 @@ public class Relevance implements Comparable<Relevance> { */ @Override public String toString() { + if (Double.isNaN(score) || Double.isInfinite(score)) { + return "0.0"; + } return DoubleFormatter.stringValue(score); } |