Example usage for org.apache.lucene.queryparser.flexible.core.nodes FieldQueryNode getTextAsString

List of usage examples for org.apache.lucene.queryparser.flexible.core.nodes FieldQueryNode getTextAsString

Introduction

In this page you can find the example usage for org.apache.lucene.queryparser.flexible.core.nodes FieldQueryNode getTextAsString.

Prototype

public String getTextAsString() 

Source Link

Usage

From source file:at.ac.univie.mminf.luceneSKOS.queryparser.flexible.standard.processors.SKOSQueryNodeProcessor.java

License:Apache License

@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {

    if (node instanceof TextableQueryNode && !(node instanceof WildcardQueryNode)
            && !(node instanceof FuzzyQueryNode) && !(node instanceof RegexpQueryNode)
            && !(node.getParent() instanceof RangeQueryNode)) {

        FieldQueryNode fieldNode = ((FieldQueryNode) node);
        String text = fieldNode.getTextAsString();
        String field = fieldNode.getFieldAsString();

        TokenStream source;/*w w w.ja  va2  s  .  co m*/
        try {
            source = this.analyzer.tokenStream(field, text);
            source.reset();
        } catch (IOException e1) {
            throw new RuntimeException(e1);
        }
        CachingTokenFilter buffer = new CachingTokenFilter(source);

        PositionIncrementAttribute posIncrAtt = null;
        int numTokens = 0;
        int positionCount = 0;
        boolean severalTokensAtSamePosition = false;

        if (buffer.hasAttribute(PositionIncrementAttribute.class)) {
            posIncrAtt = buffer.getAttribute(PositionIncrementAttribute.class);
        }

        try {

            while (buffer.incrementToken()) {
                numTokens++;
                int positionIncrement = (posIncrAtt != null) ? posIncrAtt.getPositionIncrement() : 1;
                if (positionIncrement != 0) {
                    positionCount += positionIncrement;

                } else {
                    severalTokensAtSamePosition = true;
                }

            }

        } catch (IOException e) {
            // ignore
        }

        try {
            // rewind the buffer stream
            buffer.reset();

            // close original stream - all tokens buffered
            source.close();
        } catch (IOException e) {
            // ignore
        }

        if (!buffer.hasAttribute(CharTermAttribute.class)) {
            return new NoTokenFoundQueryNode();
        }

        CharTermAttribute termAtt = buffer.getAttribute(CharTermAttribute.class);

        if (numTokens == 0) {
            return new NoTokenFoundQueryNode();

        } else if (numTokens == 1) {
            String term = null;
            try {
                boolean hasNext;
                hasNext = buffer.incrementToken();
                assert hasNext == true;
                term = termAtt.toString();

            } catch (IOException e) {
                // safe to ignore, because we know the number of tokens
            }

            fieldNode.setText(term);

            return fieldNode;

        } else if (severalTokensAtSamePosition || !(node instanceof QuotedFieldQueryNode)) {
            if (positionCount == 1 || !(node instanceof QuotedFieldQueryNode)) {
                // no phrase query:
                LinkedList<QueryNode> children = new LinkedList<QueryNode>();

                for (int i = 0; i < numTokens; i++) {
                    String term = null;
                    try {
                        boolean hasNext = buffer.incrementToken();
                        assert hasNext == true;
                        term = termAtt.toString();

                    } catch (IOException e) {
                        // safe to ignore, because we know the number of tokens
                    }

                    if (buffer.hasAttribute(SKOSTypeAttribute.class) && boosts != null) {

                        SKOSTypeAttribute skosAttr = buffer.getAttribute(SKOSTypeAttribute.class);
                        children.add(new BoostQueryNode(new FieldQueryNode(field, term, -1, -1),
                                getBoost(skosAttr.getSkosType())));

                    } else {

                        children.add(new FieldQueryNode(field, term, -1, -1));

                    }

                }
                return new GroupQueryNode(new StandardBooleanQueryNode(children, positionCount == 1));
            } else {
                // phrase query:
                MultiPhraseQueryNode mpq = new MultiPhraseQueryNode();

                List<FieldQueryNode> multiTerms = new ArrayList<FieldQueryNode>();
                int position = -1;
                int i = 0;
                int termGroupCount = 0;
                for (; i < numTokens; i++) {
                    String term = null;
                    int positionIncrement = 1;
                    try {
                        boolean hasNext = buffer.incrementToken();
                        assert hasNext == true;
                        term = termAtt.toString();
                        if (posIncrAtt != null) {
                            positionIncrement = posIncrAtt.getPositionIncrement();
                        }

                    } catch (IOException e) {
                        // safe to ignore, because we know the number of tokens
                    }

                    if (positionIncrement > 0 && multiTerms.size() > 0) {

                        for (FieldQueryNode termNode : multiTerms) {

                            if (this.positionIncrementsEnabled) {
                                termNode.setPositionIncrement(position);
                            } else {
                                termNode.setPositionIncrement(termGroupCount);
                            }

                            mpq.add(termNode);

                        }

                        // Only increment once for each "group" of
                        // terms that were in the same position:
                        termGroupCount++;

                        multiTerms.clear();

                    }

                    position += positionIncrement;
                    multiTerms.add(new FieldQueryNode(field, term, -1, -1));

                }

                for (FieldQueryNode termNode : multiTerms) {

                    if (this.positionIncrementsEnabled) {
                        termNode.setPositionIncrement(position);

                    } else {
                        termNode.setPositionIncrement(termGroupCount);
                    }

                    mpq.add(termNode);

                }

                return mpq;

            }

        } else {

            TokenizedPhraseQueryNode pq = new TokenizedPhraseQueryNode();

            int position = -1;

            for (int i = 0; i < numTokens; i++) {
                String term = null;
                int positionIncrement = 1;

                try {
                    boolean hasNext = buffer.incrementToken();
                    assert hasNext == true;
                    term = termAtt.toString();

                    if (posIncrAtt != null) {
                        positionIncrement = posIncrAtt.getPositionIncrement();
                    }

                } catch (IOException e) {
                    // safe to ignore, because we know the number of tokens
                }

                FieldQueryNode newFieldNode = new FieldQueryNode(field, term, -1, -1);

                if (this.positionIncrementsEnabled) {
                    position += positionIncrement;
                    newFieldNode.setPositionIncrement(position);

                } else {
                    newFieldNode.setPositionIncrement(i);
                }

                pq.add(newFieldNode);

            }

            return pq;

        }

    }

    return node;

}

