Example usage for org.apache.lucene.search Explanation toString

List of usage examples for org.apache.lucene.search Explanation toString

Introduction

In this page you can find the example usage for org.apache.lucene.search Explanation toString.

Prototype

@Override
public String toString() 

Source Link

Document

Render an explanation as text.

Usage

From source file:TopHitsTests.java

License:Apache License

@Test
public void testFetchFeatures() {
    SearchResponse response = client().prepareSearch("idx").setTypes("type")
            .setQuery(matchQuery("text", "text").queryName("test"))
            .addAggregation(terms("terms").executionHint(randomExecutionHint()).field(TERMS_AGGS_FIELD)
                    .subAggregation(topHits("hits").setSize(1).addHighlightedField("text").setExplain(true)
                            .addFieldDataField("field1").addScriptField("script", "doc['field1'].value")
                            .setFetchSource("text", null).setVersion(true)))
            .get();// w  ww .  java 2 s. c o m
    assertSearchResponse(response);

    Terms terms = response.getAggregations().get("terms");
    assertThat(terms, notNullValue());
    assertThat(terms.getName(), equalTo("terms"));
    assertThat(terms.getBuckets().size(), equalTo(5));

    for (Terms.Bucket bucket : terms.getBuckets()) {
        TopHits topHits = bucket.getAggregations().get("hits");
        SearchHits hits = topHits.getHits();
        assertThat(hits.totalHits(), equalTo(10l));
        assertThat(hits.getHits().length, equalTo(1));

        SearchHit hit = hits.getAt(0);
        HighlightField highlightField = hit.getHighlightFields().get("text");
        assertThat(highlightField.getFragments().length, equalTo(1));
        assertThat(highlightField.getFragments()[0].string(), equalTo("some <em>text</em> to entertain"));

        Explanation explanation = hit.explanation();
        assertThat(explanation.toString(), containsString("text:text"));

        long version = hit.version();
        assertThat(version, equalTo(1l));

        assertThat(hit.matchedQueries()[0], equalTo("test"));

        SearchHitField field = hit.field("field1");
        assertThat(field.getValue().toString(), equalTo("5"));

        field = hit.field("script");
        assertThat(field.getValue().toString(), equalTo("5"));

        assertThat(hit.sourceAsMap().size(), equalTo(1));
        assertThat(hit.sourceAsMap().get("text").toString(), equalTo("some text to entertain"));
    }
}

From source file:aos.lucene.search.msc.Explainer.java

License:Apache License

public static void main(String[] args) throws Exception {
    if (args.length != 2) {
        System.err.println("Usage: Explainer <index dir> <query>");
        System.exit(1);/*from   www. j  a va  2s.  c  o  m*/
    }

    String indexDir = args[0];
    String queryExpression = args[1];

    Directory directory = FSDirectory.open(new File(indexDir));
    QueryParser parser = new QueryParser(Version.LUCENE_46, "contents", new SimpleAnalyzer());
    Query query = parser.parse(queryExpression);

    LOGGER.info("Query: " + queryExpression);

    IndexSearcher searcher = new IndexSearcher(directory);
    TopDocs topDocs = searcher.search(query, 10);

    for (ScoreDoc match : topDocs.scoreDocs) {
        Explanation explanation = searcher.explain(query, match.doc); //#A

        LOGGER.info("----------");
        Document doc = searcher.doc(match.doc);
        LOGGER.info(doc.get("title"));
        LOGGER.info(explanation.toString()); //#B
    }
    searcher.close();
    directory.close();
}

From source file:at.ac.univie.mminf.luceneSKOS.util.TestUtil.java

License:Apache License

public static void explainQuery(IndexSearcher searcher, Query query) throws IOException {

    TopDocs topDocs = searcher.search(query, 10);

    for (ScoreDoc match : topDocs.scoreDocs) {

        Explanation explanation = searcher.explain(query, match.doc);

        System.out.println("---------------");

        System.out.println(explanation.toString());

    }//from   w  ww .  j av  a2 s  .c o  m

}

From source file:cn.b2b.index.product.index.ProductQueryOptimizer.java

