Example usage for org.apache.lucene.expressions SimpleBindings add

List of usage examples for org.apache.lucene.expressions SimpleBindings add

Introduction

In this page you can find the example usage for org.apache.lucene.expressions SimpleBindings add.

Prototype

public void add(SortField sortField) 

Source Link

Document

Adds a SortField to the bindings.

Usage

From source file:com.czw.search.lucene.example.facet.DistanceFacetsExample.java

License:Apache License

private DoubleValuesSource getDistanceValueSource() {
    Expression distance;/*w ww .  j  ava2  s . c om*/
    try {
        distance = JavascriptCompiler
                .compile("haversin(" + ORIGIN_LATITUDE + "," + ORIGIN_LONGITUDE + ",latitude,longitude)");
    } catch (ParseException pe) {
        // Should not happen
        throw new RuntimeException(pe);
    }
    SimpleBindings bindings = new SimpleBindings();
    bindings.add(new SortField("latitude", SortField.Type.DOUBLE));
    bindings.add(new SortField("longitude", SortField.Type.DOUBLE));

    return distance.getDoubleValuesSource(bindings);
}

From source file:com.czw.search.lucene.example.facet.ExpressionAggregationFacetsExample.java

License:Apache License

/** User runs a query and aggregates facets. */
private FacetResult search() throws IOException, ParseException {
    DirectoryReader indexReader = DirectoryReader.open(indexDir);
    IndexSearcher searcher = new IndexSearcher(indexReader);
    TaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);

    // Aggregate categories by an expression that combines the document's score
    // and its popularity field
    Expression expr = JavascriptCompiler.compile("_score * sqrt(popularity)");
    SimpleBindings bindings = new SimpleBindings();
    bindings.add(new SortField("_score", SortField.Type.SCORE)); // the score of the document
    bindings.add(new SortField("popularity", SortField.Type.LONG)); // the value of the 'popularity' field

    // Aggregates the facet values
    FacetsCollector fc = new FacetsCollector(true);

    // MatchAllDocsQuery is for "browsing" (counts facets
    // for all non-deleted docs in the index); normally
    // you'd use a "normal" query:
    FacetsCollector.search(searcher, new MatchAllDocsQuery(), 10, fc);

    // Retrieve results
    Facets facets = new TaxonomyFacetSumValueSource(taxoReader, config, fc,
            expr.getDoubleValuesSource(bindings));
    FacetResult result = facets.getTopChildren(10, "A");

    indexReader.close();/*from ww  w .j  a va2s  .co m*/
    taxoReader.close();

    return result;
}

From source file:com.search.lucene.demo.facet.DistanceFacetsExample.java

License:Apache License

private ValueSource getDistanceValueSource() {
    Expression distance;/* w  w  w.ja v a  2  s .  c  o m*/
    try {
        distance = JavascriptCompiler
                .compile("haversin(" + ORIGIN_LATITUDE + "," + ORIGIN_LONGITUDE + ",latitude,longitude)");
    } catch (ParseException pe) {
        // Should not happen
        throw new RuntimeException(pe);
    }
    SimpleBindings bindings = new SimpleBindings();
    bindings.add(new SortField("latitude", SortField.Type.DOUBLE));
    bindings.add(new SortField("longitude", SortField.Type.DOUBLE));

    return distance.getValueSource(bindings);
}

From source file:com.search.lucene.demo.facet.ExpressionAggregationFacetsExample.java

License:Apache License

/** User runs a query and aggregates facets. */
private FacetResult search() throws IOException, ParseException {
    DirectoryReader indexReader = DirectoryReader.open(indexDir);
    IndexSearcher searcher = new IndexSearcher(indexReader);
    TaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);

    // Aggregate categories by an expression that combines the document's score
    // and its popularity field
    Expression expr = JavascriptCompiler.compile("_score * sqrt(popularity)");
    SimpleBindings bindings = new SimpleBindings();
    bindings.add(new SortField("_score", SortField.Type.SCORE)); // the score of the document
    bindings.add(new SortField("popularity", SortField.Type.LONG)); // the value of the 'popularity' field

    // Aggregates the facet values
    FacetsCollector fc = new FacetsCollector(true);

    // MatchAllDocsQuery is for "browsing" (counts facets
    // for all non-deleted docs in the index); normally
    // you'd use a "normal" query:
    FacetsCollector.search(searcher, new MatchAllDocsQuery(), 10, fc);

    // Retrieve results
    Facets facets = new TaxonomyFacetSumValueSource(taxoReader, config, fc, expr.getValueSource(bindings));
    FacetResult result = facets.getTopChildren(10, "A");

    indexReader.close();//from   ww w .j a  va 2 s.c o m
    taxoReader.close();

    return result;
}

