Как создать FacetQuery с использованием spring-data-solr, который возвращает все документы (*:*) из индекса solr

Я хочу написать FacetQuery, который может не иметь никаких критериев, кроме одного условия фильтрации (fq). Следующий запрос является примером, который я хочу построить с использованием API spring-data-solr.

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

Как установить параметр запроса (q=*:*) в FacetQuery?

Среда: я пишу поисковый API на основе Spring MVC, используя spring-data-solr 1.0.0.RELEASE с Solr 4.4.0 и Spring 3.2.4.RELEASE.


person Aamir Yaseen    schedule 17.12.2013    source источник


Ответы (2)


вы можете сделать это, комбинируя @Query и @Facet

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

или выполнить FacetQuery с помощью SolrTemplate.

   FacetQuery query = new SimpleFacetQuery(new SimpleStringCriteria("*:*"))
     .setFacetOptions(new FacetOptions("primaryCategoryId")
     .setFacetMinCount(1).setFacetLimit(1));
   query.setPageRequest(pageable);
   solrTemplate.queryForFacetPage(query, JPEvents.class);
person Christoph Strobl    schedule 18.12.2013
comment
Спасибо @Christoph-Strobl за совет. Я предпочитаю второй подход, так как я устанавливаю много других динамических параметров. Но я не могу найти класс SimpleStringCritieria в spring-data-solr 1.0.0.RELEASE. Не могли бы вы указать мне правильный класс или вы упускаете что-то тривиальное? В любом случае, ваши отзывы будут высоко оценены. - person Aamir Yaseen; 18.12.2013
comment
О, извините, проблема возникла из-за опечатки, я только что нашел правильный класс docs.spring.io/spring-data/data-solr/docs/1.0.x/api/org/ и я' пробую этот подход сейчас :) - person Aamir Yaseen; 18.12.2013

Я сделал что-то вроде этого:

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());
    }

Это дает мне правильное количество граненых полей. Надеюсь, вы в состоянии понять, что я делаю. Добавление вывода для лучшего понимания:

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
person Mayank_Thapliyal    schedule 07.07.2014