1

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 を使用して solr でクエリを実行します。

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 メソッドが最後に設定されたファセットのみにフィルターを設定していることがわかりました。つまり、ループを実行してこの関数を 3 回使用すると、最後に設定されたフィルター値のみが取得されます。誰かがこれを明確にして、これを行うためのより良いアプローチを教えてください。また、URLをデコードしています。したがって、ファセットの途中に特殊文字が含まれている場合、その結果は得られません。エンコードなしでも使用してみましたが、うまくいきませんでした。:(

4

1 に答える 1

4

メソッドもありaddFilterQueryます。for ループでフィルター クエリを個別に設定しているので、それを呼び出します。

また、クエリで特殊文字をエスケープする必要性については、Solr ユーザー メーリング リストの「SolrJ クライアントを使用して特殊文字でクエリをフィルタする」という投稿を参照してください。

于 2011-09-12T11:57:21.953 に答える