Search in sources :

Example 1 with SpellCheckCollation

use of org.apache.solr.spelling.SpellCheckCollation in project lucene-solr by apache.

the class SpellCheckComponent method addCollationsToResponse.

@SuppressWarnings("unchecked")
protected void addCollationsToResponse(SolrParams params, SpellingResult spellingResult, ResponseBuilder rb, String q, NamedList response, boolean suggestionsMayOverlap) {
    int maxCollations = params.getInt(SPELLCHECK_MAX_COLLATIONS, 1);
    int maxCollationTries = params.getInt(SPELLCHECK_MAX_COLLATION_TRIES, 0);
    int maxCollationEvaluations = params.getInt(SPELLCHECK_MAX_COLLATION_EVALUATIONS, 10000);
    boolean collationExtendedResults = params.getBool(SPELLCHECK_COLLATE_EXTENDED_RESULTS, false);
    int maxCollationCollectDocs = params.getInt(SPELLCHECK_COLLATE_MAX_COLLECT_DOCS, 0);
    // If not reporting hits counts, don't bother collecting more than 1 document per try.
    if (!collationExtendedResults) {
        maxCollationCollectDocs = 1;
    }
    boolean shard = params.getBool(ShardParams.IS_SHARD, false);
    SpellCheckCollator collator = new SpellCheckCollator().setMaxCollations(maxCollations).setMaxCollationTries(maxCollationTries).setMaxCollationEvaluations(maxCollationEvaluations).setSuggestionsMayOverlap(suggestionsMayOverlap).setDocCollectionLimit(maxCollationCollectDocs);
    List<SpellCheckCollation> collations = collator.collate(spellingResult, q, rb);
    //by sorting here we guarantee a non-distributed request returns all 
    //results in the same order as a distributed request would,
    //even in cases when the internal rank is the same.
    Collections.sort(collations);
    NamedList collationList = new NamedList();
    for (SpellCheckCollation collation : collations) {
        if (collationExtendedResults) {
            NamedList extendedResult = new SimpleOrderedMap();
            extendedResult.add("collationQuery", collation.getCollationQuery());
            extendedResult.add("hits", collation.getHits());
            extendedResult.add("misspellingsAndCorrections", collation.getMisspellingsAndCorrections());
            if (maxCollationTries > 0 && shard) {
                extendedResult.add("collationInternalRank", collation.getInternalRank());
            }
            collationList.add("collation", extendedResult);
        } else {
            collationList.add("collation", collation.getCollationQuery());
            if (maxCollationTries > 0 && shard) {
                collationList.add("collationInternalRank", collation.getInternalRank());
            }
        }
    }
    response.add("collations", collationList);
}
Also used : NamedList(org.apache.solr.common.util.NamedList) SpellCheckCollator(org.apache.solr.spelling.SpellCheckCollator) SpellCheckCollation(org.apache.solr.spelling.SpellCheckCollation) SimpleOrderedMap(org.apache.solr.common.util.SimpleOrderedMap)

Example 2 with SpellCheckCollation

use of org.apache.solr.spelling.SpellCheckCollation in project lucene-solr by apache.

the class SpellCheckComponent method finishStage.

@Override
@SuppressWarnings({ "unchecked", "deprecation" })
public void finishStage(ResponseBuilder rb) {
    SolrParams params = rb.req.getParams();
    if (!params.getBool(COMPONENT_NAME, false) || rb.stage != ResponseBuilder.STAGE_GET_FIELDS)
        return;
    boolean extendedResults = params.getBool(SPELLCHECK_EXTENDED_RESULTS, false);
    boolean collate = params.getBool(SPELLCHECK_COLLATE, false);
    boolean collationExtendedResults = params.getBool(SPELLCHECK_COLLATE_EXTENDED_RESULTS, false);
    int maxCollationTries = params.getInt(SPELLCHECK_MAX_COLLATION_TRIES, 0);
    int maxCollations = params.getInt(SPELLCHECK_MAX_COLLATIONS, 1);
    Integer maxResultsForSuggest = maxResultsForSuggest(rb);
    int count = rb.req.getParams().getInt(SPELLCHECK_COUNT, 1);
    int numSug = Math.max(count, AbstractLuceneSpellChecker.DEFAULT_SUGGESTION_COUNT);
    String origQuery = params.get(SPELLCHECK_Q);
    if (origQuery == null) {
        origQuery = rb.getQueryString();
        if (origQuery == null) {
            origQuery = params.get(CommonParams.Q);
        }
    }
    long hits = rb.grouping() ? rb.totalHitCount : rb.getNumberDocumentsFound();
    boolean isCorrectlySpelled = hits > (maxResultsForSuggest == null ? 0 : maxResultsForSuggest);
    SpellCheckMergeData mergeData = new SpellCheckMergeData();
    if (maxResultsForSuggest == null || !isCorrectlySpelled) {
        for (ShardRequest sreq : rb.finished) {
            for (ShardResponse srsp : sreq.responses) {
                NamedList nl = null;
                try {
                    nl = (NamedList) srsp.getSolrResponse().getResponse().get("spellcheck");
                } catch (Exception e) {
                    if (rb.req.getParams().getBool(ShardParams.SHARDS_TOLERANT, false)) {
                        // looks like a shard did not return anything
                        continue;
                    }
                    throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to read spelling info for shard: " + srsp.getShard(), e);
                }
                LOG.info(srsp.getShard() + " " + nl);
                if (nl != null) {
                    mergeData.totalNumberShardResponses++;
                    collectShardSuggestions(nl, mergeData);
                    collectShardCollations(mergeData, nl, maxCollationTries);
                }
            }
        }
    }
    // all shard responses have been collected
    // create token and get top suggestions
    SolrSpellChecker checker = getSpellChecker(rb.req.getParams());
    SpellingResult result = checker.mergeSuggestions(mergeData, numSug, count, extendedResults);
    NamedList response = new SimpleOrderedMap();
    NamedList suggestions = toNamedList(false, result, origQuery, extendedResults);
    response.add("suggestions", suggestions);
    if (extendedResults) {
        response.add("correctlySpelled", isCorrectlySpelled);
    }
    if (collate) {
        SpellCheckCollation[] sortedCollations = mergeData.collations.values().toArray(new SpellCheckCollation[mergeData.collations.size()]);
        Arrays.sort(sortedCollations);
        NamedList collations = new NamedList();
        int i = 0;
        while (i < maxCollations && i < sortedCollations.length) {
            SpellCheckCollation collation = sortedCollations[i];
            i++;
            if (collationExtendedResults) {
                SimpleOrderedMap extendedResult = new SimpleOrderedMap();
                extendedResult.add("collationQuery", collation.getCollationQuery());
                extendedResult.add("hits", collation.getHits());
                extendedResult.add("misspellingsAndCorrections", collation.getMisspellingsAndCorrections());
                collations.add("collation", extendedResult);
            } else {
                collations.add("collation", collation.getCollationQuery());
            }
        }
        response.add("collations", collations);
    }
    rb.rsp.add("spellcheck", response);
}
Also used : ConjunctionSolrSpellChecker(org.apache.solr.spelling.ConjunctionSolrSpellChecker) SolrSpellChecker(org.apache.solr.spelling.SolrSpellChecker) NamedList(org.apache.solr.common.util.NamedList) SimpleOrderedMap(org.apache.solr.common.util.SimpleOrderedMap) SolrException(org.apache.solr.common.SolrException) IOException(java.io.IOException) SpellingResult(org.apache.solr.spelling.SpellingResult) SolrParams(org.apache.solr.common.params.SolrParams) ModifiableSolrParams(org.apache.solr.common.params.ModifiableSolrParams) SpellCheckCollation(org.apache.solr.spelling.SpellCheckCollation) SolrException(org.apache.solr.common.SolrException)

