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());
        }
    
    }
  • 相关阅读:
    C#Winform中treeView控件使用总结
    转:vs发布window应用程序时出错:未能签名 ...setup.exe
    C# 常见集合之前的转换
    开发者眼中的Spring与JavaEE
    运行库到底做了什么?
    C++, Java和C#的编译、链接过程解析
    转载一篇将C/C++ 与lua混合使用入门讲的比较好的文章
    路会越走越窄的
    [DBNETLIB][ConnectionOpen(Connect()).]SQL Server 不存在或拒绝访问 数据库错误 解决办法总结
    Linux学习路线指南
  • 原文地址:https://www.cnblogs.com/chenying99/p/2913868.html
Copyright © 2011-2022 走看看