public Term getTerm() { return query.getTerm(); }
BLSpanTermQuery(SpanTermQuery termQuery) { this(termQuery.getTerm()); }
private Query toSpanQueryPrefix(SpanQuery query, float boost) { if (query instanceof SpanTermQuery) { SpanMultiTermQueryWrapper<PrefixQuery> ret = new SpanMultiTermQueryWrapper<>(new PrefixQuery(((SpanTermQuery) query).getTerm())); return boost == 1 ? ret : new BoostQuery(ret, boost); } else if (query instanceof SpanNearQuery) { SpanNearQuery spanNearQuery = (SpanNearQuery) query; SpanQuery[] clauses = spanNearQuery.getClauses(); if (clauses[clauses.length - 1] instanceof SpanTermQuery) { clauses[clauses.length - 1] = new SpanMultiTermQueryWrapper<>( new PrefixQuery(((SpanTermQuery) clauses[clauses.length - 1]).getTerm()) ); } SpanNearQuery newQuery = new SpanNearQuery(clauses, spanNearQuery.getSlop(), spanNearQuery.isInOrder()); return boost == 1 ? newQuery : new BoostQuery(newQuery, boost); } else if (query instanceof SpanOrQuery) { SpanOrQuery orQuery = (SpanOrQuery) query; SpanQuery[] clauses = new SpanQuery[orQuery.getClauses().length]; for (int i = 0; i < clauses.length; i++) { clauses[i] = (SpanQuery) toSpanQueryPrefix(orQuery.getClauses()[i], 1); } return boost == 1 ? new SpanOrQuery(clauses) : new BoostQuery(new SpanOrQuery(clauses), boost); } else { return query; } }
@Override public long reverseMatchingCost(IndexReader reader) { try { return reader.totalTermFreq(query.getTerm()); } catch (IOException e) { throw new RuntimeException(e); } }
@Override public boolean canMakeNfa() { // Subproperties aren't stored in forward index, so we can't match them using NFAs if (query.getTerm().text().contains(ComplexFieldUtil.SUBPROPERTY_SEPARATOR)) return false; return true; }
flatten(sourceQuery, reader, flatQueries, boost); } else if (sourceQuery instanceof SpanTermQuery) { super.flatten(new TermQuery(((SpanTermQuery) sourceQuery).getTerm()), reader, flatQueries, boost); } else if (sourceQuery instanceof ConstantScoreQuery) { flatten(((ConstantScoreQuery) sourceQuery).getQuery(), reader, flatQueries, boost);
@Override public String getRealField() { return query.getTerm().field(); }
protected void flattenQuery(SpanTermQuery query, float pathBoost, Object sourceOverride, IndexReader reader, Callback callback) { callback.flattened(query.getTerm().bytes(), pathBoost, sourceOverride); }
private static BiFunction<Query, Version, Result> spanTermQuery() { return (query, version) -> { Term term = ((SpanTermQuery) query).getTerm(); return new Result(true, Collections.singleton(new QueryExtraction(term)), 1); }; }
private static BiFunction<Query, Version, Result> spanTermQuery() { return (query, version) -> { Term term = ((SpanTermQuery) query).getTerm(); return new Result(true, Collections.singleton(new QueryExtraction(term)), 1); }; }
@Override public BLSpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException { final TermContext context; final IndexReaderContext topContext = searcher.getTopReaderContext(); if (termContext == null || termContext.topReaderContext != topContext) { context = TermContext.build(topContext, query.getTerm()); } else { context = termContext; } Map<Term, TermContext> contexts = needsScores ? Collections.singletonMap(query.getTerm(), context) : null; final SpanTermWeight weight = query.new SpanTermWeight(context, searcher, contexts); return new BLSpanWeight(this, searcher, contexts) { @Override public void extractTermContexts(Map<Term, TermContext> contexts) { weight.extractTermContexts(contexts); } @Override public BLSpans getSpans(LeafReaderContext ctx, Postings requiredPostings) throws IOException { Spans spans = weight.getSpans(ctx, requiredPostings); return spans == null ? null : new BLSpansWrapper(spans); } @Override public void extractTerms(Set<Term> terms) { weight.extractTerms(terms); } }; }
protected void createWeights(String origQuery, SpanNearQuery parsedQuery, Map<String, Float> termWeights, Map<String, Float> bigramWeights, IndexReader reader) throws IOException { SpanQuery[] clauses = parsedQuery.getClauses(); //we need to recurse through the clauses until we get to SpanTermQuery Term lastTerm = null; Float lastWeight = null; for (int i = 0; i < clauses.length; i++) { SpanQuery clause = clauses[i]; if (clause instanceof SpanTermQuery) { Term term = ((SpanTermQuery) clause).getTerm(); Float weight = calculateWeight(term, reader); termWeights.put(term.text(), weight); if (lastTerm != null) {//calculate the bi-grams //use the smaller of the two weights if (lastWeight.floatValue() < weight.floatValue()) { bigramWeights.put(lastTerm + "," + term.text(), new Float(lastWeight.floatValue() * 0.25)); } else { bigramWeights.put(lastTerm + "," + term.text(), new Float(weight.floatValue() * 0.25)); } } //last lastTerm = term; lastWeight = weight; } else { //TODO: handle the other types throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unhandled query type: " + clause.getClass().getName()); } } }
@Override public Nfa getNfa(ForwardIndexAccessor fiAccessor, int direction) { Term term = query.getTerm(); String propertyValue = term.text(); NfaState state = NfaState.token(term.field(), propertyValue, null); return new Nfa(state, Arrays.asList(state)); }
private Query toSpanQueryPrefix(SpanQuery query, float boost) { if (query instanceof SpanTermQuery) { SpanMultiTermQueryWrapper<PrefixQuery> ret = new SpanMultiTermQueryWrapper<>(new PrefixQuery(((SpanTermQuery) query).getTerm())); return boost == 1 ? ret : new BoostQuery(ret, boost); } else if (query instanceof SpanNearQuery) { SpanNearQuery spanNearQuery = (SpanNearQuery) query; SpanQuery[] clauses = spanNearQuery.getClauses(); if (clauses[clauses.length - 1] instanceof SpanTermQuery) { clauses[clauses.length - 1] = new SpanMultiTermQueryWrapper<>( new PrefixQuery(((SpanTermQuery) clauses[clauses.length - 1]).getTerm()) ); } SpanNearQuery newQuery = new SpanNearQuery(clauses, spanNearQuery.getSlop(), spanNearQuery.isInOrder()); return boost == 1 ? newQuery : new BoostQuery(newQuery, boost); } else if (query instanceof SpanOrQuery) { SpanOrQuery orQuery = (SpanOrQuery) query; SpanQuery[] clauses = new SpanQuery[orQuery.getClauses().length]; for (int i = 0; i < clauses.length; i++) { clauses[i] = (SpanQuery) toSpanQueryPrefix(orQuery.getClauses()[i], 1); } return boost == 1 ? new SpanOrQuery(clauses) : new BoostQuery(new SpanOrQuery(clauses), boost); } else { return query; } }
@Override void flatten(Query sourceQuery, IndexReader reader, Collection<Query> flatQueries, float boost) throws IOException { if (sourceQuery instanceof SpanTermQuery) { super.flatten(new TermQuery(((SpanTermQuery) sourceQuery).getTerm()), reader, flatQueries, boost); } else if (sourceQuery instanceof ConstantScoreQuery) { flatten(((ConstantScoreQuery) sourceQuery).getQuery(), reader, flatQueries, boost); } else if (sourceQuery instanceof FunctionScoreQuery) { flatten(((FunctionScoreQuery) sourceQuery).getSubQuery(), reader, flatQueries, boost); } else if (sourceQuery instanceof MultiPhrasePrefixQuery) { flatten(sourceQuery.rewrite(reader), reader, flatQueries, boost); } else if (sourceQuery instanceof FiltersFunctionScoreQuery) { flatten(((FiltersFunctionScoreQuery) sourceQuery).getSubQuery(), reader, flatQueries, boost); } else if (sourceQuery instanceof MultiPhraseQuery) { MultiPhraseQuery q = ((MultiPhraseQuery) sourceQuery); convertMultiPhraseQuery(0, new int[q.getTermArrays().size()], q, q.getTermArrays(), q.getPositions(), reader, flatQueries); } else if (sourceQuery instanceof BlendedTermQuery) { final BlendedTermQuery blendedTermQuery = (BlendedTermQuery) sourceQuery; flatten(blendedTermQuery.rewrite(reader), reader, flatQueries, boost); } else if (sourceQuery instanceof ToParentBlockJoinQuery) { ToParentBlockJoinQuery blockJoinQuery = (ToParentBlockJoinQuery) sourceQuery; flatten(blockJoinQuery.getChildQuery(), reader, flatQueries, boost); } else { super.flatten(sourceQuery, reader, flatQueries, boost); } }
private Query toSpanQueryPrefix(SpanQuery query, float boost) { if (query instanceof SpanTermQuery) { SpanMultiTermQueryWrapper<PrefixQuery> ret = new SpanMultiTermQueryWrapper<>(new PrefixQuery(((SpanTermQuery) query).getTerm())); return boost == 1 ? ret : new BoostQuery(ret, boost); } else if (query instanceof SpanNearQuery) { SpanNearQuery spanNearQuery = (SpanNearQuery) query; SpanQuery[] clauses = spanNearQuery.getClauses(); if (clauses[clauses.length-1] instanceof SpanTermQuery) { clauses[clauses.length-1] = new SpanMultiTermQueryWrapper<>( new PrefixQuery(((SpanTermQuery) clauses[clauses.length-1]).getTerm()) ); } SpanNearQuery newQuery = new SpanNearQuery(clauses, spanNearQuery.getSlop(), spanNearQuery.isInOrder()); return boost == 1 ? newQuery : new BoostQuery(newQuery, boost); } else if (query instanceof SpanOrQuery) { SpanOrQuery orQuery = (SpanOrQuery) query; SpanQuery[] clauses = new SpanQuery[orQuery.getClauses().length]; for (int i = 0; i < clauses.length; i++) { clauses[i] = (SpanQuery) toSpanQueryPrefix(orQuery.getClauses()[i], 1); } return boost == 1 ? new SpanOrQuery(clauses) : new BoostQuery(new SpanOrQuery(clauses), boost); } else { return query; } }
private Query toSpanQueryPrefix(SpanQuery query, float boost) { if (query instanceof SpanTermQuery) { SpanMultiTermQueryWrapper<PrefixQuery> ret = new SpanMultiTermQueryWrapper<>(new PrefixQuery(((SpanTermQuery) query).getTerm())); return boost == 1 ? ret : new BoostQuery(ret, boost); } else if (query instanceof SpanNearQuery) { SpanNearQuery spanNearQuery = (SpanNearQuery) query; SpanQuery[] clauses = spanNearQuery.getClauses(); if (clauses[clauses.length - 1] instanceof SpanTermQuery) { clauses[clauses.length - 1] = new SpanMultiTermQueryWrapper<>( new PrefixQuery(((SpanTermQuery) clauses[clauses.length - 1]).getTerm()) ); } SpanNearQuery newQuery = new SpanNearQuery(clauses, spanNearQuery.getSlop(), spanNearQuery.isInOrder()); return boost == 1 ? newQuery : new BoostQuery(newQuery, boost); } else if (query instanceof SpanOrQuery) { SpanOrQuery orQuery = (SpanOrQuery) query; SpanQuery[] clauses = new SpanQuery[orQuery.getClauses().length]; for (int i = 0; i < clauses.length; i++) { clauses[i] = (SpanQuery) toSpanQueryPrefix(orQuery.getClauses()[i], 1); } return boost == 1 ? new SpanOrQuery(clauses) : new BoostQuery(new SpanOrQuery(clauses), boost); } else { return query; } }
Query q = new BoostingTermQuery(visitor.replaceTerm(((SpanTermQuery) query).getTerm())); q.setBoost(query.getBoost()); return q; Query q = new AllBoostingTermQuery(visitor.replaceTerm(((SpanTermQuery) query).getTerm())); q.setBoost(query.getBoost()); return q; Query q = new SpanTermQuery(visitor.replaceTerm(((SpanTermQuery) query).getTerm())); q.setBoost(query.getBoost()); return q;
flatten(sourceQuery, reader, flatQueries, boost); } else if (sourceQuery instanceof SpanTermQuery) { super.flatten(new TermQuery(((SpanTermQuery) sourceQuery).getTerm()), reader, flatQueries, boost); } else if (sourceQuery instanceof ConstantScoreQuery) { flatten(((ConstantScoreQuery) sourceQuery).getQuery(), reader, flatQueries, boost);
return boost == 1 ? prefixQuery : new BoostQuery(prefixQuery, boost); } else if (innerQuery instanceof AllTermQuery) { prefixQuery.add(((AllTermQuery) innerQuery).getTerm()); return boost == 1 ? prefixQuery : new BoostQuery(prefixQuery, boost);