private void checkAvailable(String name, ClusteringEngine engine) { if (!engine.isAvailable()) { throw new SolrException(ErrorCode.SERVER_ERROR, "Clustering engine declared, but not available, check the logs: " + name); } }
final String name = getClusteringEngineName(rb); boolean useResults = params.getBool(ClusteringParams.USE_SEARCH_RESULTS, false); if (useResults == true) { SearchClusteringEngine engine = searchClusteringEngines.get(name); if (engine != null) { checkAvailable(name, engine); DocListAndSet results = rb.getResults(); Map<SolrDocument,Integer> docIds = new HashMap<>(results.docList.size()); SolrDocumentList solrDocList = docListToSolrDocumentList( results.docList, rb.req.getSearcher(), engine.getFieldsToLoad(rb.req), docIds); Object clusters = engine.cluster(rb.getQuery(), solrDocList, docIds, rb.req); rb.rsp.add("clusters", clusters); } else { DocumentClusteringEngine engine = documentClusteringEngines.get(name); if (engine != null) { checkAvailable(name, engine); boolean useDocSet = params.getBool(ClusteringParams.USE_DOC_SET, false); NamedList<?> nl = null; nl = engine.cluster(rb.getResults().docSet, params); } else { nl = engine.cluster(params);
@Override public void finishStage(ResponseBuilder rb) { SolrParams params = rb.req.getParams(); if (!params.getBool(COMPONENT_NAME, false) || !params.getBool(ClusteringParams.USE_SEARCH_RESULTS, false)) { return; } if (rb.stage == ResponseBuilder.STAGE_GET_FIELDS) { String name = getClusteringEngineName(rb); SearchClusteringEngine engine = searchClusteringEngines.get(name); if (engine != null) { checkAvailable(name, engine); SolrDocumentList solrDocList = (SolrDocumentList) rb.rsp.getResponse(); // TODO: Currently, docIds is set to null in distributed environment. // This causes CarrotParams.PRODUCE_SUMMARY doesn't work. // To work CarrotParams.PRODUCE_SUMMARY under distributed mode, we can choose either one of: // (a) In each shard, ClusteringComponent produces summary and finishStage() // merges these summaries. // (b) Adding doHighlighting(SolrDocumentList, ...) method to SolrHighlighter and // making SolrHighlighter uses "external text" rather than stored values to produce snippets. Map<SolrDocument,Integer> docIds = null; Object clusters = engine.cluster(rb.getQuery(), solrDocList, docIds, rb.req); rb.rsp.add("clusters", clusters); } else { log.warn("No engine named: " + name); } } }
this.core = core; String result = super.init(config, core); final SolrParams initParams = config.toSolrParams(); new SolrResourceLocator(core, initParams), withContextClassLoader(core.getResourceLoader().getClassLoader(), () -> { try { AttributeValueSets avs = AttributeValueSets.deserialize(attributeXmls[0].open()); extractCarrotAttributes(initParams, initAttributes); withContextClassLoader(core.getResourceLoader().getClassLoader(), () -> this.controller.init(initAttributes));
final String name = StringUtils.defaultIfBlank(engine.init(engineInitParams, core), ""); if (!engine.isAvailable()) { if (optional) { log.info("Optional clustering engine not available: " + name); setupDefaultEngine("search results clustering", searchClusteringEngines); setupDefaultEngine("document clustering", documentClusteringEngines);
@Override public String init(NamedList config, final SolrCore core) { String result = super.init(config, core); SolrParams initParams = SolrParams.toSolrParams(config); // Initialize Carrot2 controller. Pass initialization attributes, if any. HashMap<String, Object> initAttributes = new HashMap<String, Object>(); extractCarrotAttributes(initParams, initAttributes); this.controller.init(initAttributes); this.idFieldName = core.getSchema().getUniqueKeyField().getName(); // Make sure the requested Carrot2 clustering algorithm class is available String carrotAlgorithmClassName = initParams.get(CarrotParams.ALGORITHM); Class<?> algorithmClass = core.getResourceLoader().findClass(carrotAlgorithmClassName); if (!IClusteringAlgorithm.class.isAssignableFrom(algorithmClass)) { throw new IllegalArgumentException("Class provided as " + CarrotParams.ALGORITHM + " must implement " + IClusteringAlgorithm.class.getName()); } this.clusteringAlgorithmClass = (Class<? extends IClusteringAlgorithm>) algorithmClass; return result; }
String name = getClusteringEngineName(rb); SearchClusteringEngine engine = searchClusteringEngines.get(name); if (engine != null) { checkAvailable(name, engine); Set<String> fields = engine.getFieldsToLoad(rb.req); if (fields == null || fields.size() == 0) { return;
ClusteringEngine clusterer = (ClusteringEngine) loader.newInstance(className); if (clusterer != null) { String name = clusterer.init(engineNL, core); if (name != null) { boolean isDefault = name.equals(ClusteringEngine.DEFAULT_ENGINE_NAME);
/** * Setup the default clustering engine. * @see "https://issues.apache.org/jira/browse/SOLR-5219" */ private static <T extends ClusteringEngine> void setupDefaultEngine(String type, LinkedHashMap<String,T> map) { // If there's already a default algorithm, leave it as is. String engineName = ClusteringEngine.DEFAULT_ENGINE_NAME; T defaultEngine = map.get(engineName); if (defaultEngine == null || !defaultEngine.isAvailable()) { // If there's no default algorithm, and there are any algorithms available, // the first definition becomes the default algorithm. for (Map.Entry<String, T> e : map.entrySet()) { if (e.getValue().isAvailable()) { engineName = e.getKey(); defaultEngine = e.getValue(); map.put(ClusteringEngine.DEFAULT_ENGINE_NAME, defaultEngine); break; } } } if (defaultEngine != null) { log.info("Default engine for " + type + ": " + engineName + " [" + defaultEngine.getClass().getSimpleName() + "]"); } else { log.warn("No default engine for " + type + "."); } } }