constellio——基于solr的开源搜索引擎系统源码研究(二)

因为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());
    }

}
原文地址:https://www.cnblogs.com/chenying99/p/2913868.html