List of usage examples for org.apache.lucene.search.spans SpanQuery getField
public abstract String getField();
From source file:com.mhs.qsol.spans.SpanWithinQuery.java
License:Apache License
/** * Construct a SpanWithinQuery matching spans from <code>include</code> which * overlap with spans from <code>exclude</code> up to <code>proximity</code> * times.//ww w. j av a 2s .com */ public SpanWithinQuery(SpanQuery include, SpanQuery exclude, int proximity) { this.include = include; this.exclude = exclude; this.proximity = proximity; if (!include.getField().equals(exclude.getField())) { throw new IllegalArgumentException("Clauses must have same field."); } }
From source file:edu.mit.ll.vizlinc.highlight.WeightedSpanTermExtractor.java
License:Apache License
private void collectSpanQueryFields(SpanQuery spanQuery, Set<String> fieldNames) { if (spanQuery instanceof FieldMaskingSpanQuery) { collectSpanQueryFields(((FieldMaskingSpanQuery) spanQuery).getMaskedQuery(), fieldNames); } else if (spanQuery instanceof SpanFirstQuery) { collectSpanQueryFields(((SpanFirstQuery) spanQuery).getMatch(), fieldNames); } else if (spanQuery instanceof SpanNearQuery) { for (final SpanQuery clause : ((SpanNearQuery) spanQuery).getClauses()) { collectSpanQueryFields(clause, fieldNames); }/*from www .j a v a2s .c o m*/ } else if (spanQuery instanceof SpanNotQuery) { collectSpanQueryFields(((SpanNotQuery) spanQuery).getInclude(), fieldNames); } else if (spanQuery instanceof SpanOrQuery) { for (final SpanQuery clause : ((SpanOrQuery) spanQuery).getClauses()) { collectSpanQueryFields(clause, fieldNames); } } else { fieldNames.add(spanQuery.getField()); } }
From source file:nl.inl.blacklab.search.lucene.BLSpanOrQuery.java
License:Apache License
/** Adds a clause to this query */ public final void addClause(SpanQuery clause) { if (field == null) { field = clause.getField(); } else if (!clause.getField().equals(field)) { throw new IllegalArgumentException("Clauses must have same field."); }//from w ww .java 2s . c o m this.clauses.add(clause); }
From source file:org.eu.bitzone.Leia.java
License:Apache License
private void _explainStructure(final Object parent, final Query q) { String clazz = q.getClass().getName(); if (clazz.startsWith("org.apache.lucene.")) { clazz = "lucene." + q.getClass().getSimpleName(); } else if (clazz.startsWith("org.apache.solr.")) { clazz = "solr." + q.getClass().getSimpleName(); }//from w ww . jav a2 s .c o m final float boost = q.getBoost(); final Object n = create("node"); add(parent, n); String msg = clazz; if (boost != 1.0f) { msg += ": boost=" + df.format(boost); } setFont(n, getFont().deriveFont(Font.BOLD)); setString(n, "text", msg); if (clazz.equals("lucene.TermQuery")) { final Object n1 = create("node"); final Term t = ((TermQuery) q).getTerm(); setString(n1, "text", "Term: field='" + t.field() + "' text='" + t.text() + "'"); add(n, n1); } else if (clazz.equals("lucene.BooleanQuery")) { final BooleanQuery bq = (BooleanQuery) q; final BooleanClause[] clauses = bq.getClauses(); final int max = BooleanQuery.getMaxClauseCount(); Object n1 = create("node"); String descr = "clauses=" + clauses.length + ", maxClauses=" + max; if (bq.isCoordDisabled()) { descr += ", coord=false"; } if (bq.getMinimumNumberShouldMatch() > 0) { descr += ", minShouldMatch=" + bq.getMinimumNumberShouldMatch(); } setString(n1, "text", descr); add(n, n1); for (int i = 0; i < clauses.length; i++) { n1 = create("node"); String occur; final Occur occ = clauses[i].getOccur(); if (occ.equals(Occur.MUST)) { occur = "MUST"; } else if (occ.equals(Occur.MUST_NOT)) { occur = "MUST_NOT"; } else if (occ.equals(Occur.SHOULD)) { occur = "SHOULD"; } else { occur = occ.toString(); } setString(n1, "text", "Clause " + i + ": " + occur); add(n, n1); _explainStructure(n1, clauses[i].getQuery()); } } else if (clazz.equals("lucene.PrefixQuery")) { Object n1 = create("node"); final PrefixQuery pq = (PrefixQuery) q; final Term t = pq.getPrefix(); setString(n1, "text", "Prefix: field='" + t.field() + "' text='" + t.text() + "'"); add(n, n1); try { addTermsEnum(n, PrefixQuery.class, pq.getField(), pq); } catch (final Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (clazz.equals("lucene.PhraseQuery")) { final PhraseQuery pq = (PhraseQuery) q; setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop()); final int[] pos = pq.getPositions(); final Term[] terms = pq.getTerms(); Object n1 = create("node"); final StringBuffer sb = new StringBuffer("pos: ["); for (int i = 0; i < pos.length; i++) { if (i > 0) { sb.append(','); } sb.append("" + pos[i]); } sb.append("]"); setString(n1, "text", sb.toString()); add(n, n1); for (int i = 0; i < terms.length; i++) { n1 = create("node"); setString(n1, "text", "Term " + i + ": field='" + terms[i].field() + "' text='" + terms[i].text() + "'"); add(n, n1); } } else if (clazz.equals("lucene.MultiPhraseQuery")) { final MultiPhraseQuery pq = (MultiPhraseQuery) q; setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop()); final int[] pos = pq.getPositions(); Object n1 = create("node"); final StringBuffer sb = new StringBuffer("pos: ["); for (int i = 0; i < pos.length; i++) { if (i > 0) { sb.append(','); } sb.append("" + pos[i]); } sb.append("]"); setString(n1, "text", sb.toString()); add(n, n1); n1 = create("node"); System.err.println("MultiPhraseQuery is missing the public getTermArrays() :-("); setString(n1, "text", "toString: " + pq.toString()); add(n, n1); } else if (clazz.equals("lucene.FuzzyQuery")) { final FuzzyQuery fq = (FuzzyQuery) q; Object n1 = create("node"); setString(n1, "text", "field=" + fq.getField() + ", prefixLen=" + fq.getPrefixLength() + ", maxEdits=" + df.format(fq.getMaxEdits())); add(n, n1); try { addTermsEnum(n, FuzzyQuery.class, fq.getField(), fq); } catch (final Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (clazz.equals("lucene.WildcardQuery")) { final WildcardQuery wq = (WildcardQuery) q; final Term t = wq.getTerm(); setString(n, "text", getString(n, "text") + ", term=" + t); final Automaton a = WildcardQuery.toAutomaton(t); addAutomaton(n, a); } else if (clazz.equals("lucene.TermRangeQuery")) { final TermRangeQuery rq = (TermRangeQuery) q; setString(n, "text", getString(n, "text") + ", inclLower=" + rq.includesLower() + ", inclUpper=" + rq.includesUpper()); Object n1 = create("node"); setString(n1, "text", "lowerTerm=" + rq.getField() + ":" + rq.getLowerTerm() + "'"); add(n, n1); n1 = create("node"); setString(n1, "text", "upperTerm=" + rq.getField() + ":" + rq.getUpperTerm() + "'"); add(n, n1); try { addTermsEnum(n, TermRangeQuery.class, rq.getField(), rq); } catch (final Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (q instanceof AutomatonQuery) { final AutomatonQuery aq = (AutomatonQuery) q; setString(n, "text", getString(n, "text") + ", " + aq.toString()); // get automaton try { final java.lang.reflect.Field aField = AutomatonQuery.class.getDeclaredField("automaton"); aField.setAccessible(true); final Automaton a = (Automaton) aField.get(aq); addAutomaton(n, a); } catch (final Exception e) { e.printStackTrace(); final Object n1 = create("node"); setString(n1, "text", "Automaton: Exception " + e.getMessage()); add(n, n1); } } else if (q instanceof MultiTermQuery) { final MultiTermQuery mq = (MultiTermQuery) q; final Set<Term> terms = new HashSet<Term>(); mq.extractTerms(terms); setString(n, "text", getString(n, "text") + ", terms: " + terms); try { addTermsEnum(n, TermRangeQuery.class, mq.getField(), mq); } catch (final Exception e) { e.printStackTrace(); final Object n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (q instanceof ConstantScoreQuery) { final ConstantScoreQuery cq = (ConstantScoreQuery) q; setString(n, "text", getString(n, "text") + ", " + cq.toString()); final Object n1 = create("node"); add(n, n1); if (cq.getFilter() != null) { setString(n1, "text", "Filter: " + cq.getFilter().toString()); } else if (cq.getQuery() != null) { _explainStructure(n, cq.getQuery()); } } else if (q instanceof FilteredQuery) { final FilteredQuery fq = (FilteredQuery) q; final Object n1 = create("node"); setString(n1, "text", "Filter: " + fq.getFilter().toString()); add(n, n1); _explainStructure(n, fq.getQuery()); } else if (q instanceof SpanQuery) { final SpanQuery sq = (SpanQuery) q; final Class sqlass = sq.getClass(); setString(n, "text", getString(n, "text") + ", field=" + sq.getField()); if (sqlass == SpanOrQuery.class) { final SpanOrQuery soq = (SpanOrQuery) sq; setString(n, "text", getString(n, "text") + ", " + soq.getClauses().length + " clauses"); for (final SpanQuery sq1 : soq.getClauses()) { _explainStructure(n, sq1); } } else if (sqlass == SpanFirstQuery.class) { final SpanFirstQuery sfq = (SpanFirstQuery) sq; setString(n, "text", getString(n, "text") + ", end=" + sfq.getEnd() + ", match:"); _explainStructure(n, sfq.getMatch()); } else if (q instanceof SpanNearQuery) { // catch also known subclasses final SpanNearQuery snq = (SpanNearQuery) sq; setString(n, "text", getString(n, "text") + ", slop=" + snq.getSlop()); if (snq instanceof PayloadNearQuery) { try { final java.lang.reflect.Field function = PayloadNearQuery.class .getDeclaredField("function"); function.setAccessible(true); final Object func = function.get(snq); setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName()); } catch (final Exception e) { e.printStackTrace(); } } for (final SpanQuery sq1 : snq.getClauses()) { _explainStructure(n, sq1); } } else if (sqlass == SpanNotQuery.class) { final SpanNotQuery snq = (SpanNotQuery) sq; Object n1 = create("node"); add(n, n1); setString(n1, "text", "Include:"); _explainStructure(n1, snq.getInclude()); n1 = create("node"); add(n, n1); setString(n1, "text", "Exclude:"); _explainStructure(n1, snq.getExclude()); } else if (q instanceof SpanTermQuery) { final SpanTermQuery stq = (SpanTermQuery) sq; setString(n, "text", getString(n, "text") + ", term=" + stq.getTerm()); if (stq instanceof PayloadTermQuery) { try { final java.lang.reflect.Field function = PayloadTermQuery.class .getDeclaredField("function"); function.setAccessible(true); final Object func = function.get(stq); setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName()); } catch (final Exception e) { e.printStackTrace(); } } } else { final String defField = getDefaultField(find("srchOptTabs")); setString(n, "text", "class=" + q.getClass().getName() + ", " + getString(n, "text") + ", toString=" + q.toString(defField)); final HashSet<Term> terms = new HashSet<Term>(); sq.extractTerms(terms); Object n1 = null; if (terms != null) { n1 = create("node"); setString(n1, "text", "Matched terms (" + terms.size() + "):"); add(n, n1); final Iterator<Term> it = terms.iterator(); while (it.hasNext()) { final Object n2 = create("node"); final Term t = it.next(); setString(n2, "text", "field='" + t.field() + "' text='" + t.text() + "'"); add(n1, n2); } } else { n1 = create("node"); setString(n1, "text", "<no terms matched>"); add(n, n1); } } if (ir != null) { final Object n1 = null; /* * in Lucene 4.0 this requires traversal of sub- and leaf readers, which is cumbersome to do here. try { Spans * spans = sq.getSpans(ir); if (spans != null) { n1 = create("node"); int cnt = 0; while (spans.next()) { Object * n2 = create("node"); setString(n2, "text", "doc=" + spans.doc() + ", start=" + spans.start() + ", end=" + * spans.end()); add(n1, n2); cnt++; } if (cnt > 0) { add(n, n1); setString(n1, "text", "Spans (" + cnt + "):"); * setBoolean(n1, "expanded", false); } } } catch (Exception e) { e.printStackTrace(); n1 = create("node"); * setString(n1, "text", "Spans Exception: " + e.getMessage()); add(n, n1); } */ } } else { Object n1 = create("node"); final String defField = getDefaultField(find("srchOptTabs")); final Set<Term> terms = new HashSet<Term>(); q.extractTerms(terms); setString(n1, "text", q.getClass().getName() + ": " + q.toString(defField)); add(n, n1); if (!terms.isEmpty()) { n1 = create("node"); setString(n1, "text", "terms: " + terms); add(n, n1); } } }
From source file:org.getopt.luke.Luke.java
License:Apache License
private void _explainStructure(Object parent, Query q) { String clazz = q.getClass().getName(); if (clazz.startsWith("org.apache.lucene.")) { clazz = "lucene." + q.getClass().getSimpleName(); } else if (clazz.startsWith("org.apache.solr.")) { clazz = "solr." + q.getClass().getSimpleName(); }/*from w w w . j a va2s . c o m*/ float boost = q.getBoost(); Object n = create("node"); add(parent, n); String msg = clazz; if (boost != 1.0f) { msg += ": boost=" + df.format(boost); } setFont(n, getFont().deriveFont(Font.BOLD)); setString(n, "text", msg); if (clazz.equals("lucene.TermQuery")) { Object n1 = create("node"); Term t = ((TermQuery) q).getTerm(); setString(n1, "text", "Term: field='" + t.field() + "' text='" + t.text() + "'"); add(n, n1); } else if (clazz.equals("lucene.BooleanQuery")) { BooleanQuery bq = (BooleanQuery) q; BooleanClause[] clauses = bq.getClauses(); int max = bq.getMaxClauseCount(); Object n1 = create("node"); String descr = "clauses=" + clauses.length + ", maxClauses=" + max; if (bq.isCoordDisabled()) { descr += ", coord=false"; } if (bq.getMinimumNumberShouldMatch() > 0) { descr += ", minShouldMatch=" + bq.getMinimumNumberShouldMatch(); } setString(n1, "text", descr); add(n, n1); for (int i = 0; i < clauses.length; i++) { n1 = create("node"); String occur; Occur occ = clauses[i].getOccur(); if (occ.equals(Occur.MUST)) { occur = "MUST"; } else if (occ.equals(Occur.MUST_NOT)) { occur = "MUST_NOT"; } else if (occ.equals(Occur.SHOULD)) { occur = "SHOULD"; } else { occur = occ.toString(); } setString(n1, "text", "Clause " + i + ": " + occur); add(n, n1); _explainStructure(n1, clauses[i].getQuery()); } } else if (clazz.equals("lucene.PrefixQuery")) { Object n1 = create("node"); PrefixQuery pq = (PrefixQuery) q; Term t = pq.getPrefix(); setString(n1, "text", "Prefix: field='" + t.field() + "' text='" + t.text() + "'"); add(n, n1); try { addTermsEnum(n, PrefixQuery.class, pq.getField(), pq); } catch (Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (clazz.equals("lucene.PhraseQuery")) { PhraseQuery pq = (PhraseQuery) q; setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop()); int[] pos = pq.getPositions(); Term[] terms = pq.getTerms(); Object n1 = create("node"); StringBuffer sb = new StringBuffer("pos: ["); for (int i = 0; i < pos.length; i++) { if (i > 0) sb.append(','); sb.append("" + pos[i]); } sb.append("]"); setString(n1, "text", sb.toString()); add(n, n1); for (int i = 0; i < terms.length; i++) { n1 = create("node"); setString(n1, "text", "Term " + i + ": field='" + terms[i].field() + "' text='" + terms[i].text() + "'"); add(n, n1); } } else if (clazz.equals("lucene.MultiPhraseQuery")) { MultiPhraseQuery pq = (MultiPhraseQuery) q; setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop()); int[] pos = pq.getPositions(); Object n1 = create("node"); StringBuffer sb = new StringBuffer("pos: ["); for (int i = 0; i < pos.length; i++) { if (i > 0) sb.append(','); sb.append("" + pos[i]); } sb.append("]"); setString(n1, "text", sb.toString()); add(n, n1); n1 = create("node"); System.err.println("MultiPhraseQuery is missing the public getTermArrays() :-("); setString(n1, "text", "toString: " + pq.toString()); add(n, n1); } else if (clazz.equals("lucene.FuzzyQuery")) { FuzzyQuery fq = (FuzzyQuery) q; Object n1 = create("node"); setString(n1, "text", "field=" + fq.getField() + ", prefixLen=" + fq.getPrefixLength() + ", maxEdits=" + df.format(fq.getMaxEdits())); add(n, n1); try { addTermsEnum(n, FuzzyQuery.class, fq.getField(), fq); } catch (Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (clazz.equals("lucene.WildcardQuery")) { WildcardQuery wq = (WildcardQuery) q; Term t = wq.getTerm(); setString(n, "text", getString(n, "text") + ", term=" + t); Automaton a = WildcardQuery.toAutomaton(t); addAutomaton(n, a); } else if (clazz.equals("lucene.TermRangeQuery")) { TermRangeQuery rq = (TermRangeQuery) q; setString(n, "text", getString(n, "text") + ", inclLower=" + rq.includesLower() + ", inclUpper=" + rq.includesUpper()); Object n1 = create("node"); setString(n1, "text", "lowerTerm=" + rq.getField() + ":" + rq.getLowerTerm() + "'"); add(n, n1); n1 = create("node"); setString(n1, "text", "upperTerm=" + rq.getField() + ":" + rq.getUpperTerm() + "'"); add(n, n1); try { addTermsEnum(n, TermRangeQuery.class, rq.getField(), rq); } catch (Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (q instanceof AutomatonQuery) { AutomatonQuery aq = (AutomatonQuery) q; setString(n, "text", getString(n, "text") + ", " + aq.toString()); // get automaton try { java.lang.reflect.Field aField = AutomatonQuery.class.getDeclaredField("automaton"); aField.setAccessible(true); Automaton a = (Automaton) aField.get(aq); addAutomaton(n, a); } catch (Exception e) { e.printStackTrace(); Object n1 = create("node"); setString(n1, "text", "Automaton: Exception " + e.getMessage()); add(n, n1); } } else if (q instanceof MultiTermQuery) { MultiTermQuery mq = (MultiTermQuery) q; Set<Term> terms = new HashSet<Term>(); mq.extractTerms(terms); setString(n, "text", getString(n, "text") + ", terms: " + terms); try { addTermsEnum(n, TermRangeQuery.class, mq.getField(), mq); } catch (Exception e) { e.printStackTrace(); Object n1 = create("node"); setString(n1, "text", "TermEnum: Exception " + e.getMessage()); add(n, n1); } } else if (q instanceof ConstantScoreQuery) { ConstantScoreQuery cq = (ConstantScoreQuery) q; setString(n, "text", getString(n, "text") + ", " + cq.toString()); Object n1 = create("node"); add(n, n1); if (cq.getFilter() != null) { setString(n1, "text", "Filter: " + cq.getFilter().toString()); } else if (cq.getQuery() != null) { _explainStructure(n, cq.getQuery()); } } else if (q instanceof FilteredQuery) { FilteredQuery fq = (FilteredQuery) q; Object n1 = create("node"); setString(n1, "text", "Filter: " + fq.getFilter().toString()); add(n, n1); _explainStructure(n, fq.getQuery()); } else if (q instanceof SpanQuery) { SpanQuery sq = (SpanQuery) q; Class sqlass = sq.getClass(); setString(n, "text", getString(n, "text") + ", field=" + sq.getField()); if (sqlass == SpanOrQuery.class) { SpanOrQuery soq = (SpanOrQuery) sq; setString(n, "text", getString(n, "text") + ", " + soq.getClauses().length + " clauses"); for (SpanQuery sq1 : soq.getClauses()) { _explainStructure(n, sq1); } } else if (sqlass == SpanFirstQuery.class) { SpanFirstQuery sfq = (SpanFirstQuery) sq; setString(n, "text", getString(n, "text") + ", end=" + sfq.getEnd() + ", match:"); _explainStructure(n, sfq.getMatch()); } else if (q instanceof SpanNearQuery) { // catch also known subclasses SpanNearQuery snq = (SpanNearQuery) sq; setString(n, "text", getString(n, "text") + ", slop=" + snq.getSlop()); if (snq instanceof PayloadNearQuery) { try { java.lang.reflect.Field function = PayloadNearQuery.class.getDeclaredField("function"); function.setAccessible(true); Object func = function.get(snq); setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName()); } catch (Exception e) { e.printStackTrace(); } } for (SpanQuery sq1 : snq.getClauses()) { _explainStructure(n, sq1); } } else if (sqlass == SpanNotQuery.class) { SpanNotQuery snq = (SpanNotQuery) sq; Object n1 = create("node"); add(n, n1); setString(n1, "text", "Include:"); _explainStructure(n1, snq.getInclude()); n1 = create("node"); add(n, n1); setString(n1, "text", "Exclude:"); _explainStructure(n1, snq.getExclude()); } else if (q instanceof SpanTermQuery) { SpanTermQuery stq = (SpanTermQuery) sq; setString(n, "text", getString(n, "text") + ", term=" + stq.getTerm()); if (stq instanceof PayloadTermQuery) { try { java.lang.reflect.Field function = PayloadTermQuery.class.getDeclaredField("function"); function.setAccessible(true); Object func = function.get(stq); setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName()); } catch (Exception e) { e.printStackTrace(); } } } else { String defField = getDefaultField(find("srchOptTabs")); setString(n, "text", "class=" + q.getClass().getName() + ", " + getString(n, "text") + ", toString=" + q.toString(defField)); HashSet<Term> terms = new HashSet<Term>(); sq.extractTerms(terms); Object n1 = null; if (terms != null) { n1 = create("node"); setString(n1, "text", "Matched terms (" + terms.size() + "):"); add(n, n1); Iterator<Term> it = terms.iterator(); while (it.hasNext()) { Object n2 = create("node"); Term t = it.next(); setString(n2, "text", "field='" + t.field() + "' text='" + t.text() + "'"); add(n1, n2); } } else { n1 = create("node"); setString(n1, "text", "<no terms matched>"); add(n, n1); } } if (ir != null) { Object n1 = null; /* in Lucene 4.0 this requires traversal of sub- and leaf readers, * which is cumbersome to do here. try { Spans spans = sq.getSpans(ir); if (spans != null) { n1 = create("node"); int cnt = 0; while (spans.next()) { Object n2 = create("node"); setString(n2, "text", "doc=" + spans.doc() + ", start=" + spans.start() + ", end=" + spans.end()); add(n1, n2); cnt++; } if (cnt > 0) { add(n, n1); setString(n1, "text", "Spans (" + cnt + "):"); setBoolean(n1, "expanded", false); } } } catch (Exception e) { e.printStackTrace(); n1 = create("node"); setString(n1, "text", "Spans Exception: " + e.getMessage()); add(n, n1); } */ } } else { Object n1 = create("node"); String defField = getDefaultField(find("srchOptTabs")); Set<Term> terms = new HashSet<Term>(); q.extractTerms(terms); setString(n1, "text", q.getClass().getName() + ": " + q.toString(defField)); add(n, n1); if (!terms.isEmpty()) { n1 = create("node"); setString(n1, "text", "terms: " + terms); add(n, n1); } } }
From source file:org.tallison.lucene.queryparser.spans.SQPTestBase.java
License:Apache License
/** * THIS IS AN UNHOLY ABOMINATION: this exists here and in LUCENE-5317 and * in the highlighter package. Please, please forgive me. * * We need to factor this out into a standalone helper class until * the difference between Query and SpanQueries disappears. * * Converts a regular query to a {@link org.apache.lucene.search.spans.SpanQuery} for use in a highlighter. * Because of subtle differences in {@link org.apache.lucene.search.spans.SpanQuery} and {@link org.apache.lucene.search.Query}, this * {@link org.apache.lucene.search.spans.SpanQuery} will not necessarily return the same documents as the * initial Query. For example, the generated SpanQuery will not include * clauses of type BooleanClause.Occur.MUST_NOT. Also, the * {@link org.apache.lucene.search.spans.SpanQuery} will only cover a single field, whereas the {@link org.apache.lucene.search.Query} * might contain multiple fields.//from w w w.ja v a 2 s .co m * <p> * Returns an empty SpanQuery if the {@link org.apache.lucene.search.Query} is a class that * is handled, but for some reason can't be converted from a {@link org.apache.lucene.search.Query} to a * {@link org.apache.lucene.search.spans.SpanQuery}. This can happen for many reasons: e.g. if the Query * contains no terms in the requested "field" or the Query is a MatchAllDocsQuery. * <p> * Throws IllegalArgumentException if the Query is a class that is * is not yet handled. * <p> * This class does not rewrite the SpanQuery before returning it. * Clients are required to rewrite if necessary. * <p> * Much of this code is copied directly from * oal.search.highlight.WeightedSpanTermExtractor. There are some subtle * differences. * * @param field single field to extract SpanQueries for * @param query query to convert * @return SpanQuery for use in highlighting; can return empty SpanQuery * @throws java.io.IOException for an underlying * IOException in the IndexReader or an IllegalArgumentException if the query type is not recognized */ public SpanQuery convert(String field, Query query) throws IOException { /* * copied nearly verbatim from * org.apache.lucene.search.highlight.WeightedSpanTermExtractor * TODO:refactor to avoid duplication of code if possible. * Beware: there are some subtle differences. */ if (query instanceof SpanQuery) { SpanQuery sq = (SpanQuery) query; if (sq.getField() != null && sq.getField().equals(field)) { return (SpanQuery) query; } else { return getEmptySpanQuery(); } } else if (query instanceof BooleanQuery) { List<BooleanClause> queryClauses = ((BooleanQuery) query).clauses(); List<SpanQuery> spanQs = new ArrayList<SpanQuery>(); for (int i = 0; i < queryClauses.size(); i++) { if (!queryClauses.get(i).isProhibited()) { tryToAdd(field, convert(field, queryClauses.get(i).getQuery()), spanQs); } } if (spanQs.size() == 0) { return getEmptySpanQuery(); } else if (spanQs.size() == 1) { return spanQs.get(0); } else { return new SpanOrQuery(spanQs.toArray(new SpanQuery[spanQs.size()])); } } else if (query instanceof PhraseQuery) { PhraseQuery phraseQuery = ((PhraseQuery) query); Term[] phraseQueryTerms = phraseQuery.getTerms(); if (phraseQueryTerms.length == 0) { return getEmptySpanQuery(); } else if (!phraseQueryTerms[0].field().equals(field)) { return getEmptySpanQuery(); } SpanQuery[] clauses = new SpanQuery[phraseQueryTerms.length]; for (int i = 0; i < phraseQueryTerms.length; i++) { clauses[i] = new SpanTermQuery(phraseQueryTerms[i]); } int slop = phraseQuery.getSlop(); int[] positions = phraseQuery.getPositions(); // sum position increments (>1) and add to slop if (positions.length > 0) { int lastPos = positions[0]; int sz = positions.length; for (int i = 1; i < sz; i++) { int pos = positions[i]; int inc = pos - lastPos - 1; slop += inc; lastPos = pos; } } boolean inorder = false; if (phraseQuery.getSlop() == 0) { inorder = true; } SpanNearQuery sp = new SpanNearQuery(clauses, slop, inorder); if (query instanceof BoostQuery) { return new SpanBoostQuery(sp, ((BoostQuery) query).getBoost()); } else { return sp; } } else if (query instanceof TermQuery) { TermQuery tq = (TermQuery) query; if (tq.getTerm().field().equals(field)) { return new SpanTermQuery(tq.getTerm()); } else { return getEmptySpanQuery(); } } else if (query instanceof ConstantScoreQuery) { return convert(field, ((ConstantScoreQuery) query).getQuery()); } else if (query instanceof DisjunctionMaxQuery) { List<SpanQuery> spanQs = new ArrayList<SpanQuery>(); for (Iterator<Query> iterator = ((DisjunctionMaxQuery) query).iterator(); iterator.hasNext();) { tryToAdd(field, convert(field, iterator.next()), spanQs); } if (spanQs.size() == 0) { return getEmptySpanQuery(); } else if (spanQs.size() == 1) { return spanQs.get(0); } else { return new SpanOrQuery(spanQs.toArray(new SpanQuery[spanQs.size()])); } } else if (query instanceof MatchAllDocsQuery) { return getEmptySpanQuery(); } else if (query instanceof MultiPhraseQuery) { final MultiPhraseQuery mpq = (MultiPhraseQuery) query; final Term[][] termArrays = mpq.getTermArrays(); //test for empty or wrong field if (termArrays.length == 0) { return getEmptySpanQuery(); } else if (termArrays.length > 1) { Term[] ts = termArrays[0]; if (ts.length > 0) { Term t = ts[0]; if (!t.field().equals(field)) { return getEmptySpanQuery(); } } } final int[] positions = mpq.getPositions(); if (positions.length > 0) { int maxPosition = positions[positions.length - 1]; for (int i = 0; i < positions.length - 1; ++i) { if (positions[i] > maxPosition) { maxPosition = positions[i]; } } @SuppressWarnings("unchecked") final List<SpanQuery>[] disjunctLists = new List[maxPosition + 1]; int distinctPositions = 0; for (int i = 0; i < termArrays.length; ++i) { final Term[] termArray = termArrays[i]; List<SpanQuery> disjuncts = disjunctLists[positions[i]]; if (disjuncts == null) { disjuncts = (disjunctLists[positions[i]] = new ArrayList<SpanQuery>(termArray.length)); ++distinctPositions; } for (int j = 0; j < termArray.length; ++j) { disjuncts.add(new SpanTermQuery(termArray[j])); } } int positionGaps = 0; int position = 0; final SpanQuery[] clauses = new SpanQuery[distinctPositions]; for (int i = 0; i < disjunctLists.length; ++i) { List<SpanQuery> disjuncts = disjunctLists[i]; if (disjuncts != null) { if (disjuncts.size() == 1) { clauses[position++] = disjuncts.get(0); } else { clauses[position++] = new SpanOrQuery( disjuncts.toArray(new SpanQuery[disjuncts.size()])); } } else { ++positionGaps; } } final int slop = mpq.getSlop(); final boolean inorder = (slop == 0); SpanNearQuery sp = new SpanNearQuery(clauses, slop + positionGaps, inorder); if (query instanceof BoostQuery) { return new SpanBoostQuery(sp, ((BoostQuery) query).getBoost()); } else { return sp; } } } else if (query instanceof MultiTermQuery) { return new SpanMultiTermQueryWrapper<>((MultiTermQuery) query); } else if (query instanceof SynonymQuery) { List<SpanQuery> clauses = new ArrayList<>(); for (Term term : ((SynonymQuery) query).getTerms()) { clauses.add(new SpanTermQuery(term)); } return new SpanOrQuery(clauses.toArray(new SpanQuery[clauses.size()])); } throw new IllegalArgumentException("Can't convert query of type: " + query.getClass()); }
From source file:org.tallison.lucene.queryparser.spans.SQPTestBase.java
License:Apache License
private void tryToAdd(String field, SpanQuery q, List<SpanQuery> qs) { if (q == null || isEmptyQuery(q) || !q.getField().equals(field)) { return;//w w w . j a v a 2 s . c o m } qs.add(q); }
From source file:org.tallison.lucene.search.concordance.classic.ConcordanceSearcher.java
License:Apache License
/** * Like//from w ww. j a va 2s . c om * {@link #search(IndexSearcher, String, Query, Query, Analyzer, AbstractConcordanceWindowCollector)} * but this takes a SpanQuery * * @param searcher searcher * @param spanQuery query to use to identify the targets * @param filter filter for document retrieval * @param analyzer to re-analyze terms for window calculations and sort key building * @param collector to process (and store) the results * @throws TargetTokenNotFoundException if target token is not found * @throws IllegalArgumentException if the field can't be found in the main query * @throws java.io.IOException if there is an underlying IOException in the reader */ public void searchSpan(IndexSearcher searcher, SpanQuery spanQuery, Query filter, Analyzer analyzer, AbstractConcordanceWindowCollector collector) throws TargetTokenNotFoundException, IllegalArgumentException, IOException { Set<String> fields = new HashSet<>(windowBuilder.getFieldSelector()); fields.add(spanQuery.getField()); DocTokenOffsetsVisitor visitor = new ConcDTOffsetVisitor(spanQuery.getField(), analyzer, fields, collector); SpansCrawler.crawl(spanQuery, filter, searcher, visitor); collector.setTotalDocs(searcher.getIndexReader().numDocs()); }
From source file:org.tallison.lucene.search.concordance.windowvisitor.ConcordanceArrayWindowSearcher.java
License:Apache License
public void searchSpan(IndexSearcher searcher, SpanQuery query, Query filterQuery, Analyzer analyzer, ArrayWindowVisitor visitor, DocIdBuilder docIdBuilder) throws IllegalArgumentException, TargetTokenNotFoundException, IOException { //if nothing is found for e.g. a prefix query, the returned query will //be an empty spanquery with a null field. We need to cache the field //in case this is destroyed in the rewrite. String field = query.getField(); CAWDocTokenOffsetsVisitor docTokenOffsetsVisitor = new CAWDocTokenOffsetsVisitor(field, analyzer, docIdBuilder, visitor);/*from w ww. j a v a 2 s. c o m*/ SpansCrawler.crawl(query, filterQuery, searcher, docTokenOffsetsVisitor); }
From source file:org.tallison.lucene.search.spans.SimpleSpanQueryConverter.java
License:Apache License
/** * Converts a regular query to a {@link org.apache.lucene.search.spans.SpanQuery} for use in a highlighter. * Because of subtle differences in {@link org.apache.lucene.search.spans.SpanQuery} and {@link org.apache.lucene.search.Query}, this * {@link org.apache.lucene.search.spans.SpanQuery} will not necessarily return the same documents as the * initial Query. For example, the generated SpanQuery will not include * clauses of type BooleanClause.Occur.MUST_NOT. Also, the * {@link org.apache.lucene.search.spans.SpanQuery} will only cover a single field, whereas the {@link org.apache.lucene.search.Query} * might contain multiple fields.//ww w . j a v a 2s . c om * <p> * Returns an empty SpanQuery if the {@link org.apache.lucene.search.Query} is a class that * is handled, but for some reason can't be converted from a {@link org.apache.lucene.search.Query} to a * {@link org.apache.lucene.search.spans.SpanQuery}. This can happen for many reasons: e.g. if the Query * contains no terms in the requested "field" or the Query is a MatchAllDocsQuery. * <p> * Throws IllegalArgumentException if the Query is a class that is * is not yet handled. * <p> * This class does not rewrite the SpanQuery before returning it. * Clients are required to rewrite if necessary. * <p> * Much of this code is copied directly from * oal.search.highlight.WeightedSpanTermExtractor. There are some subtle * differences. * <p> * Throws IllegalArgumentException for unknown query types. * * @param field single field to extract SpanQueries for * @param queryToConvert query to convert * @return SpanQuery for use in highlighting; can return empty SpanQuery * @throws java.io.IOException if encountered during parse */ public SpanQuery convert(String field, Query queryToConvert) throws IOException { Float boost = null; Query query = queryToConvert; if (queryToConvert instanceof BoostQuery) { query = ((BoostQuery) query).getQuery(); boost = ((BoostQuery) queryToConvert).getBoost(); } /* * copied nearly verbatim from * org.apache.lucene.search.highlight.WeightedSpanTermExtractor * TODO:refactor to avoid duplication of code if possible. * Beware: there are some subtle differences. */ if (query instanceof SpanQuery) { SpanQuery sq = (SpanQuery) query; if (sq.getField().equals(field)) { return (SpanQuery) query; } else { return getEmptySpanQuery(); } } else if (query instanceof BooleanQuery) { List<BooleanClause> queryClauses = ((BooleanQuery) query).clauses(); List<SpanQuery> spanQs = new ArrayList<SpanQuery>(); for (int i = 0; i < queryClauses.size(); i++) { if (!queryClauses.get(i).isProhibited()) { tryToAdd(field, convert(field, queryClauses.get(i).getQuery()), spanQs); } } return addBoost(buildSpanOr(spanQs), boost); } else if (query instanceof PhraseQuery) { PhraseQuery phraseQuery = ((PhraseQuery) query); Term[] phraseQueryTerms = phraseQuery.getTerms(); if (phraseQueryTerms.length == 0) { return getEmptySpanQuery(); } else if (!phraseQueryTerms[0].field().equals(field)) { return getEmptySpanQuery(); } SpanQuery[] clauses = new SpanQuery[phraseQueryTerms.length]; for (int i = 0; i < phraseQueryTerms.length; i++) { clauses[i] = new SpanTermQuery(phraseQueryTerms[i]); } int slop = phraseQuery.getSlop(); int[] positions = phraseQuery.getPositions(); // sum position increments (>1) and add to slop if (positions.length > 0) { int lastPos = positions[0]; int sz = positions.length; for (int i = 1; i < sz; i++) { int pos = positions[i]; int inc = pos - lastPos - 1; slop += inc; lastPos = pos; } } boolean inorder = false; if (phraseQuery.getSlop() == 0) { inorder = true; } SpanQuery sp = new SpanNearQuery(clauses, slop, inorder); if (query instanceof BoostQuery) { sp = new SpanBoostQuery(sp, ((BoostQuery) query).getBoost()); } return addBoost(sp, boost); } else if (query instanceof TermQuery) { TermQuery tq = (TermQuery) query; if (tq.getTerm().field().equals(field)) { return addBoost(new SpanTermQuery(tq.getTerm()), boost); } else { return getEmptySpanQuery(); } } else if (query instanceof ConstantScoreQuery) { return convert(field, ((ConstantScoreQuery) query).getQuery()); } else if (query instanceof DisjunctionMaxQuery) { List<SpanQuery> spanQs = new ArrayList<>(); for (Iterator<Query> iterator = ((DisjunctionMaxQuery) query).iterator(); iterator.hasNext();) { tryToAdd(field, convert(field, iterator.next()), spanQs); } if (spanQs.size() == 0) { return getEmptySpanQuery(); } else if (spanQs.size() == 1) { return addBoost(spanQs.get(0), boost); } else { return addBoost(new SpanOrQuery(spanQs.toArray(new SpanQuery[spanQs.size()])), boost); } } else if (query instanceof MatchAllDocsQuery) { return getEmptySpanQuery(); } else if (query instanceof MultiPhraseQuery) { final MultiPhraseQuery mpq = (MultiPhraseQuery) query; final Term[][] termArrays = mpq.getTermArrays(); //test for empty or wrong field if (termArrays.length == 0) { return getEmptySpanQuery(); } else if (termArrays.length > 1) { Term[] ts = termArrays[0]; if (ts.length > 0) { Term t = ts[0]; if (!t.field().equals(field)) { return getEmptySpanQuery(); } } } final int[] positions = mpq.getPositions(); if (positions.length > 0) { int maxPosition = positions[positions.length - 1]; for (int i = 0; i < positions.length - 1; ++i) { if (positions[i] > maxPosition) { maxPosition = positions[i]; } } @SuppressWarnings("unchecked") final List<SpanQuery>[] disjunctLists = new List[maxPosition + 1]; int distinctPositions = 0; for (int i = 0; i < termArrays.length; ++i) { final Term[] termArray = termArrays[i]; List<SpanQuery> disjuncts = disjunctLists[positions[i]]; if (disjuncts == null) { disjuncts = (disjunctLists[positions[i]] = new ArrayList<SpanQuery>(termArray.length)); ++distinctPositions; } for (int j = 0; j < termArray.length; ++j) { disjuncts.add(new SpanTermQuery(termArray[j])); } } int positionGaps = 0; int position = 0; final SpanQuery[] clauses = new SpanQuery[distinctPositions]; for (int i = 0; i < disjunctLists.length; ++i) { List<SpanQuery> disjuncts = disjunctLists[i]; if (disjuncts != null) { if (disjuncts.size() == 1) { clauses[position++] = disjuncts.get(0); } else { clauses[position++] = new SpanOrQuery( disjuncts.toArray(new SpanQuery[disjuncts.size()])); } } else { ++positionGaps; } } final int slop = mpq.getSlop(); final boolean inorder = (slop == 0); SpanNearQuery sp = new SpanNearQuery(clauses, slop + positionGaps, inorder); return addBoost(sp, boost); } } else if (query instanceof MultiTermQuery) { MultiTermQuery tq = (MultiTermQuery) query; if (!tq.getField().equals(field)) { return getEmptySpanQuery(); } return addBoost(new SpanMultiTermQueryWrapper<>((MultiTermQuery) query), boost); } else if (query instanceof SynonymQuery) { SynonymQuery sq = (SynonymQuery) query; List<SpanQuery> spanQs = new ArrayList<>(); for (Term t : sq.getTerms()) { spanQs.add(new SpanTermQuery(t)); } return addBoost(buildSpanOr(spanQs), boost); } return convertUnknownQuery(field, queryToConvert); }