Example usage for org.apache.lucene.sandbox.queries FuzzyLikeThisQuery addTerms

List of usage examples for org.apache.lucene.sandbox.queries FuzzyLikeThisQuery addTerms

Introduction

In this page you can find the example usage for org.apache.lucene.sandbox.queries FuzzyLikeThisQuery addTerms.

Prototype

public void addTerms(String queryString, String fieldName, float minSimilarity, int prefixLength) 

Source Link

Document

Adds user input for "fuzzification"

Usage

From source file:org.elasticsearch.index.query.FuzzyLikeThisFieldQueryParser.java

License:Apache License

@Override
public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
    XContentParser parser = parseContext.parser();

    int maxNumTerms = 25;
    float boost = 1.0f;
    String likeText = null;//from   ww w .jav  a  2  s .c  o  m
    Fuzziness fuzziness = DEFAULT_FUZZINESS;
    int prefixLength = 0;
    boolean ignoreTF = false;
    Analyzer analyzer = null;
    boolean failOnUnsupportedField = true;
    String queryName = null;

    XContentParser.Token token = parser.nextToken();
    if (token != XContentParser.Token.FIELD_NAME) {
        throw new QueryParsingException(parseContext.index(), "[flt_field] query malformed, no field");
    }
    String fieldName = parser.currentName();

    // now, we move after the field name, which starts the object
    token = parser.nextToken();
    if (token != XContentParser.Token.START_OBJECT) {
        throw new QueryParsingException(parseContext.index(), "[flt_field] query malformed, no start_object");
    }

    String currentFieldName = null;
    while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
        if (token == XContentParser.Token.FIELD_NAME) {
            currentFieldName = parser.currentName();
        } else if (token.isValue()) {
            if ("like_text".equals(currentFieldName) || "likeText".equals(currentFieldName)) {
                likeText = parser.text();
            } else if ("max_query_terms".equals(currentFieldName) || "maxQueryTerms".equals(currentFieldName)) {
                maxNumTerms = parser.intValue();
            } else if ("boost".equals(currentFieldName)) {
                boost = parser.floatValue();
            } else if ("ignore_tf".equals(currentFieldName) || "ignoreTF".equals(currentFieldName)) {
                ignoreTF = parser.booleanValue();
            } else if (FUZZINESS.match(currentFieldName, parseContext.parseFlags())) {
                fuzziness = Fuzziness.parse(parser);
            } else if ("prefix_length".equals(currentFieldName) || "prefixLength".equals(currentFieldName)) {
                prefixLength = parser.intValue();
            } else if ("analyzer".equals(currentFieldName)) {
                analyzer = parseContext.analysisService().analyzer(parser.text());
            } else if ("fail_on_unsupported_field".equals(currentFieldName)
                    || "failOnUnsupportedField".equals(currentFieldName)) {
                failOnUnsupportedField = parser.booleanValue();
            } else if ("_name".equals(currentFieldName)) {
                queryName = parser.text();
            } else {
                throw new QueryParsingException(parseContext.index(),
                        "[flt_field] query does not support [" + currentFieldName + "]");
            }
        }
    }

    if (likeText == null) {
        throw new QueryParsingException(parseContext.index(),
                "fuzzy_like_This_field requires 'like_text' to be specified");
    }

    MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
    if (smartNameFieldMappers != null) {
        if (smartNameFieldMappers.hasMapper()) {
            fieldName = smartNameFieldMappers.mapper().names().indexName();
            if (analyzer == null) {
                analyzer = smartNameFieldMappers.mapper().searchAnalyzer();
            }
        }
    }
    if (analyzer == null) {
        analyzer = parseContext.mapperService().searchAnalyzer();
    }
    if (!Analysis.generatesCharacterTokenStream(analyzer, fieldName)) {
        if (failOnUnsupportedField) {
            throw new ElasticsearchIllegalArgumentException(
                    "fuzzy_like_this_field doesn't support binary/numeric fields: [" + fieldName + "]");
        } else {
            return null;
        }
    }

    FuzzyLikeThisQuery fuzzyLikeThisQuery = new FuzzyLikeThisQuery(maxNumTerms, analyzer);
    fuzzyLikeThisQuery.addTerms(likeText, fieldName, fuzziness.asSimilarity(), prefixLength);
    fuzzyLikeThisQuery.setBoost(boost);
    fuzzyLikeThisQuery.setIgnoreTF(ignoreTF);

    // move to the next end object, to close the field name
    token = parser.nextToken();
    if (token != XContentParser.Token.END_OBJECT) {
        throw new QueryParsingException(parseContext.index(), "[flt_field] query malformed, no end_object");
    }
    assert token == XContentParser.Token.END_OBJECT;

    Query query = wrapSmartNameQuery(fuzzyLikeThisQuery, smartNameFieldMappers, parseContext);
    if (queryName != null) {
        parseContext.addNamedQuery(queryName, query);
    }
    return query;
}

