0
クエリーで返された結果に対してsolr作業のファセットを適用しますが、行をある値に制限した後に返されるドキュメントの上で実行したいとします。たとえば、q
が1500ドキュメントを返し、ファセットを1500の代わりに1000に適用したい。ファセットを生成するカスタム検索コンポーネントを作成しています。次は実装です:searchcomponentを使用してsolrレスポンスでカスタムレスポンスを追加する方法は?
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexableField;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.handler.component.SearchComponent;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.DocIterator;
import org.apache.solr.search.DocList;
import org.apache.solr.search.SolrIndexSearcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.biginfolabs.subfacet.MapSorter;
public class SubFacetComponent extends SearchComponent {
private static Logger logger = LoggerFactory
.getLogger(SubFacetComponent.class);
private SolrQueryRequest req = null;
private long numDoc = 0;
// private static final String field = "annotations";
@Override
public String getDescription() {
// TODO Auto-generated method stub
return null;
}
@Override
public void prepare(ResponseBuilder arg0) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void process(ResponseBuilder rb) throws IOException {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
req = rb.req;
String[] fields = {"annotations"};
// req.getParams().getParams("facet.field");
logger.info("Facet component");
if (rb.getResults() != null) {
DocList docs = rb.getResults().docList;
numDoc = docs.size();
for (String field : fields) {
DocIterator docItr = docs.iterator();
SolrIndexSearcher searcher = req.getSearcher();
Map<String, List<String>> map = new HashMap<String, List<String>>();
List<String> list = new ArrayList<String>();
while (docItr.hasNext()) {
int docId = docItr.nextDoc();
Document doc = searcher.doc(docId);
list.add(doc.get("id"));
Set<String> keySet = new HashSet<String>();
if (doc.get(field) != null) {
IndexableField[] indexableFields = doc.getFields(field);
for (IndexableField indexableField : indexableFields) {
String str = indexableField.stringValue();
String[] pathVariableArray = str.split("/");
String key = "";
String separator = "";
for (String split : pathVariableArray) {
key += separator + split;
keySet.add(key);
separator = "/";
}
}
for (String str : keySet) {
List<String> arrayList = new ArrayList<String>();
if (map.containsKey(str)) {
arrayList = map.get(str);
}
arrayList.add(doc.getField("_version_").toString());
map.put(str, arrayList);
}
}
}
System.out.println(list);
Map<String, Integer> finalMap = new HashMap<String, Integer>();
for (String key : map.keySet()) {
if (map.containsKey(key)) {
finalMap.put(key, map.get(key).size());
System.out.println(key + ": " + map.get(key).size());
}
}
Map<String, TreeMap<String, Integer>> facetMap = new HashMap<String, TreeMap<String, Integer>>();
TreeMap<String, Integer> sortedMap = new TreeMap(new MapSorter(
finalMap));
sortedMap.putAll(finalMap);
rb.rsp.add("subfacet", sortedMap);
}
} else {
logger.warn("You must specify 'subfacet' params in solr query !!");
}
long enTime = System.currentTimeMillis();
logger.info("Time taken to generate facets for " + numDoc
+ " documents is " + (enTime - startTime) + " ms");
}
}
私はRSPオブジェクトにsubfacetを設定しているように思われ、rb.rsp.add("subfacet", sortedMap);
を使用して応答を追加しようとしていますが、応答はUIがこのobject.Whatが含まれていないのSolrに戻っ私が行方不明ですここに ?
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
</lst>
<arr name="last-components">
<str>subfacetcomponent</str>
</arr>
</requestHandler>
を編集: Solrのは、単一ノードと、単一のシャードとしてではなく、クラウドモードで使用されている場合、それは正常に動作後 は私の選択要求ハンドラです。