From source file:com.sindicetech.siren.qparser.keyword.builders.FieldQueryNodeBuilder.java

License:Open Source License

public NodeQuery build(QueryNode queryNode) throws QueryNodeException {
    final FieldQueryNode fieldNode = (FieldQueryNode) queryNode;

    // if it is tagged as a span query
    if (fieldNode.getTag(QueryTypeProcessor.QUERYTYPE_TAG) == QueryTypeProcessor.SPAN_QUERYTYPE) {
        // create the term span query
        TermSpanQuery tsq = new TermSpanQuery(
                new Term(fieldNode.getFieldAsString(), fieldNode.getTextAsString()));
        // assign the datatype. We must always have a datatype assigned.
        tsq.setDatatype((String) queryNode.getTag(DatatypeQueryNode.DATATYPE_TAGID));
        return tsq;
    } else {/*  www  . jav a2 s . c  o m*/
        // create the node term query
        NodeTermQuery ntq = new NodeTermQuery(
                new Term(fieldNode.getFieldAsString(), fieldNode.getTextAsString()));
        // assign the datatype. We must always have a datatype assigned.
        ntq.setDatatype((String) queryNode.getTag(DatatypeQueryNode.DATATYPE_TAGID));
        return ntq;
    }
}

From source file:com.sindicetech.siren.qparser.keyword.builders.NodeTermRangeQueryNodeBuilder.java

License:Open Source License

