3

I want to write a FacetQuery which may not have any criteria except one filter condition (fq). Following query is an example which I want to build using spring-data-solr API.

http://localhost:8983/solr/jpevents/select?q=*:*&fq=categoryIds:(1101)&facet=true&facet.mincount=1&facet.limit=1&facet.field=primaryCategoryId

How can I set query parameter (q=*:*) in FacetQuery?

Environment: I'm writing a Spring MVC based Search API using spring-data-solr 1.0.0.RELEASE with Solr 4.4.0 and Spring 3.2.4.RELEASE.

Aamir Yaseen
  • 487
  • 6
  • 20

2 Answers2

11

you can do this combining @Query and @Facet

    @Facet(fields={"primaryCategoryId"}, minCount=1, limit=1)
    @Query(value="*:*", filters="categoryIds:(?0)")
    public FacetPage<JPEvents> XYZ(List<Long> categories, Pageable page);

or execute FacetQuery using SolrTemplate.

   FacetQuery query = new SimpleFacetQuery(new SimpleStringCriteria("*:*"))
     .setFacetOptions(new FacetOptions("primaryCategoryId")
     .setFacetMinCount(1).setFacetLimit(1));
   query.setPageRequest(pageable);
   solrTemplate.queryForFacetPage(query, JPEvents.class);
jessehouwing
  • 106,458
  • 22
  • 256
  • 341
Christoph Strobl
  • 6,491
  • 25
  • 33
  • Thanks @Christoph-Strobl for your advice. I prefer second approach, as I'm setting many other dynamic parameters. But I'm unable to find SimpleStringCritieria Class in spring-data-solr 1.0.0.RELEASE. Can you please point me to the correct class or you I'm missing something trivial? In either case, You feedback will be much appreciated. – Aamir Yaseen Dec 18 '13 at 12:07
  • Oh sorry that problem was due to typo, I just found the correct class http://docs.spring.io/spring-data/data-solr/docs/1.0.x/api/org/springframework/data/solr/core/query/SimpleStringCriteria.html and I'm trying this approach now :) – Aamir Yaseen Dec 18 '13 at 12:11
1

I have done something like this :

public static void main()
{
String url = "http://localhost:8983/solr/autocomplete";
    SolrServer solrServer = new HttpSolrServer(url);
    SolrQuery query = new SolrQuery();
    query.set("q", "*");
    query.addFilterQuery("name:*");
    query.setFacet(true);
    query.addFacetField("name");
    System.out.println(query);
    QueryResponse queryResponse = solrServer.query(query);
    List<FacetField> facetFields = queryResponse.getFacetFields();
    FacetField cnameMainFacetField = queryResponse.getFacetField("name");
    for (Count cnameAndCount : cnameMainFacetField.getValues()) {
        String cnameMain = cnameAndCount.getName();
        System.out.println(cnameMain);
        System.out.println(cnameAndCount.getCount());
    }

This gives me correct counts of faceted fields. Hope you are able to understand what I am doing. Adding output for better understanding:

q=*&fq=name%3A*&facet=true&facet.field=name
a
10
an
7
w
7
m
6
and
5
c
5
p
5
d
4
Mayank_Thapliyal
  • 351
  • 2
  • 7
  • 16