From source file:org.elasticsearch.index.query.FuzzyLikeThisQueryParser.java

License:Apache License

@Override
public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
    XContentParser parser = parseContext.parser();

    int maxNumTerms = 25;
    float boost = 1.0f;
    List<String> fields = null;
    String likeText = null;//from   w ww.  jav a2s.  c o m
    Fuzziness fuzziness = Fuzziness.TWO;
    int prefixLength = 0;
    boolean ignoreTF = false;
    Analyzer analyzer = null;
    boolean failOnUnsupportedField = true;
    String queryName = null;

    XContentParser.Token token;
    String currentFieldName = null;
    while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
        if (token == XContentParser.Token.FIELD_NAME) {
            currentFieldName = parser.currentName();
        } else if (token.isValue()) {
            if ("like_text".equals(currentFieldName) || "likeText".equals(currentFieldName)) {
                likeText = parser.text();
            } else if ("max_query_terms".equals(currentFieldName) || "maxQueryTerms".equals(currentFieldName)) {
                maxNumTerms = parser.intValue();
            } else if ("boost".equals(currentFieldName)) {
                boost = parser.floatValue();
            } else if ("ignore_tf".equals(currentFieldName) || "ignoreTF".equals(currentFieldName)) {
                ignoreTF = parser.booleanValue();
            } else if (FUZZINESS.match(currentFieldName, parseContext.parseFlags())) {
                fuzziness = Fuzziness.parse(parser);
            } else if ("prefix_length".equals(currentFieldName) || "prefixLength".equals(currentFieldName)) {
                prefixLength = parser.intValue();
            } else if ("analyzer".equals(currentFieldName)) {
                analyzer = parseContext.analysisService().analyzer(parser.text());
            } else if ("fail_on_unsupported_field".equals(currentFieldName)
                    || "failOnUnsupportedField".equals(currentFieldName)) {
                failOnUnsupportedField = parser.booleanValue();
            } else if ("_name".equals(currentFieldName)) {
                queryName = parser.text();
            } else {
                throw new QueryParsingException(parseContext.index(),
                        "[flt] query does not support [" + currentFieldName + "]");
            }
        } else if (token == XContentParser.Token.START_ARRAY) {
            if ("fields".equals(currentFieldName)) {
                fields = Lists.newLinkedList();
                while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
                    fields.add(parseContext.indexName(parser.text()));
                }
            } else {
                throw new QueryParsingException(parseContext.index(),
                        "[flt] query does not support [" + currentFieldName + "]");
            }
        }
    }

    if (likeText == null) {
        throw new QueryParsingException(parseContext.index(),
                "fuzzy_like_this requires 'like_text' to be specified");
    }

    if (analyzer == null) {
        analyzer = parseContext.mapperService().searchAnalyzer();
    }

    FuzzyLikeThisQuery query = new FuzzyLikeThisQuery(maxNumTerms, analyzer);
    if (fields == null) {
        fields = Lists.newArrayList(parseContext.defaultField());
    } else if (fields.isEmpty()) {
        throw new QueryParsingException(parseContext.index(),
                "fuzzy_like_this requires 'fields' to be non-empty");
    }
    for (Iterator<String> it = fields.iterator(); it.hasNext();) {
        final String fieldName = it.next();
        if (!Analysis.generatesCharacterTokenStream(analyzer, fieldName)) {
            if (failOnUnsupportedField) {
                throw new ElasticsearchIllegalArgumentException(
                        "more_like_this doesn't support binary/numeric fields: [" + fieldName + "]");
            } else {
                it.remove();
            }
        }
    }
    if (fields.isEmpty()) {
        return null;
    }
    for (String field : fields) {
        query.addTerms(likeText, field, fuzziness.asSimilarity(), prefixLength);
    }
    query.setBoost(boost);
    query.setIgnoreTF(ignoreTF);

    if (queryName != null) {
        parseContext.addNamedQuery(queryName, query);
    }
    return query;
}