public NodeQuery build(final QueryNode queryNode) throws QueryNodeException {
    final TermRangeQueryNode rangeNode = (TermRangeQueryNode) queryNode;
    final FieldQueryNode upper = rangeNode.getUpperBound();
    final FieldQueryNode lower = rangeNode.getLowerBound();

    final String field = StringUtils.toString(rangeNode.getField());
    String lowerText = lower.getTextAsString();
    String upperText = upper.getTextAsString();

    if (lowerText.length() == 0) {
        lowerText = null;/*from  ww w  .ja  v a  2s.c  o  m*/
    }

    if (upperText.length() == 0) {
        upperText = null;
    }

    final NodeTermRangeQuery rangeQuery = NodeTermRangeQuery.newStringRange(field, lowerText, upperText,
            rangeNode.isLowerInclusive(), rangeNode.isUpperInclusive());

    final MultiNodeTermQuery.RewriteMethod method = (MultiNodeTermQuery.RewriteMethod) queryNode
            .getTag(MultiNodeTermRewriteMethodProcessor.TAG_ID);

    if (method != null) {
        rangeQuery.setRewriteMethod(method);
    }

    // if it is tagged as a span query
    if (rangeNode.getTag(QueryTypeProcessor.QUERYTYPE_TAG) == QueryTypeProcessor.SPAN_QUERYTYPE) {
        return new MultiTermSpanQuery<>(rangeQuery);
    } else {
        return rangeQuery;
    }
}

From source file:com.sindicetech.siren.qparser.keyword.processors.DatatypeAnalyzerProcessor.java

License:Open Source License

private CachingTokenFilter getBuffer(Analyzer analyzer, FieldQueryNode fieldNode) {
    final TokenStream source;
    final String text = fieldNode.getTextAsString();
    final String field = fieldNode.getFieldAsString();

    try {/*from w  ww.j a  v  a2s.  co  m*/
        source = analyzer.tokenStream(field, new StringReader(text));
        source.reset();
    } catch (final IOException e1) {
        throw new RuntimeException(e1);
    }
    return new CachingTokenFilter(source);
}

From source file:com.sindicetech.siren.qparser.keyword.processors.NodeNumericQueryNodeProcessor.java

License:Open Source License

@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {

    if (node instanceof FieldQueryNode && !(node.getParent() instanceof RangeQueryNode)) {
        final FieldQueryNode fieldNode = (FieldQueryNode) node;

        String datatype = (String) DatatypeProcessor.getDatatype(this.getQueryConfigHandler(), node);
        final Map<String, Analyzer> dts = this.getQueryConfigHandler()
                .get(KeywordConfigurationKeys.DATATYPES_ANALYZERS);
        final Analyzer analyzer = dts.get(node.getTag(DatatypeQueryNode.DATATYPE_TAGID));

        if (analyzer instanceof NumericAnalyzer) {
            final NumericAnalyzer na = (NumericAnalyzer) analyzer;
            final char[] text = fieldNode.getTextAsString().toCharArray();
            final ReusableCharArrayReader textReader = new ReusableCharArrayReader(text);
            final Number number;
            try {
                number = na.getNumericParser().parse(textReader);
            } catch (final Exception e) {
                throw new QueryNodeParseException(
                        new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER, text), e);
            }/*  ww w.j  a  v a 2 s.c o  m*/

            final CharSequence field = fieldNode.getField();
            final NodeNumericQueryNode lowerNode = new NodeNumericQueryNode(field, number);
            // assign datatype
            lowerNode.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);
            final NodeNumericQueryNode upperNode = new NodeNumericQueryNode(field, number);
            // assign datatype
            upperNode.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);

            // Create the NodeNumericRangeQueryNode
            node = new NodeNumericRangeQueryNode(lowerNode, upperNode, true, true, na);
            // assign datatype
            node.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);
        }
    }
    return node;
}

From source file:com.sindicetech.siren.qparser.keyword.processors.NodeNumericRangeQueryNodeProcessor.java

License:Open Source License

