Example usage for org.apache.lucene.queries.function FunctionQuery FunctionQuery

List of usage examples for org.apache.lucene.queries.function FunctionQuery FunctionQuery

Introduction

In this page you can find the example usage for org.apache.lucene.queries.function FunctionQuery FunctionQuery.

Prototype

public FunctionQuery(ValueSource func) 

Source Link

Usage

From source file:com.difference.historybook.index.lucene.LuceneIndex.java

License:Apache License

@Override
public SearchResultWrapper search(String collection, String query, int offset, int size, boolean includeDebug)
        throws IndexException {
    try {/*from   w  ww  .ja v a  2  s.  c  om*/
        //TODO: make age be a component in the ranking?
        BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
        queryBuilder.add(parser.parse(query), Occur.MUST);
        queryBuilder.add(new TermQuery(new Term(IndexDocumentAdapter.FIELD_COLLECTION, collection)),
                Occur.FILTER);
        Query baseQuery = queryBuilder.build();

        FunctionQuery boostQuery = new FunctionQuery(
                new ReciprocalFloatFunction(new DurationValueSource(new Date().getTime() / 1000,
                        new LongFieldSource(IndexDocumentAdapter.FIELD_TIMESTAMP)), RECIP, 1F, 1F));

        Query q = new CustomScoreQuery(baseQuery, boostQuery);

        QueryScorer queryScorer = new QueryScorer(q, IndexDocumentAdapter.FIELD_SEARCH);
        Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);
        Highlighter highlighter = new Highlighter(queryScorer);
        highlighter.setTextFragmenter(fragmenter);

        GroupingSearch gsearch = new GroupingSearch(IndexDocumentAdapter.FIELD_URL_GROUP).setGroupDocsLimit(1)
                .setAllGroups(true).setIncludeMaxScore(true);
        TopGroups<?> groups = gsearch.search(searcher, q, offset, size);

        ArrayList<SearchResult> results = new ArrayList<>(size);
        for (int i = offset; i < offset + size && i < groups.groups.length; i++) {
            ScoreDoc scoreDoc = groups.groups[i].scoreDocs[0];
            Document luceneDoc = searcher.doc(scoreDoc.doc);
            IndexDocumentAdapter doc = new IndexDocumentAdapter(luceneDoc);

            TokenStream tokenStream = TokenSources.getTokenStream(IndexDocumentAdapter.FIELD_SEARCH,
                    reader.getTermVectors(scoreDoc.doc), luceneDoc.get(IndexDocumentAdapter.FIELD_SEARCH),
                    analyzer, highlighter.getMaxDocCharsToAnalyze() - 1);

            String[] snippets = highlighter.getBestFragments(tokenStream,
                    luceneDoc.get(IndexDocumentAdapter.FIELD_SEARCH), 3);
            String snippet = Arrays.asList(snippets).stream().collect(Collectors.joining("\n"));
            snippet = Jsoup.clean(snippet, Whitelist.simpleText());

            String debugInfo = null;
            if (includeDebug) {
                Explanation explanation = searcher.explain(q, scoreDoc.doc);
                debugInfo = explanation.toString();
            }

            results.add(new SearchResult(doc.getKey(), doc.getCollection(), doc.getTitle(), doc.getUrl(),
                    doc.getDomain(), doc.getTimestampText(), snippet, debugInfo, scoreDoc.score));
        }

        SearchResultWrapper wrapper = new SearchResultWrapper().setQuery(query).setOffset(offset)
                .setMaxResultsRequested(size)
                .setResultCount(groups.totalGroupCount != null ? groups.totalGroupCount : 0)
                .setResults(results);

        if (includeDebug) {
            wrapper.setDebugInfo(q.toString());
        }

        return wrapper;

    } catch (IOException | ParseException | InvalidTokenOffsetsException e) {
        LOG.error(e.getLocalizedMessage());
        throw new IndexException(e);
    }
}

