因为constellio系统的类比较多,先从搜索引擎最本质的功能模块索引与检索入手,看constellio系统实现索引与检索功能的源码
首先是获取solr上下文,下面是SolrCoreContext.java源码
/** * Constellio, Open Source Enterprise Search * Copyright (C) 2010 DocuLibre inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package com.doculibre.constellio.solr.context; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrCore; import org.xml.sax.SAXException; import com.doculibre.constellio.entities.RecordCollection; import com.doculibre.constellio.opensearch.OpenSearchSolrServer; import com.doculibre.constellio.services.RecordCollectionServices; import com.doculibre.constellio.utils.ClasspathUtils; import com.doculibre.constellio.utils.ConstellioSpringUtils; public class SolrCoreContext { private static File solrCoresRootDir; private static CoreContainer cores = new CoreContainer(); public static final String DEFAULT_COLLECTION_NAME = "constellio_default"; private static Map<String, SolrServer> coreServers = new HashMap<String, SolrServer>(); public static synchronized void init() { if (solrCoresRootDir == null) { solrCoresRootDir = ClasspathUtils.getCollectionsRootDir(); } init(solrCoresRootDir); } public static synchronized void init(File solrCoresRootDir) { SolrCoreContext.solrCoresRootDir = solrCoresRootDir; try { File solrXml = new File(solrCoresRootDir, "solr.xml"); cores.load(solrCoresRootDir.getPath(), solrXml); for (String coreName : cores.getCoreNames()) { // Default setEmbeddedSolrServer(coreName); } } catch (ParserConfigurationException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } catch (SAXException e) { throw new RuntimeException(e); } } public static synchronized void shutdown() { if (cores != null) { cores.shutdown(); } } public static synchronized void clear() { solrCoresRootDir = null; cores = new CoreContainer(); coreServers = new HashMap<String, SolrServer>(); } public static File getSolrCoresRootDir() { return solrCoresRootDir; } public static File getSolrCoreRootDir(String coreName) { String coreDirName; if (coreName != null) { coreDirName = coreName; } else { coreDirName = DEFAULT_COLLECTION_NAME; } return new File(getSolrCoresRootDir(), coreDirName); } public static File getSolrCoreIndexDir(String coreName) { File solrCoreRootDir = getSolrCoreRootDir(coreName); return new File(solrCoreRootDir, "data" + File.separator + "index"); } public static CoreContainer getCores() { return cores; } public static SolrServer getSolrServer(String coreName) { RecordCollectionServices collectionServices = ConstellioSpringUtils.getRecordCollectionServices(); RecordCollection collection = collectionServices.get(coreName); if (collection != null && collection.isOpenSearch()) { return new OpenSearchSolrServer(); } else { return coreServers.get(coreName); } } //Pour tests sans collection public static SolrServer getSolrServerUtil(String coreName) { return coreServers.get(coreName); } public static void registerSolrServer(String coreName, SolrServer solrServer) { coreServers.put(coreName, solrServer); } public static void setEmbeddedSolrServer(String coreName) { registerSolrServer(coreName, new EmbeddedSolrServer(cores, coreName)); } public static void setHttpSolrServer(String coreName, String url) { try { registerSolrServer(coreName, new CommonsHttpSolrServer(url)); } catch (MalformedURLException e) { throw new RuntimeException(e); } } public static void removeCore(String coreName) { SolrCore core = cores.getCore(coreName); if (core != null) { core.closeSearcher(); core.close(); } cores.remove(coreName); coreServers.remove(coreName); } }
下面是类路径工具类ClasspathUtils.java
/** * Constellio, Open Source Enterprise Search * Copyright (C) 2010 DocuLibre inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package com.doculibre.constellio.utils; import java.io.File; import java.net.URISyntaxException; import java.net.URL; import com.doculibre.constellio.entities.RecordCollection; public class ClasspathUtils { public static File getClassesDir() { URL classesOrBinDirURL = ClasspathUtils.class.getClassLoader().getResource(""); File classesOrBinDir; try { classesOrBinDir = new File(classesOrBinDirURL.toURI()); } catch (URISyntaxException e) { throw new RuntimeException(e); } return classesOrBinDir; } public static File getWebinfDir() { File webinfDir; File classesOrBinDir = getClassesDir(); if (classesOrBinDir.getName().equals("bin")) { File projectDir = classesOrBinDir.getParentFile(); File webContentDir = new File(projectDir, "WebContent"); webinfDir = new File(webContentDir, "WEB-INF"); } else { webinfDir = classesOrBinDir.getParentFile(); } return webinfDir; } /** * For a web application, it's the web-inf dir. For tests, it's a temporary folder. * We don't want unit test to modify contellio project files */ public static File getWorkDir() { File workDir; File classesOrBinDir = getClassesDir(); if (classesOrBinDir.getName().equals("bin")) { File webInfDir = getWebinfDir(); workDir = new File(classesOrBinDir, "temp"); if (!workDir.exists()) { workDir.mkdir(); } //default Solr core File constellioDir = new File(workDir, "constellio"); if (!constellioDir.exists()) { FileUtils.copyDirectory(new File(webInfDir, "constellio"), constellioDir); } workDir.deleteOnExit(); } else { workDir = getWebinfDir(); } return workDir; } public static File getCollectionsRootDir() { File webinfDir = getWorkDir(); File constellioDir = new File(webinfDir, "constellio"); File collectionsDir = new File(constellioDir, "collections"); return collectionsDir; } public static File getCollectionRootDir(RecordCollection collection) { File collectionsDir = getCollectionsRootDir(); File collectionDir = new File(collectionsDir, collection.getName()); return collectionDir; } public static File getSynonymsFile(RecordCollection collection) { File collectionDir = getCollectionRootDir(collection); File synonymsFile = new File(collectionDir, "conf" + File.separator + "synonyms.txt"); return synonymsFile; } public static void main(String[] args) { System.out.println(getClassesDir()); } }