2011-09-12 6 views
1

私は私が私のクエリ文字列を解析され、そこから各facetnameとファセット値を取り、マップ問題()メソッド

に保存されている私の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]); 
    } 

その後、私は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(); 

しかし、私のコードを実行した後を使用してSolrに照会するには、次のコードを使用します私は、solrQuery.setFilterQueryメソッドが、最後に設定されたファセットだけのためにフィルタを設定していることを発見しました。つまり、ループを実行してこの関数を3回使用すると、最後に設定されたフィルタ値だけが使用されます。 誰かがこれを明確にして、これを行うためのよりよいアプローチを教えてください。また、私はURLをデコードしています。だから、もし私のファセットが真ん中に特殊文字を含んでいれば、その結果は得られません。エンコードせずに使ってみましたが、うまくいきませんでした。 :(

答えて

4

addFilterQuery方法もありますが、私はあなたのループのために個別にフィルタクエリを設定しているので、ことを呼び出します。

また、必要性についてメーリングリストのSolrユーザーからこの記事Filter query with special character using SolrJ clientを参照してください。クエリで特殊文字をエスケープするには