zoukankan      html  css  js  c++  java
  • 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());
        }
    
    }
  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/chenying99/p/2913868.html
Copyright © 2011-2022 走看看