このサイトで関連する質問を調べましたが、関連する解決策が見つかりませんでした。
フォームの HTTP リクエストを使用して Solr4 インデックスをクエリする場合
&facet=true&facet.field=country
応答には、国ごとの数とともに、さまざまな国がすべて含まれています。
SolrJ を使用してこの情報を取得するにはどうすればよいですか? 私は次のことを試しましたが、国ごとではなく、すべての国の合計数のみを返します:
solrQuery.setFacet(true);
solrQuery.addFacetField("country");
以下は機能しているように見えますが、事前にすべてのグループを明示的に設定する必要はありません。
solrQuery.addFacetQuery("country:usa");
solrQuery.addFacetQuery("country:canada");
次に、QueryResponse オブジェクトからファセット データを抽出する方法がわかりません。
2つの質問:
1) SolrJ を使用して、フィールドをファセットし、グループを明示的に指定せずにグループを返すにはどうすればよいですか?
2) SolrJ を使用して、どのように QueryResponse オブジェクトからファセット データを抽出できますか?
ありがとう。
アップデート:
また、Sergey の応答 (以下) に似たものも試しました。
List<FacetField> ffList = resp.getFacetFields();
log.info("size of ffList:" + ffList.size());
for(FacetField ff : ffList){
String ffname = ff.getName();
int ffcount = ff.getValueCount();
log.info("ffname:" + ffname + "|ffcount:" + ffcount);
}
上記のコードは、size=1 の ffList を示しており、ループは 1 回繰り返されます。出力の ffname="country" と ffcount は、元のクエリに一致する行の総数です。
ここには国ごとの内訳はありません。
同じ solrQuery オブジェクトで、addField と addFilterQuery も呼び出していることに注意してください。これがファセットに影響するかどうかは不明です:
solrQuery.addField("user-name");
solrQuery.addField("user-bio");
solrQuery.addField("country");
solrQuery.addFilterQuery("user-bio:" + "(Apple OR Google OR Facebook)");
更新 2:
セルゲイが以下で言ったことに基づいて、私はそれを理解したと思います. FacetField.getValues() を使用して List オブジェクトを抽出しました。
List<FacetField> fflist = resp.getFacetFields();
for(FacetField ff : fflist){
String ffname = ff.getName();
int ffcount = ff.getValueCount();
List<Count> counts = ff.getValues();
for(Count c : counts){
String facetLabel = c.getName();
long facetCount = c.getCount();
}
}
上記のコードでは、ラベル変数は各ファセット グループに一致し、count はそのグループに対応するカウントです。