Search code examples
javafilterlucenecompass-lucene

CompassQuery - leave only keywords, no aliases or operators


I have following piece of code:

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

If just do that I get nasty string with aliases and query operators: +(alias:item) field:keyword1 OR field:keyword2

How do I get simple sitring like this?:

keyword1 keyword2

Solution

  • I had this same problem myself recently. The only way I could make it work reliably was code like this:

    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
    }
    
    }
    

    The fieldName parameter is the field used for the terms you want to extract (field in your example).