Search code examples
javakotlinsearchsolrsolrj

How to write "OR" query programmatically with Solr in Java


I have a problem with Solr in Java. I wanted to write the queries programmatically.

I use Solr, Lucene and SolrJ in version 8.3.1

This is an example how I wanted to do it.

QueryBuilder queryBuilder = new QueryBuilder(new WhitespaceAnalyzer());
BooleanQuery booleanQuery = new BooleanQuery.Builder()
                .add(queryBuilder.createBooleanQuery("testField1", "foobar"), BooleanClause.Occur.SHOULD)
                .add(queryBuilder.createBooleanQuery("testField2", "barfoo"), BooleanClause.Occur.SHOULD)
                .add(queryBuilder.createMinShouldMatchQuery("minField", "foobar2", 0.5f), BooleanClause.Occur.SHOULD)
                .add(new TermRangeQuery("testField", new BytesRef("lower"), new BytesRef("upper"), true, true), BooleanClause.Occur.SHOULD)
                .add(queryBuilder.createBooleanQuery("empty", "fooBarEmpty"), BooleanClause.Occur.SHOULD)
                .build();

In Solr there are some queries like "... OR ...". What I want to know how I can write these "OR" queries programmatically. I searched a lot on google but found nothing. Maybe some of you guys know what I want to do and you can help me.

Cheers, Jerry


Solution

  • You can create your own query as string and then add in solrj, filterquery

    For example: Suppose you have to search city either abc or xyz and request like:

    { "filterQuery": {"city":["abc","xyz"] } }
    

    So, your query like:

    SolrQuery query = new SolrQuery();
    if (req.getFilterQuery() != null && !req.getFilterQuery().isEmpty()) {
        
        final StringBuilder chars = new StringBuilder();
        for (String key : req.getFilterQuery().keySet()) {
        
            chars.append(key + ":" + "(");
            for (String val : req.getFilterQuery().get(key)) {
        
                chars.append("\"" + val + "\"" + " ");
            }
            chars.append(")");
            chars.append(" OR ");
        
        }
        
        chars.delete(chars.length() - 4, chars.length());
        query.addFilterQuery(chars.toString());
        
    }
        
    QueryResponse response = solrClient.query(query, METHOD.POST);
    

    Hope This Help you to find your data.