From source file:com.yida.framework.lucene5.facet.DistanceFacetsExample.java

License:Creative Commons License

private ValueSource getDistanceValueSource() {
    Expression distance;//from w  w  w  . j a  va  2  s .  c  om
    try {
        //haversin?????Google ?haversin?
        distance = JavascriptCompiler
                .compile("haversin(" + ORIGIN_LATITUDE + "," + ORIGIN_LONGITUDE + ",latitude,longitude)");
    } catch (ParseException pe) {
        throw new RuntimeException(pe);
    }
    SimpleBindings bindings = new SimpleBindings();
    //??????????????
    bindings.add(new SortField("latitude", SortField.Type.DOUBLE));
    //??????
    bindings.add(new SortField("longitude", SortField.Type.DOUBLE));

    return distance.getValueSource(bindings);
}

From source file:org.apache.solr.schema.WrappedIntField.java

License:Apache License

@Override
public SortField getSortField(final SchemaField field, final boolean reverse) {
    field.checkSortability();//from   w  ww.j a v a2  s  . c  o  m
    SimpleBindings bindings = new SimpleBindings();
    bindings.add(super.getSortField(field, reverse));
    return expr.getSortField(bindings, reverse);
}

From source file:org.apache.solr.schema.WrappedIntPointField.java

License:Apache License

/** static helper for re-use in sibling trie class */
public static SortField getSortField(final SortField superSort, final SchemaField field) {
    field.checkSortability();//from  w  w w.ja v  a2 s.  c o m
    Expression expr = null;
    try {
        expr = JavascriptCompiler.compile(field.getName() + " % 3");
    } catch (Exception e) {
        throw new RuntimeException("impossible?", e);
    }
    SimpleBindings bindings = new SimpleBindings();
    bindings.add(superSort);
    return expr.getSortField(bindings, superSort.getReverse());
}

From source file:org.apache.solr.spelling.suggest.DocumentExpressionDictionaryFactory.java

License:Apache License

public ValueSource fromExpression(String weightExpression, Set<SortField> sortFields) {
    Expression expression = null;
    try {/*from w w w .  j a  va  2s .co m*/
        expression = JavascriptCompiler.compile(weightExpression);
    } catch (ParseException e) {
        throw new RuntimeException();
    }
    SimpleBindings bindings = new SimpleBindings();
    for (SortField sortField : sortFields) {
        bindings.add(sortField);
    }
    return expression.getValueSource(bindings);
}

From source file:org.elasticsearch.script.expression.ExpressionScriptEngine.java

License:Apache License