From source file:com.mwired.grid.commons.commons.solr.custom.NewsDateInfluenceCustomeScoreQParsePlugin.java

@Override
public QParser createParser(String query, SolrParams sp, SolrParams sp1, SolrQueryRequest sqr) {
    return new QParser(query, sp, sp1, sqr) {
        @Override/*from   w  w  w.j a  v a 2 s  .  com*/
        public Query parse() throws SyntaxError {
            QParser parser = getParser(this.qstr, "lucene", this.req);
            Query inner = parser.parse();
            SchemaField createDate = getReq().getSchema().getField(PostPropAndColMap.CREATE_DATE);
            SchemaField influence = getReq().getSchema().getField(PostPropAndColMap.INFLUENCE_SCORE);
            ValueSource influence_source = influence.getType().getValueSource(influence, parser);
            ValueSource createDate_source = createDate.getType().getValueSource(createDate, parser);

            return new NewsDateInfluenceCustomQuery(inner, new FunctionQuery(influence_source),
                    new FunctionQuery(createDate_source));
        }
    };
}

From source file:edu.rpi.tw.linkipedia.search.query.WeightedQuery.java

License:Open Source License

public Query parse(String label, String[] contexts) throws ParseException {

    label = label.toLowerCase().trim();/*from   www . ja  va2 s  .c  om*/
    for (int i = 0; i < contexts.length; i++) {
        contexts[i] = contexts[i].toLowerCase().trim();
    }

    Query typeQuery = getTypeQuery(label);
    label = label.replaceAll("\\(.*\\)", "");
    if (debug)
        System.out.println("new label: " + label);
    BooleanQuery luceneQuery = new BooleanQuery();
    ArrayList<String> dictLabels = dict_exp.getExpandQueryString(label);
    //      ArrayList<String> temp = new ArrayList<String>( Arrays.asList(contexts));
    //      if(dictLabels != null){
    //      for(String dictLabel:dictLabels){
    //         temp.add(dictLabel);         
    //      }   
    //      }
    //      contexts = temp.toArray(new String[temp.size()]);
    ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length);

    //System.out.println(label+" "+weightedContext.toString());

    Query labelQuery = getLabelQuery(label);
    //Query labelQuery = getLabelSpanQuery(label);
    Query contentQuery = getContentQuery(label, weightedContext);
    Query relationQuery = getRelationQuery(label, weightedContext);

    //      if(relationQuery!=null)
    //         relationQuery.setBoost(100);

    if (typeQuery != null) {
        typeQuery.setBoost(typeBoost);
        luceneQuery.add(typeQuery, BooleanClause.Occur.SHOULD);
    }

    if (labelQuery != null) {
        //         if(relationQuery == null && labelBoost == 1){
        //            labelQuery.setBoost(10);
        //         }
        labelQuery.setBoost(labelBoost);
        luceneQuery.add(labelQuery, BooleanClause.Occur.MUST);
    }

    if (contentQuery != null) {
        contentQuery.setBoost(contentBoost);
        luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD);
    }

    if (relationQuery != null) {
        //relationQuery.setBoost(2);
        relationQuery.setBoost(relationBoost);
        luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD);
    }

    //      System.out.println("parse: labelBoost: "+labelBoost);
    //      System.out.println("parse: contentBoost: "+contentBoost);
    //      System.out.println("parse: relationBoost: "+relationBoost);
    //      System.out.println("parse: typeBoost: "+typeBoost);
    //      System.out.println("parse: defaultBoost: "+defaultBoost);

    //      Query dictQuery = getDictExpandQuery(label, weightedContext);
    //      if(dictQuery != null){
    //         luceneQuery.add(dictQuery, BooleanClause.Occur.SHOULD);   
    //      }
    FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost"));
    boostQuery.setBoost(defaultBoost);

    finalQuery = new CustomScoreQuery(luceneQuery, boostQuery);

    return finalQuery;
}

