CompassQuery - оставьте только ключевые слова, без псевдонимов или операторов - PullRequest
1 голос
/ 24 января 2011

У меня есть следующий фрагмент кода:

CompassQuery suggested = hits.getSuggestedQuery()
String displayedSuggestion = suggested.toString();

Если просто сделать это, я получу неприятную строку с псевдонимами и операторами запросов: +(alias:item) field:keyword1 OR field:keyword2

Как мне получить простую сидячую строку, подобную этой?:

keyword1 keyword2

1 Ответ

1 голос
/ 24 января 2011

У меня недавно была такая же проблема. Единственный способ, которым я мог заставить это работать надежно, был кодом как это:

import static org.apache.commons.lang.StringUtils.*;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;
import org.compass.core.CompassQuery;
import org.compass.core.engine.SearchEngineException;
import org.compass.core.engine.SearchEngineQuery;
import org.compass.core.impl.DefaultCompassQuery;
import org.compass.core.lucene.engine.LuceneSearchEngineQuery;
import org.compass.core.lucene.engine.queryparser.QueryParserUtils;

public class SearchTermExtractor {

public String extract(CompassQuery compassQuery, final String fieldName) {
    SearchEngineQuery searchEngineQuery = ((DefaultCompassQuery)compassQuery).getSearchEngineQuery();
    Query luceneQuery = ((LuceneSearchEngineQuery)searchEngineQuery).getQuery();

    final List<String> suggestedTerms = new ArrayList<String>();

    // Use a visitor to extract the terms
    QueryParserUtils.visit(luceneQuery, new QueryParserUtils.QueryTermVisitor() {
        @Override
        public Term replaceTerm(Term term) throws SearchEngineException {
            if (fieldName.equals(term.field())) {
                suggestedTerms.add(term.text());
            }
            // Just return the original term, we're not trying to modify the query itself
            return term;
        }
    });

    return join(suggestedTerms, ' '); // join is from Commons Lang StringUtils
}

}

Параметр fieldName - это поле, используемое для терминов, которые вы хотите извлечь (field в вашем примере).

...