private SearchScript.LeafFactory newSearchScript(Expression expr, SearchLookup lookup,
        @Nullable Map<String, Object> vars) {
    MapperService mapper = lookup.doc().mapperService();
    // NOTE: if we need to do anything complicated with bindings in the future, we can just extend Bindings,
    // instead of complicating SimpleBindings (which should stay simple)
    SimpleBindings bindings = new SimpleBindings();
    ReplaceableConstDoubleValueSource specialValue = null;
    boolean needsScores = false;
    for (String variable : expr.variables) {
        try {/*  w w w. j a v a2s.c om*/
            if (variable.equals("_score")) {
                bindings.add(new SortField("_score", SortField.Type.SCORE));
                needsScores = true;
            } else if (variable.equals("_value")) {
                specialValue = new ReplaceableConstDoubleValueSource();
                bindings.add("_value", specialValue);
                // noop: _value is special for aggregations, and is handled in ExpressionScriptBindings
                // TODO: if some uses it in a scoring expression, they will get a nasty failure when evaluating...need a
                // way to know this is for aggregations and so _value is ok to have...

            } else if (vars != null && vars.containsKey(variable)) {
                // TODO: document and/or error if vars contains _score?
                // NOTE: by checking for the variable in vars first, it allows masking document fields with a global constant,
                // but if we were to reverse it, we could provide a way to supply dynamic defaults for documents missing the field?
                Object value = vars.get(variable);
                if (value instanceof Number) {
                    bindings.add(variable,
                            new DoubleConstValueSource(((Number) value).doubleValue()).asDoubleValuesSource());
                } else {
                    throw new ParseException("Parameter [" + variable + "] must be a numeric type", 0);
                }

            } else {
                String fieldname = null;
                String methodname = null;
                String variablename = "value"; // .value is the default for doc['field'], its optional.
                boolean dateAccessor = false; // true if the variable is of type doc['field'].date.xxx
                VariableContext[] parts = VariableContext.parse(variable);
                if (parts[0].text.equals("doc") == false) {
                    throw new ParseException("Unknown variable [" + parts[0].text + "]", 0);
                }
                if (parts.length < 2 || parts[1].type != VariableContext.Type.STR_INDEX) {
                    throw new ParseException(
                            "Variable 'doc' must be used with a specific field like: doc['myfield']", 3);
                } else {
                    fieldname = parts[1].text;
                }
                if (parts.length == 3) {
                    if (parts[2].type == VariableContext.Type.METHOD) {
                        methodname = parts[2].text;
                    } else if (parts[2].type == VariableContext.Type.MEMBER) {
                        variablename = parts[2].text;
                    } else {
                        throw new IllegalArgumentException(
                                "Only member variables or member methods may be accessed on a field when not accessing the field directly");
                    }
                }
                if (parts.length > 3) {
                    // access to the .date "object" within the field
                    if (parts.length == 4
                            && ("date".equals(parts[2].text) || "getDate".equals(parts[2].text))) {
                        if (parts[3].type == VariableContext.Type.METHOD) {
                            methodname = parts[3].text;
                            dateAccessor = true;
                        } else if (parts[3].type == VariableContext.Type.MEMBER) {
                            variablename = parts[3].text;
                            dateAccessor = true;
                        }
                    }
                    if (!dateAccessor) {
                        throw new IllegalArgumentException("Variable [" + variable
                                + "] does not follow an allowed format of either doc['field'] or doc['field'].method()");
                    }
                }

                MappedFieldType fieldType = mapper.fullName(fieldname);

                if (fieldType == null) {
                    throw new ParseException("Field [" + fieldname + "] does not exist in mappings", 5);
                }

                IndexFieldData<?> fieldData = lookup.doc().getForField(fieldType);

                // delegate valuesource creation based on field's type
                // there are three types of "fields" to expressions, and each one has a different "api" of variables and methods.

                final ValueSource valueSource;
                if (fieldType instanceof GeoPointFieldType) {
                    // geo
                    if (methodname == null) {
                        valueSource = GeoField.getVariable(fieldData, fieldname, variablename);
                    } else {
                        valueSource = GeoField.getMethod(fieldData, fieldname, methodname);
                    }
                } else if (fieldType instanceof DateFieldMapper.DateFieldType) {
                    if (dateAccessor) {
                        // date object
                        if (methodname == null) {
                            valueSource = DateObject.getVariable(fieldData, fieldname, variablename);
                        } else {
                            valueSource = DateObject.getMethod(fieldData, fieldname, methodname);
                        }
                    } else {
                        // date field itself
                        if (methodname == null) {
                            valueSource = DateField.getVariable(fieldData, fieldname, variablename);
                        } else {
                            valueSource = DateField.getMethod(fieldData, fieldname, methodname);
                        }
                    }
                } else if (fieldData instanceof IndexNumericFieldData) {
                    // number
                    if (methodname == null) {
                        valueSource = NumericField.getVariable(fieldData, fieldname, variablename);
                    } else {
                        valueSource = NumericField.getMethod(fieldData, fieldname, methodname);
                    }
                } else {
                    throw new ParseException("Field [" + fieldname + "] must be numeric, date, or geopoint", 5);
                }
                needsScores |= valueSource.getSortField(false).needsScores();
                bindings.add(variable, valueSource.asDoubleValuesSource());
            }
        } catch (Exception e) {
            // we defer "binding" of variables until here: give context for that variable
            throw convertToScriptException("link error", expr.sourceText, variable, e);
        }
    }
    return new ExpressionSearchScript(expr, bindings, specialValue, needsScores);
}