@Override
public Writable explain(IndexSearcher searcher, Writable param) throws Exception {

    ExplainParam queryParam = (ExplainParam) param;
    Query oriquery = queryParam.getQuery();
    BooleanQuery original = QueryFilters.filter(oriquery, Constants.SLOP_SCORE_CVM_CLASS);
    BooleanQuery query = new BooleanQuery();
    BooleanQuery filterQuery = null;//from w  w w  .  j  a  v  a 2 s.  c  om
    BooleanClause[] clauses = original.getClauses();
    for (int i = 0; i < clauses.length; i++) {
        BooleanClause c = clauses[i];
        if (c.isRequired() // required
                && c.getQuery().getBoost() == 0.0f // boost is zero
                && c.getQuery() instanceof TermQuery // TermQuery
                && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm())
                        / (float) searcher.maxDoc()) >= threshold) { // check threshold
            if (filterQuery == null)
                filterQuery = new BooleanQuery();
            // lucene1.4.3 -> lucene2.0.0
            // filterQuery.add(c.getQuery(), true, false); // filter it
            filterQuery.add(c.getQuery(), BooleanClause.Occur.MUST); // filter
            // it
        } else {
            query.add(c); // query it
        }
    }

    Filter filter = null;
    if (filterQuery != null) {
        synchronized (cache) { // check cache
            filter = (Filter) cache.get(filterQuery);
        }
        if (filter == null) { // miss
            filter = new QueryFilter(filterQuery); // construct new entry
            synchronized (cache) {
                cache.put(filterQuery, filter); // cache it
            }
        }
    }
    ScoreParam scoreParam = new ScoreParam();
    // store segment query word
    query.setQueryStr(original.getQueryStr());

    float[] ranks = (float[]) MemoryFieldCache.get("rank");
    Explanation explain = searcher.explain(query, queryParam.getDoc());
    return new UTF8("RANK:" + ranks[queryParam.getDoc()] + "\t" + explain.toString());
}

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 {/* ww w .  j  a  v a 2  s . c  o m*/
        //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.jaeksoft.searchlib.index.ReaderLocal.java

License:Open Source License

@Override
public String explain(AbstractRequest request, int docId, boolean bHtml) throws SearchLibException {
    try {// ww  w .j  a va  2s.com
        Query query = request.getQuery();
        if (query == null)
            return "No explanation available";
        Explanation explanation = indexSearcher.explain(query, docId);
        if (bHtml)
            return explanation.toHtml();
        else
            return explanation.toString();
    } catch (IOException e) {
        throw new SearchLibException(e);
    } catch (ParseException e) {
        throw new SearchLibException(e);
    } catch (SyntaxError e) {
        throw new SearchLibException(e);
    }
}

From source file:com.leavesfly.lia.searching.Explainer.java

License:Apache License

public static void main(String[] args) throws Exception {
    if (args.length != 2) {
        System.err.println("Usage: Explainer <index dir> <query>");
        System.exit(1);/*from   w w  w  . jav a 2  s  .  co  m*/
    }

    String indexDir = args[0];
    String queryExpression = args[1];

    Directory directory = FSDirectory.open(new File(indexDir));
    QueryParser parser = new QueryParser(Version.LUCENE_30, "contents", new SimpleAnalyzer());
    Query query = parser.parse(queryExpression);

    System.out.println("Query: " + queryExpression);

    IndexSearcher searcher = new IndexSearcher(directory);
    TopDocs topDocs = searcher.search(query, 10);

    for (ScoreDoc match : topDocs.scoreDocs) {
        Explanation explanation = searcher.explain(query, match.doc); //#A

        System.out.println("----------");
        Document doc = searcher.doc(match.doc);
        System.out.println(doc.get("title"));
        System.out.println(explanation.toString()); //#B
    }
    searcher.close();
    directory.close();
}

From source file:com.liferay.portal.search.lucene.LuceneIndexSearcherImpl.java

License:Open Source License

protected Hits toHits(org.apache.lucene.search.IndexSearcher indexSearcher, HitDocs hitDocs, Query query,
        long startTime, float searchTime, int start, int end) throws IOException, ParseException {

    int length = hitDocs.getTotalHits();

    if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS)) {
        start = 0;//  ww w.ja va 2s. co m
        end = length;
    }

    String[] queryTerms = getQueryTerms(query);

    IndexReader indexReader = indexSearcher.getIndexReader();

    List<String> indexedFieldNames = new ArrayList<String>(
            indexReader.getFieldNames(IndexReader.FieldOption.INDEXED));

    org.apache.lucene.search.Query luceneQuery = (org.apache.lucene.search.Query) QueryTranslatorUtil
            .translate(query);

    int scoredFieldNamesCount = LuceneHelperUtil.countScoredFieldNames(luceneQuery,
            ArrayUtil.toStringArray(indexedFieldNames.toArray()));

    Hits hits = new HitsImpl();

    if ((start > -1) && (start <= end)) {
        if (end > length) {
            end = length;
        }

        if (start > end) {
            start = end;
        }

        int subsetTotal = end - start;

        if (subsetTotal > PropsValues.INDEX_SEARCH_LIMIT) {
            subsetTotal = PropsValues.INDEX_SEARCH_LIMIT;
        }

        List<Document> subsetDocs = new ArrayList<Document>(subsetTotal);
        List<String> subsetSnippets = new ArrayList<String>(subsetTotal);
        List<Float> subsetScores = new ArrayList<Float>(subsetTotal);

        QueryConfig queryConfig = query.getQueryConfig();

        for (int i = start; i < end; i++) {
            if (i >= PropsValues.INDEX_SEARCH_LIMIT) {
                break;
            }

            int docId = hitDocs.getDocId(i);

            org.apache.lucene.document.Document document = indexSearcher.doc(docId);

            Document subsetDocument = getDocument(document);

            String subsetSnippet = StringPool.BLANK;

            if (queryConfig.isHighlightEnabled()) {
                subsetSnippet = getSnippet(document, query, Field.CONTENT, queryConfig.getLocale());
            }

            subsetDocument.addText(Field.SNIPPET, subsetSnippet);

            subsetSnippets.add(subsetSnippet);

            subsetDocs.add(subsetDocument);

            Float subsetScore = hitDocs.getScore(i);

            if (scoredFieldNamesCount > 0) {
                subsetScore = subsetScore / scoredFieldNamesCount;
            }

            subsetScores.add(subsetScore);

            if (_log.isDebugEnabled()) {
                try {
                    Explanation explanation = indexSearcher.explain(luceneQuery, docId);

                    _log.debug(explanation.toString());
                } catch (Exception e) {
                }
            }
        }

        hits.setStart(startTime);
        hits.setSearchTime(searchTime);
        hits.setQuery(query);
        hits.setQueryTerms(queryTerms);
        hits.setDocs(subsetDocs.toArray(new Document[subsetDocs.size()]));
        hits.setLength(length);
        hits.setSnippets(subsetSnippets.toArray(new String[subsetSnippets.size()]));
        hits.setScores(subsetScores.toArray(new Float[subsetScores.size()]));
    }

    return hits;
}

