Проблема в методе solrQuery.setFilteQueries () - PullRequest
1 голос
/ 12 сентября 2011

У меня есть следующий запрос, который я взял с моего URL

public static String query="pen&mq=pen&f=owners%5B%22abc%22%5D&f=application_type%5B%22cde%22%5D";

public static String q="pen";

Я проанализировал строку запроса, взял из нее каждое имя фасета и значение фасета и сохранил на карте

String querydec = URLDecoder.decode(query, "UTF-8");
String[] facetswithval = querydec.split("&f=");
Map<String, String> facetMap = new HashMap<String, String>();
for (int i = 1; i < facetswithval.length; i++) {

        String[] fsplit = facetswithval[i].split("\\[\"");
        String[] value = fsplit[1].split("\"\\]");

        facetMap.put(fsplit[0], value[0]);
    }

Затем я использую следующий код для запроса в solr, используя solrj

CommonsHttpSolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr/");

        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery(q);

        for (Iterator<String> iter = facetMap.keySet().iterator(); iter.hasNext();){
              String key=iter.next();
              System.out.println("key="+key+"::value="+facetMap.get(key));
              solrQuery.setFilterQueries(key+":"+facetMap.get(key));
          }
        solrQuery.setRows(MAX_ROW_NUM);
        QueryResponse qr = server.query(solrQuery);
        SolrDocumentList sdl = qr.getResults();

Но после запуска моего кода я обнаружил, что метод solrQuery.setFilterQuery устанавливает фильтр только для последнего установленного фасета.Это означает, что если я запускаю цикл и использую эту функцию три раза, он принимает только последние установленные значения фильтра.Может кто-нибудь, пожалуйста, проясните это и скажите мне лучший подход для этого.Также я расшифровываю URL.Так что, если мой фасет содержит какой-то специальный символ в середине, то я не получаю никакого результата для этого.Я пытался использовать его без кодирования, но это не сработало.(

1 Ответ

4 голосов
/ 12 сентября 2011

Существует также метод addFilterQuery, я бы назвал его, так как вы устанавливаете запросы фильтра индивидуально в цикле for.

Также, пожалуйста, смотрите это сообщение Фильтруйте запрос по специальному символу с помощью клиента SolrJ из списка рассылки Solr Users о необходимости по-прежнему экранировать специальные символы в запросах.

...