@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
    if (node instanceof TermRangeQueryNode) {
        final TermRangeQueryNode termRangeNode = (TermRangeQueryNode) node;

        String datatype = (String) DatatypeProcessor.getDatatype(this.getQueryConfigHandler(), node);
        final Map<String, Analyzer> dts = this.getQueryConfigHandler()
                .get(KeywordConfigurationKeys.DATATYPES_ANALYZERS);
        final Analyzer analyzer = dts.get(datatype);

        if (analyzer instanceof NumericAnalyzer) {
            final NumericAnalyzer na = (NumericAnalyzer) analyzer;

            final FieldQueryNode lower = termRangeNode.getLowerBound();
            final FieldQueryNode upper = termRangeNode.getUpperBound();

            final char[] lowerText = lower.getTextAsString().toCharArray();
            final char[] upperText = upper.getTextAsString().toCharArray();

            // Parse the lower and upper bound
            final NumericParser<?> parser = na.getNumericParser();
            final Number lowerNumber;
            try {
                if (lowerText.length == 0) { // open bound
                    lowerNumber = null;//  www  .ja va 2  s  .  c o  m
                } else {
                    final ReusableCharArrayReader lowerReader = new ReusableCharArrayReader(lowerText);
                    lowerNumber = parser.parse(lowerReader);
                }
            } catch (final Exception e) {
                throw new QueryNodeParseException(new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER,
                        lowerText, parser.getNumericType() + " parser"), e);
            }
            final Number upperNumber;
            try {
                if (upperText.length == 0) { // open bound
                    upperNumber = null;
                } else {
                    final ReusableCharArrayReader upperReader = new ReusableCharArrayReader(upperText);
                    upperNumber = parser.parse(upperReader);
                }
            } catch (final Exception e) {
                throw new QueryNodeParseException(new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER,
                        upperText, parser.getNumericType() + " parser"), e);
            }

            // Create two NodeNumericQueryNode for the lower and upper bound
            final CharSequence field = termRangeNode.getField();
            final NodeNumericQueryNode lowerNode = new NodeNumericQueryNode(field, lowerNumber);
            // assign datatype
            lowerNode.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);
            final NodeNumericQueryNode upperNode = new NodeNumericQueryNode(field, upperNumber);
            // assign datatype
            upperNode.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);

            final boolean lowerInclusive = termRangeNode.isLowerInclusive();
            final boolean upperInclusive = termRangeNode.isUpperInclusive();

            // Create the NodeNumericRangeQueryNode
            node = new NodeNumericRangeQueryNode(lowerNode, upperNode, lowerInclusive, upperInclusive, na);
            // assign datatype
            node.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);
        }
    }
    return node;
}

From source file:com.sindicetech.siren.qparser.keyword.processors.PhraseQueryNodeProcessor.java

License:Open Source License

@Override
protected QueryNode postProcessNode(final QueryNode node) throws QueryNodeException {
    if (node instanceof TextableQueryNode && !(node instanceof WildcardQueryNode)
            && !(node instanceof FuzzyQueryNode) && !(node instanceof RegexpQueryNode)
            && !(node instanceof ProtectedQueryNode) && !(node.getParent() instanceof RangeQueryNode)) {

        final FieldQueryNode fieldNode = ((FieldQueryNode) node);
        final String text = fieldNode.getTextAsString();
        final String field = fieldNode.getFieldAsString();

        final TokenStream source;
        try {//from w ww.  j  a v a 2  s  .co m
            source = this.analyzer.tokenStream(field, new StringReader(text));
            source.reset();
        } catch (final IOException e1) {
            throw new RuntimeException(e1);
        }
        final CachingTokenFilter buffer = new CachingTokenFilter(source);

        int numTokens = 0;
        try {
            while (buffer.incrementToken()) {
                numTokens++;
            }
        } catch (final IOException e) {
            // ignore
        }

        try {
            // rewind the buffer stream
            buffer.reset();
            // close original stream - all tokens buffered
            source.close();
        } catch (final IOException e) {
            // ignore
        }

        if (!buffer.hasAttribute(CharTermAttribute.class)) {
            return new NoTokenFoundQueryNode();
        }
        final CharTermAttribute termAtt = buffer.getAttribute(CharTermAttribute.class);

        if (numTokens == 0) {
            return new NoTokenFoundQueryNode();
        }
        // phrase query
        else if (numTokens != 1) {
            String datatype = (String) DatatypeProcessor.getDatatype(this.getQueryConfigHandler(), node);
            final TokenizedPhraseQueryNode pq = new TokenizedPhraseQueryNode();
            // assign datatype
            pq.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);

            for (int i = 0; i < numTokens; i++) {
                String term = null;

                try {
                    final boolean hasNext = buffer.incrementToken();
                    assert hasNext == true;
                    term = termAtt.toString();

                } catch (final IOException e) {
                    // safe to ignore, because we know the number of tokens
                }

                final FieldQueryNode newFieldNode = new FieldQueryNode(field, term, -1, -1);
                // set position increment
                newFieldNode.setPositionIncrement(i);
                // assign datatype
                newFieldNode.setTag(DatatypeQueryNode.DATATYPE_TAGID, datatype);
                pq.add(newFieldNode);
            }
            return pq;
        }
    }
    return node;
}