From source file:edu.rpi.tw.linkipedia.search.query.WeightedQuery.java

License:Open Source License

public Query getFuzzyQuery(String label, String[] contexts) throws ParseException {
    label = label.toLowerCase().trim();/* w  ww  . j a  va  2  s .c  om*/
    for (int i = 0; i < contexts.length; i++) {
        contexts[i] = contexts[i].toLowerCase().trim();
    }

    Query typeQuery = getTypeQuery(label);
    label = label.replaceAll("\\(.*\\)", "");
    //System.out.println("new label: "+label);
    BooleanQuery luceneQuery = new BooleanQuery();
    ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length);

    //System.out.println(label+" "+weightedContext.toString());
    Term labelTerm = new Term("label", label);
    FuzzyQuery fuzzyLabelQuery = new FuzzyQuery(labelTerm);
    //Query labelQuery = getLabelQuery(label);   
    Query contentQuery = getContentQuery(label, weightedContext);
    Query relationQuery = getRelationQuery(label, weightedContext);

    //      if(relationQuery!=null)
    //         relationQuery.setBoost(100);

    if (typeQuery != null) {
        //typeQuery.setBoost(15);
        luceneQuery.add(typeQuery, BooleanClause.Occur.MUST);
    }

    if (fuzzyLabelQuery != null) {
        //         if(relationQuery == null)
        //            labelQuery.setBoost(10);
        luceneQuery.add(fuzzyLabelQuery, BooleanClause.Occur.MUST);
    }

    if (contentQuery != null) {
        luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD);
    }

    if (relationQuery != null) {
        //relationQuery.setBoost(2);
        luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD);
    }

    FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost"));

    finalQuery = new CustomScoreQuery(luceneQuery, boostQuery);

    return finalQuery;
}

From source file:edu.rpi.tw.linkipedia.search.query.WeightedQueryFilterBackup.java

License:Open Source License

public Query parse(String label, String[] contexts) throws ParseException {

    label = label.toLowerCase().trim();/*from  w w w .j  a va  2 s  . c o m*/
    for (int i = 0; i < contexts.length; i++) {
        contexts[i] = contexts[i].toLowerCase().trim();
    }

    CachingWrapperFilter typeFilter = getTypeFilter(label);
    label = label.replaceAll("\\(.*\\)", "");
    //System.out.println("new label: "+label);
    BooleanQuery luceneQuery = new BooleanQuery();
    ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length);

    //System.out.println(label+" "+weightedContext.toString());

    Query labelQuery = getLabelQuery(label);
    Query contentQuery = getContentQuery(label, weightedContext);
    Query relationQuery = getRelationQuery(label, weightedContext);

    //      if(relationQuery!=null)
    //         relationQuery.setBoost(100);

    if (labelQuery != null) {

        luceneQuery.add(labelQuery, BooleanClause.Occur.MUST);
    }

    FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost"));

    if (relationQuery == null && labelQuery != null) {
        labelQuery.setBoost(10);
        boostQuery.setBoost(5);
    }

    if (contentQuery != null && relationQuery != null) {
        luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD);
    }

    if (relationQuery != null) {
        //relationQuery.setBoost(2);
        luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD);
    }

    Query query = new CustomScoreQuery(luceneQuery, boostQuery);

    if (typeFilter != null) {
        finalQuery = new FilteredQuery(query, typeFilter);
        return finalQuery;
    }
    return query;

}

From source file:edu.rpi.tw.linkipedia.search.query.WeightedQueryFilterBackup.java

License:Open Source License