From source file:com.mathworks.xzheng.searching.Explainer.java

License:Apache License

public static void main(String[] args) throws Exception {
    if (args.length != 2) {
        System.err.println("Usage: Explainer <index dir> <query>");
        System.exit(1);//from  www .  ja v a  2s . c o  m
    }

    String indexDir = args[0];
    String queryExpression = args[1];

    Directory directory = FSDirectory.open(new File(indexDir));
    QueryParser parser = new QueryParser(Version.LUCENE_46, "contents", new SimpleAnalyzer(Version.LUCENE_46));
    Query query = parser.parse(queryExpression);

    System.out.println("Query: " + queryExpression);

    IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));
    TopDocs topDocs = searcher.search(query, 10);

    for (ScoreDoc match : topDocs.scoreDocs) {
        Explanation explanation = searcher.explain(query, match.doc); //#A

        System.out.println("----------");
        Document doc = searcher.doc(match.doc);
        System.out.println(doc.get("title"));
        System.out.println(explanation.toString()); //#B
    }

    directory.close();
}

From source file:com.o19s.es.explore.ExplorerQueryTests.java

License:Apache License

public void testQuery() throws Exception {
    Query q = new TermQuery(new Term("text", "cow"));
    String statsType = "sum_raw_tf";

    ExplorerQuery eq = new ExplorerQuery(q, statsType);

    // Basic query check, should match 2 docs
    assertThat(searcher.count(eq), equalTo(2));

    // Verify explain
    TopDocs docs = searcher.search(eq, 4);
    Explanation explanation = searcher.explain(eq, docs.scoreDocs[0].doc);
    assertThat(explanation.toString().trim(), equalTo("1.0 = Stat Score: sum_raw_tf"));
}