private boolean getDebugRendering(Query q) { return q != null && q.properties().getBoolean(DEBUG_RENDERING_KEY, false); }
/** * Returns the number of milliseconds to wait for a response from a search backend * before timing it out. Default is 500. * <p> * Note: If Ranking.RANKFEATURES is turned on, this is hardcoded to 6 minutes. * * @return timeout in milliseconds. */ public long getTimeout() { return properties().getBoolean(Ranking.RANKFEATURES, false) ? dumpTimeout : timeout; }
static int getQueryFlags(Query query) { int flags = QFLAG_EXTENDED_COVERAGE | QFLAG_COVERAGE_NODES; flags |= query.properties().getBoolean(com.yahoo.search.query.Model.ESTIMATE) ? QFLAG_ESTIMATE : 0; flags |= query.getNoCache() ? QFLAG_NO_RESULTCACHE : 0; flags |= query.properties().getBoolean(Ranking.RANKFEATURES, false) ? QFLAG_DUMP_FEATURES : 0; return flags; }
/** * If the query can be directed to a single local content node, returns that node. Otherwise, * returns an empty value. */ private Optional<Node> getDirectNode(Query query) { if (!query.properties().getBoolean(dispatchDirect, true)) return Optional.empty(); if (query.properties().getBoolean(com.yahoo.search.query.Model.ESTIMATE)) return Optional.empty(); Optional<Node> directDispatchRecipient = dispatcher.searchCluster().directDispatchTarget(); if (!directDispatchRecipient.isPresent()) return Optional.empty(); // Dispatch directly to the single, local search node Node local = directDispatchRecipient.get(); query.trace(false, 2, "Dispatching directly to ", local); return Optional.of(local); }
static int getQueryFlags(Query query) { int flags = 0; boolean requestCoverage=true; // Always request coverage information flags |= 0; // was collapse flags |= query.properties().getBoolean(Model.ESTIMATE) ? 0x00000080 : 0; flags |= (query.getRanking().getFreshness() != null) ? 0x00002000 : 0; flags |= requestCoverage ? 0x00008000 : 0; flags |= query.getNoCache() ? 0x00010000 : 0; flags |= 0x00020000; // was PARALLEL flags |= query.properties().getBoolean(Ranking.RANKFEATURES,false) ? 0x00040000 : 0; return flags; }
public Optional<SearchInvoker> getSearchInvoker(Query query, FS4InvokerFactory fs4InvokerFactory) { if (multilevelDispatch || ! query.properties().getBoolean(dispatchInternal, internalDispatchByDefault)) { return Optional.empty(); } Optional<SearchInvoker> invoker = getSearchPathInvoker(query, fs4InvokerFactory::getSearchInvoker); if (!invoker.isPresent()) { invoker = getInternalInvoker(query, fs4InvokerFactory::getSearchInvoker); } if (invoker.isPresent() && query.properties().getBoolean(com.yahoo.search.query.Model.ESTIMATE)) { query.setHits(0); query.setOffset(0); } return invoker; }
public Optional<FillInvoker> getFillInvoker(Result result, VespaBackEndSearcher searcher, DocumentDatabase documentDb, FS4InvokerFactory fs4InvokerFactory) { Optional<FillInvoker> rpcInvoker = rpcResourcePool.getFillInvoker(result.getQuery(), searcher, documentDb); if (rpcInvoker.isPresent()) { return rpcInvoker; } if (result.getQuery().properties().getBoolean(dispatchInternal, internalDispatchByDefault)) { Optional<FillInvoker> fs4Invoker = fs4InvokerFactory.getFillInvoker(result); if (fs4Invoker.isPresent()) { return fs4Invoker; } } return Optional.empty(); }
public Optional<FillInvoker> getFillInvoker(Query query, VespaBackEndSearcher searcher, DocumentDatabase documentDb) { if (query.properties().getBoolean(dispatchSummaries, true) && ! searcher.summaryNeedsQuery(query) && query.getRanking().getLocation() == null && ! searcher.getCacheControl().useCache(query)) { return Optional.of(new RpcFillInvoker(this, documentDb)); } else { return Optional.empty(); } }
private void filter(Result result) { Set<String> requestedFields; if (result.getQuery().properties().getBoolean(FIELD_FILTER_DISABLE)) return; if (result.getQuery().getPresentation().getSummaryFields().isEmpty()) return; requestedFields = result.getQuery().getPresentation().getSummaryFields(); for (Iterator<Hit> i = result.hits().unorderedDeepIterator(); i.hasNext();) { Hit h = i.next(); if (h.isMeta()) continue; h.fieldKeys().retainAll(requestedFields); } }
private boolean shouldBeDegraded(Query query, IndexFacts.Session indexFacts) { if (query.getRanking().getSorting() == null) return false; if (query.getRanking().getSorting().fieldOrders().isEmpty()) return false; if ( ! query.getSelect().getGrouping().isEmpty()) return false; if ( ! query.properties().getBoolean(DEGRADING, true)) return false; Index index = indexFacts.getIndex(query.getRanking().getSorting().fieldOrders().get(0).getFieldName()); if (index == null) return false; if ( ! index.isFastSearch()) return false; if ( ! index.isNumerical()) return false; return true; }
@Override public void fill(Result result, String summaryClass, Execution execution) { execution.fill(result, summaryClass); Set<String> summaryFields = result.getQuery().getPresentation().getSummaryFields(); if (summaryFields.isEmpty() || summaryClass == null || result.getQuery().properties().getBoolean(FIELD_FILLER_DISABLE)) { return; } if (intersectionOfAttributes.containsAll(summaryFields)) { if ( ! Execution.ATTRIBUTEPREFETCH.equals(summaryClass)) { execution.fill(result, Execution.ATTRIBUTEPREFETCH); } } else { // Yes, summaryClass may be Execution.ATTRIBUTEPREFETCH here if ( ! summaryDb.hasAll(summaryFields, summaryClass, result.getQuery().getModel().getRestrict())) { execution.fill(result, null); } } }
@Override public Result search(Query query, Execution execution) { if (enabled && query.properties().getBoolean(PARAM_ENABLED, true)) { ExpressionVisitor visitor = new MyVisitor(); for (GroupingRequest req : query.getSelect().getGrouping()) req.getRootOperation().visitExpressions(visitor); } return execution.search(query); }
@Override public Result search(Query query, Execution execution) { List<PhraseMatcher.Phrase> phrases = phraseMatcher.matchPhrases(query.getModel().getQueryTree().getRoot()); if (phrases != null && !query.properties().getBoolean(suggestonly, false)) { remove(phrases); query.trace("Removing stop words",true,2); } return execution.search(query); }
void cache(CacheKey key, Query query, DocsumPacketKey[] packetKeys, Packet[] packets, Optional<Integer> distributionKey) { if ( ! activeCache) return; if (query.getNoCache()) return; if (query.properties().getBoolean(nocachewrite)) return; PacketWrapper wrapper = lookup(key, query); if (wrapper == null) { wrapper = new PacketWrapper(key, packetKeys, packets, distributionKey); long now = System.currentTimeMillis(); synchronized (packetCache) { packetCache.put(key, wrapper, now); } } else { wrapper = (PacketWrapper) wrapper.clone(); wrapper.addResultPacket((QueryResultPacket) packets[0]); wrapper.addDocsums(packetKeys, packets, 1); synchronized (packetCache) { packetCache.put(key, wrapper, wrapper.getTimestamp()); } } }
/** * Look at a "reasonable" number of this by default. We don't want to set this too low because it impacts * the totalHits value returned. * <p> * If maxhits/offset is set high, use that as the default instead because it means somebody will want to be able to * get lots of hits. We could use hits+offset instead of maxhits+maxoffset but that would destroy pagination * with large values because totalHits is wrong. * <p> * If we ever get around to estimate totalhits we can rethink this. */ private long decideDefaultMaxHits(Query query) { int maxHits; int maxOffset; if (query.properties().getBoolean(PAGINATION, true)) { maxHits = query.properties().getInteger(DefaultProperties.MAX_HITS); maxOffset = query.properties().getInteger(DefaultProperties.MAX_OFFSET); } else { maxHits = query.getHits(); maxOffset = query.getOffset(); } return maxHits + maxOffset; }
@Override public Result search(Query query, Execution execution) { if (query.properties().getBoolean(rulesOff)) return execution.search(query); int traceLevel= query.properties().getInteger(tracelevelRules, query.getTraceLevel()-2); if (traceLevel<0) traceLevel=0; RuleBase ruleBase=resolveRuleBase(query); if (ruleBase==null) return execution.search(query); String error=ruleBase.analyze(query,traceLevel); if (error!=null) return handleError(ruleBase, query,error); else return execution.search(query); }
@Override public Result search(Query query, Execution execution) { if (phraseMatcher.isEmpty()) return execution.search(query); List<PhraseMatcher.Phrase> replacePhrases = phraseMatcher.matchPhrases(query.getModel().getQueryTree().getRoot()); if (replacePhrases != null && ! query.properties().getBoolean(suggestonly, false)) { replace(replacePhrases); query.trace("Replacing phrases", true, 2); } return execution.search(query); }
@Override public Result search(Query query, Execution execution) { Result r; long when = query.getStartTime() / 1000L; Hit meta = null; directory.update(when); if (useMetaHit) { if (query.properties().getBoolean(propertyName, false)) { List<QueryRatePerSecond> l = merge(directory.fetch()); Tuple2<Integer, Double> maxAndMean = maxAndMean(l); meta = new QpsHit(maxAndMean.first, maxAndMean.second); } } r = execution.search(query); if (meta != null) { r.hits().add(meta); } return r; }
@Override public Result search(Query query, Execution execution) { if (query.properties().getBoolean(DISABLE)) return execution.search(query); IndexFacts.Session indexFacts = execution.context().getIndexFacts().newSession(query); Item newRoot = replaceTerms(query, indexFacts); query.getModel().getQueryTree().setRoot(newRoot); query.trace(getFunctionName(), true, 2); Highlight highlight = query.getPresentation().getHighlight(); if (highlight != null) { Set<String> highlightFields = highlight.getHighlightItems().keySet(); for (String field : highlightFields) { StemMode stemMode = indexFacts.getIndex(field).getStemMode(); if (stemMode != StemMode.NONE) { StemContext context = new StemContext(); context.language = Language.ENGLISH; context.indexFacts = indexFacts; Item newHighlight = scan(highlight.getHighlightItems().get(field), context); highlight.getHighlightItems().put(field, (AndItem)newHighlight); } } } return execution.search(query); }
/** Used from container SDK, for internal use only */ public Result searchAndFill(Query query, Chain<? extends Searcher> searchChain, SearchChainRegistry registry) { Result errorResult = validateQuery(query); if (errorResult != null) return errorResult; Renderer<Result> renderer = rendererRegistry.getRenderer(query.getPresentation().getRenderer()); // docsumClass null means "unset", so we set it (it might be null // here too in which case it will still be "unset" after we set it :-) if (query.getPresentation().getSummary() == null && renderer instanceof com.yahoo.search.rendering.Renderer) query.getPresentation().setSummary(((com.yahoo.search.rendering.Renderer) renderer).getDefaultSummaryClass()); Execution execution = new Execution(searchChain, new Execution.Context(registry, indexFacts, specialTokens, rendererRegistry, linguistics)); query.getModel().setExecution(execution); execution.trace().setForceTimestamps(query.properties().getBoolean(FORCE_TIMESTAMPS, false)); if (query.properties().getBoolean(DETAILED_TIMING_LOGGING, false)) { // check and set (instead of set directly) to avoid overwriting stuff from prepareForBreakdownAnalysis() execution.context().setDetailedDiagnostics(true); } Result result = execution.search(query); ensureQuerySet(result, query); execution.fill(result, result.getQuery().getPresentation().getSummary()); traceExecutionTimes(query, result); traceVespaVersion(query); traceRequestAttributes(query); return result; }