public Query getFuzzyQuery(String label, String[] contexts) throws ParseException {
    label = label.toLowerCase().trim();/*from w  w  w .j  a  va  2s.co  m*/

    for (int i = 0; i < contexts.length; i++) {
        contexts[i] = contexts[i].toLowerCase().trim();
    }

    CachingWrapperFilter typeFilter = getTypeFilter(label);
    label = label.replaceAll("\\(.*\\)", "");

    ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length);

    Term labelTerm = new Term("label", label);
    FuzzyQuery fuzzyLabelQuery = new FuzzyQuery(labelTerm);
    BooleanQuery luceneQuery = new BooleanQuery();

    if (fuzzyLabelQuery != null) {

        luceneQuery.add(fuzzyLabelQuery, BooleanClause.Occur.MUST);
    }
    Query contentQuery = getContentQuery(label, weightedContext);
    Query relationQuery = getRelationQuery(label, weightedContext);

    FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost"));
    if (relationQuery == null && fuzzyLabelQuery != null) {
        fuzzyLabelQuery.setBoost(5);
        boostQuery.setBoost(5);
    }

    if (contentQuery != null && relationQuery != null) {
        luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD);
    }

    if (relationQuery != null) {
        //relationQuery.setBoost(2);
        luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD);
    }

    Query query = new CustomScoreQuery(luceneQuery, boostQuery);

    if (typeFilter != null) {
        finalQuery = new FilteredQuery(query, typeFilter);
        return finalQuery;
    }
    return query;
}

From source file:edu.rpi.tw.linkipedia.search.searching.SurfaceFormSearcher.java

License:Open Source License

public ArrayList<Annotation> mysearch(String query) {
    TopScoreDocCollector collector = TopScoreDocCollector.create(10, false);
    results = new ArrayList<Annotation>();
    try {/*from ww w  . j ava  2 s.  c o m*/
        BooleanQuery luceneQuery = new BooleanQuery();
        Term term = new Term("label", query);
        //TermQuery termQuery = new TermQuery(term);
        PayloadTermQuery ptq = new PayloadTermQuery(term, payloadFunction);
        ptq.setBoost(10);
        Analyzer analyzer = DefaultAnalyzer.getAnalyzer();
        QueryParser parser = new QueryParser(Version.LUCENE_47, "analyzedLabel", analyzer);
        Query parsedQuery = parser.parse(query);

        //luceneQuery.add(termQuery, BooleanClause.Occur.SHOULD);
        luceneQuery.add(ptq, BooleanClause.Occur.SHOULD);
        luceneQuery.add(parsedQuery, BooleanClause.Occur.SHOULD);
        FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost"));
        //boostQuery.setBoost(100);
        Query finalQuery = new CustomScoreQuery(luceneQuery, boostQuery);
        System.out.println(finalQuery);
        searcher.search(finalQuery, collector);
    } catch (Exception e) {
        e.printStackTrace();
    }
    ScoreDoc[] hits = collector.topDocs().scoreDocs;
    int numTotalHits = collector.getTotalHits();

    int start = 0;
    int end = Math.min(numTotalHits, 10);

    for (int i = start; i < end; i++) {
        String thisResult = "";
        Document doc = null;
        try {
            doc = searcher.doc(hits[i].doc);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String url = doc.get("url");
        thisResult += url;//+" "+hits[i].score;      
        String[] triples = doc.getValues("triple");
        //         for(String label:labels){
        //            thisResult += label+"\n";   
        //         }
        Annotation annotation = new Annotation(query, url, hits[i].score);
        annotation.setTriples(new ArrayList<String>(Arrays.asList(triples)));
        results.add(annotation);
    }
    return results;
}

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

License:Apache License

private Query getQueryFromSpatialArgs(QParser parser, SchemaField field, SpatialArgs spatialArgs) {
    T strategy = getStrategy(field.getName());

    SolrParams localParams = parser.getLocalParams();
    String score = (localParams == null ? null : localParams.get(SCORE_PARAM));
    if (score == null || "none".equals(score) || "".equals(score)) {
        //FYI Solr FieldType doesn't have a getFilter(). We'll always grab
        // getQuery() but it's possible a strategy has a more efficient getFilter
        // that could be wrapped -- no way to know.
        //See SOLR-2883 needScore
        return strategy.makeQuery(spatialArgs); //ConstantScoreQuery
    }/*www .  j a v  a  2 s.co m*/

    //We get the valueSource for the score then the filter and combine them.
    ValueSource valueSource;
    if ("distance".equals(score)) {
        double multiplier = 1.0;//TODO support units=kilometers
        valueSource = strategy.makeDistanceValueSource(spatialArgs.getShape().getCenter(), multiplier);
    } else if ("recipDistance".equals(score)) {
        valueSource = strategy.makeRecipDistanceValueSource(spatialArgs.getShape());
    } else {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                "'score' local-param must be one of 'none', 'distance', or 'recipDistance'");
    }
    FunctionQuery functionQuery = new FunctionQuery(valueSource);

    if (localParams != null && !localParams.getBool(FILTER_PARAM, true))
        return functionQuery;

    Filter filter = strategy.makeFilter(spatialArgs);
    return new FilteredQuery(functionQuery, filter);
}

