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());

    }



}

你可能感兴趣的:(Const)