Example usage for org.apache.lucene.search.spans SpanQuery getField

List of usage examples for org.apache.lucene.search.spans SpanQuery getField

Introduction

In this page you can find the example usage for org.apache.lucene.search.spans SpanQuery getField.

Prototype

public abstract String getField();

Source Link

Document

Returns the name of the field matched by this query.

Usage

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);
}