From source file:org.apache.solr.search.function.TestOrdValues.java

License:Apache License

private void doTestRank(String field, boolean inOrder) throws Exception {
    IndexReader r = DirectoryReader.open(dir);
    IndexSearcher s = newSearcher(r);/*from  w ww . j av a 2  s  .  c  om*/
    ValueSource vs;
    if (inOrder) {
        vs = new OrdFieldSource(field);
    } else {
        vs = new ReverseOrdFieldSource(field);
    }

    Query q = new FunctionQuery(vs);
    log("test: " + q);
    QueryUtils.check(random(), q, s);
    ScoreDoc[] h = s.search(q, 1000).scoreDocs;
    assertEquals("All docs should be matched!", N_DOCS, h.length);
    String prevID = inOrder ? "IE" // greater than all ids of docs in this test ("ID0001", etc.)
            : "IC"; // smaller than all ids of docs in this test ("ID0001", etc.)

    for (int i = 0; i < h.length; i++) {
        String resID = s.doc(h[i].doc).get(ID_FIELD);
        log(i + ".   score=" + h[i].score + "  -  " + resID);
        log(s.explain(q, h[i].doc));
        if (inOrder) {
            assertTrue("res id " + resID + " should be < prev res id " + prevID, resID.compareTo(prevID) < 0);
        } else {
            assertTrue("res id " + resID + " should be > prev res id " + prevID, resID.compareTo(prevID) > 0);
        }
        prevID = resID;
    }
    r.close();
}

From source file:org.apache.solr.search.function.TestOrdValues.java

License:Apache License

private void doTestExactScore(String field, boolean inOrder) throws Exception {
    IndexReader r = DirectoryReader.open(dir);
    IndexSearcher s = newSearcher(r);/*w ww  .  jav  a2 s .c o m*/
    ValueSource vs;
    if (inOrder) {
        vs = new OrdFieldSource(field);
    } else {
        vs = new ReverseOrdFieldSource(field);
    }
    Query q = new FunctionQuery(vs);
    TopDocs td = s.search(q, 1000);
    assertEquals("All docs should be matched!", N_DOCS, td.totalHits);
    ScoreDoc sd[] = td.scoreDocs;
    for (int i = 0; i < sd.length; i++) {
        float score = sd[i].score;
        String id = s.getIndexReader().document(sd[i].doc).get(ID_FIELD);
        log("-------- " + i + ". Explain doc " + id);
        log(s.explain(q, sd[i].doc));
        float expectedScore = N_DOCS - i - 1;
        assertEquals("score of result " + i + " shuould be " + expectedScore + " != " + score, expectedScore,
                score, TEST_SCORE_TOLERANCE_DELTA);
        String expectedId = inOrder ? id2String(N_DOCS - i) // in-order ==> larger  values first
                : id2String(i + 1); // reverse  ==> smaller values first
        assertTrue("id of result " + i + " shuould be " + expectedId + " != " + score, expectedId.equals(id));
    }
    r.close();
}