From source file:org.sindice.siren.qparser.keyword.builders.FieldQueryNodeBuilder.java

License:Apache License

public NodeTermQuery build(QueryNode queryNode) throws QueryNodeException {
    final FieldQueryNode fieldNode = (FieldQueryNode) queryNode;

    return new NodeTermQuery(new Term(fieldNode.getFieldAsString(), fieldNode.getTextAsString()));
}

From source file:org.sindice.siren.qparser.keyword.builders.NodeTermRangeQueryNodeBuilder.java

License:Apache License

public NodeTermRangeQuery build(final QueryNode queryNode) throws QueryNodeException {
    final TermRangeQueryNode rangeNode = (TermRangeQueryNode) queryNode;
    final FieldQueryNode upper = rangeNode.getUpperBound();
    final FieldQueryNode lower = rangeNode.getLowerBound();

    final String field = StringUtils.toString(rangeNode.getField());
    String lowerText = lower.getTextAsString();
    String upperText = upper.getTextAsString();

    if (lowerText.length() == 0) {
        lowerText = null;/*from   w w w  .ja va2  s  . c  om*/
    }

    if (upperText.length() == 0) {
        upperText = null;
    }

    final NodeTermRangeQuery rangeQuery = NodeTermRangeQuery.newStringRange(field, lowerText, upperText,
            rangeNode.isLowerInclusive(), rangeNode.isUpperInclusive());

    final MultiNodeTermQuery.RewriteMethod method = (MultiNodeTermQuery.RewriteMethod) queryNode
            .getTag(MultiNodeTermRewriteMethodProcessor.TAG_ID);
    if (method != null) {
        rangeQuery.setRewriteMethod(method);
    }
    return rangeQuery;
}

From source file:org.sindice.siren.qparser.keyword.processors.DatatypeAnalyzerProcessor.java

License:Apache License