Example 3 with SpellCheckCollation

use of org.apache.solr.spelling.SpellCheckCollation in project lucene-solr by apache.

the class SpellCheckComponent method collectShardCollations.

@SuppressWarnings("unchecked")
private void collectShardCollations(SpellCheckMergeData mergeData, NamedList spellCheckResponse, int maxCollationTries) {
    Map<String, SpellCheckCollation> collations = mergeData.collations;
    NamedList collationHolder = (NamedList) spellCheckResponse.get("collations");
    if (collationHolder != null) {
        List<Object> collationList = collationHolder.getAll("collation");
        List<Object> collationRankList = collationHolder.getAll("collationInternalRank");
        int i = 0;
        if (collationList != null) {
            for (Object o : collationList) {
                if (o instanceof String) {
                    SpellCheckCollation coll = new SpellCheckCollation();
                    coll.setCollationQuery((String) o);
                    if (collationRankList != null && collationRankList.size() > 0) {
                        coll.setInternalRank((Integer) collationRankList.get(i));
                        i++;
                    }
                    SpellCheckCollation priorColl = collations.get(coll.getCollationQuery());
                    if (priorColl != null) {
                        coll.setInternalRank(Math.max(coll.getInternalRank(), priorColl.getInternalRank()));
                    }
                    collations.put(coll.getCollationQuery(), coll);
                } else {
                    NamedList expandedCollation = (NamedList) o;
                    SpellCheckCollation coll = new SpellCheckCollation();
                    coll.setCollationQuery((String) expandedCollation.get("collationQuery"));
                    coll.setHits((Integer) expandedCollation.get("hits"));
                    if (maxCollationTries > 0) {
                        coll.setInternalRank((Integer) expandedCollation.get("collationInternalRank"));
                    }
                    coll.setMisspellingsAndCorrections((NamedList) expandedCollation.get("misspellingsAndCorrections"));
                    SpellCheckCollation priorColl = collations.get(coll.getCollationQuery());
                    if (priorColl != null) {
                        coll.setHits(coll.getHits() + priorColl.getHits());
                        coll.setInternalRank(Math.max(coll.getInternalRank(), priorColl.getInternalRank()));
                    }
                    collations.put(coll.getCollationQuery(), coll);
                }
            }
        }
    }
}
Also used : NamedList(org.apache.solr.common.util.NamedList) SpellCheckCollation(org.apache.solr.spelling.SpellCheckCollation)

Aggregations

NamedList (org.apache.solr.common.util.NamedList)3 SpellCheckCollation (org.apache.solr.spelling.SpellCheckCollation)3 SimpleOrderedMap (org.apache.solr.common.util.SimpleOrderedMap)2 IOException (java.io.IOException)1 SolrException (org.apache.solr.common.SolrException)1 ModifiableSolrParams (org.apache.solr.common.params.ModifiableSolrParams)1 SolrParams (org.apache.solr.common.params.SolrParams)1 ConjunctionSolrSpellChecker (org.apache.solr.spelling.ConjunctionSolrSpellChecker)1 SolrSpellChecker (org.apache.solr.spelling.SolrSpellChecker)1 SpellCheckCollator (org.apache.solr.spelling.SpellCheckCollator)1 SpellingResult (org.apache.solr.spelling.SpellingResult)1