From source file:org.elasticsearch.script.expression.ExpressionScriptEngineService.java

License:Apache License

@Override
public SearchScript search(CompiledScript compiledScript, SearchLookup lookup,
        @Nullable Map<String, Object> vars) {
    try {/*from w  w  w .j a  va2s .  co m*/
        Expression expr = (Expression) compiledScript.compiled();
        MapperService mapper = lookup.doc().mapperService();
        // NOTE: if we need to do anything complicated with bindings in the future, we can just extend Bindings,
        // instead of complicating SimpleBindings (which should stay simple)
        SimpleBindings bindings = new SimpleBindings();
        ReplaceableConstValueSource specialValue = null;

        for (String variable : expr.variables) {
            if (variable.equals("_score")) {
                bindings.add(new SortField("_score", SortField.Type.SCORE));
            } else if (variable.equals("_value")) {
                specialValue = new ReplaceableConstValueSource();
                bindings.add("_value", specialValue);
                // noop: _value is special for aggregations, and is handled in ExpressionScriptBindings
                // TODO: if some uses it in a scoring expression, they will get a nasty failure when evaluating...need a
                // way to know this is for aggregations and so _value is ok to have...

            } else if (vars != null && vars.containsKey(variable)) {
                // TODO: document and/or error if vars contains _score?
                // NOTE: by checking for the variable in vars first, it allows masking document fields with a global constant,
                // but if we were to reverse it, we could provide a way to supply dynamic defaults for documents missing the field?
                Object value = vars.get(variable);
                if (value instanceof Number) {
                    bindings.add(variable, new DoubleConstValueSource(((Number) value).doubleValue()));
                } else {
                    throw new ScriptException("Parameter [" + variable + "] must be a numeric type");
                }

            } else {
                String fieldname = null;
                String methodname = null;
                VariableContext[] parts = VariableContext.parse(variable);
                if (parts[0].text.equals("doc") == false) {
                    throw new ScriptException("Unknown variable [" + parts[0].text + "] in expression");
                }
                if (parts.length < 2 || parts[1].type != VariableContext.Type.STR_INDEX) {
                    throw new ScriptException(
                            "Variable 'doc' in expression must be used with a specific field like: doc['myfield']");
                } else {
                    fieldname = parts[1].text;
                }
                if (parts.length == 3) {
                    if (parts[2].type == VariableContext.Type.METHOD) {
                        methodname = parts[2].text;
                    } else if (parts[2].type != VariableContext.Type.MEMBER || !"value".equals(parts[2].text)) {
                        throw new ScriptException(
                                "Only the member variable [value] or member methods may be accessed on a field when not accessing the field directly");
                    }
                }
                if (parts.length > 3) {
                    throw new ScriptException("Variable [" + variable
                            + "] does not follow an allowed format of either doc['field'] or doc['field'].method()");
                }

                MappedFieldType fieldType = mapper.smartNameFieldType(fieldname);

                if (fieldType == null) {
                    throw new ScriptException(
                            "Field [" + fieldname + "] used in expression does not exist in mappings");
                }
                if (fieldType.isNumeric() == false) {
                    // TODO: more context (which expression?)
                    throw new ScriptException("Field [" + fieldname + "] used in expression must be numeric");
                }

                IndexFieldData<?> fieldData = lookup.doc().fieldDataService()
                        .getForField((NumberFieldMapper.NumberFieldType) fieldType);
                if (methodname == null) {
                    bindings.add(variable, new FieldDataValueSource(fieldData, MultiValueMode.MIN));
                } else {
                    bindings.add(variable, getMethodValueSource(fieldType, fieldData, fieldname, methodname));
                }
            }
        }

        final boolean needsScores = expr.getSortField(bindings, false).needsScores();
        return new ExpressionSearchScript(compiledScript, bindings, specialValue, needsScores);
    } catch (Exception exception) {
        throw new ScriptException("Error during search with " + compiledScript, exception);
    }
}