@Override
protected QueryNode postProcessNode(final QueryNode node) throws QueryNodeException {
    if (node instanceof TextableQueryNode && !(node instanceof WildcardQueryNode)
            && !(node instanceof FuzzyQueryNode) && !(node instanceof RegexpQueryNode)
            && !(node.getParent() instanceof RangeQueryNode)) {

        this.positionIncrementsEnabled = false;
        final Boolean positionIncrementsEnabled = this.getQueryConfigHandler()
                .get(ConfigurationKeys.ENABLE_POSITION_INCREMENTS);
        if (positionIncrementsEnabled != null) {
            this.positionIncrementsEnabled = positionIncrementsEnabled;
        }// w  w w  .  j  a v  a  2s. c  o  m

        final FieldQueryNode fieldNode = ((FieldQueryNode) node);
        final String text = fieldNode.getTextAsString();
        final String field = fieldNode.getFieldAsString();
        final String datatype = (String) fieldNode.getTag(DatatypeQueryNode.DATATYPE_TAGID);

        if (datatype == null) {
            return node;
        }

        final Analyzer analyzer = this.getQueryConfigHandler().get(KeywordConfigurationKeys.DATATYPES_ANALYZERS)
                .get(datatype);
        if (analyzer == null) {
            throw new QueryNodeException(new MessageImpl(QueryParserMessages.INVALID_SYNTAX,
                    "No analyzer associated with " + datatype));
        }

        PositionIncrementAttribute posIncrAtt = null;
        int numTokens = 0;
        int positionCount = 0;
        boolean severalTokensAtSamePosition = false;

        final TokenStream source;
        try {
            source = analyzer.tokenStream(field, new StringReader(text));
            source.reset();
        } catch (final IOException e1) {
            throw new RuntimeException(e1);
        }
        final CachingTokenFilter buffer = new CachingTokenFilter(source);

        if (buffer.hasAttribute(PositionIncrementAttribute.class)) {
            posIncrAtt = buffer.getAttribute(PositionIncrementAttribute.class);
        }

        try {
            while (buffer.incrementToken()) {
                numTokens++;
                final int positionIncrement = (posIncrAtt != null) ? posIncrAtt.getPositionIncrement() : 1;
                if (positionIncrement != 0) {
                    positionCount += positionIncrement;
                } else {
                    severalTokensAtSamePosition = true;
                }
            }
        } catch (final IOException e) {
            // ignore
        }

        try {
            // rewind the buffer stream
            buffer.reset();
            // close original stream - all tokens buffered
            source.close();
        } catch (final IOException e) {
            // ignore
        }

        if (!buffer.hasAttribute(CharTermAttribute.class)) {
            return new NoTokenFoundQueryNode();
        }
        final CharTermAttribute termAtt = buffer.getAttribute(CharTermAttribute.class);

        if (numTokens == 0) {
            if (nbTwigs != 0) { // Twig special case
                return new WildcardNodeQueryNode();
            }
            return new NoTokenFoundQueryNode();
        } else if (numTokens == 1) {
            String term = null;
            try {
                boolean hasNext;
                hasNext = buffer.incrementToken();
                assert hasNext == true;
                term = termAtt.toString();
            } catch (final IOException e) {
                // safe to ignore, because we know the number of tokens
            }
            fieldNode.setText(term);
            return fieldNode;
        } else {
            // no phrase query:
            final LinkedList<QueryNode> children = new LinkedList<QueryNode>();

            int position = -1;

            for (int i = 0; i < numTokens; i++) {
                String term = null;
                final int positionIncrement = 1;

                try {
                    final boolean hasNext = buffer.incrementToken();
                    assert hasNext == true;
                    term = termAtt.toString();

                } catch (final IOException e) {
                    // safe to ignore, because we know the number of tokens
                }

                final FieldQueryNode newFieldNode = new FieldQueryNode(field, term, -1, -1);

                if (this.positionIncrementsEnabled) {
                    position += positionIncrement;
                    newFieldNode.setPositionIncrement(position);
                } else {
                    newFieldNode.setPositionIncrement(i);
                }

                children.add(new FieldQueryNode(field, term, -1, -1));
            }

            if (node.getParent() instanceof TokenizedPhraseQueryNode) {
                throw new QueryNodeException(new MessageImpl("Cannot build a MultiPhraseQuery"));
            }
            // If multiple terms at one single position, this must be a query
            // expansion. Perform a OR between the terms.
            if (severalTokensAtSamePosition && positionCount == 1) {
                return new GroupQueryNode(new OrQueryNode(children));
            }
            // if several tokens at same position && position count > 1, then
            // results can be unexpected
            else {
                final TokenizedPhraseQueryNode pq = new TokenizedPhraseQueryNode();
                for (int i = 0; i < children.size(); i++) {
                    pq.add(children.get(i));
                }
                return pq;
            }
        }
    } else if (node instanceof TwigQueryNode) {
        nbTwigs--;
        assert nbTwigs >= 0;
    }
    return node;
}