您的位置:首页 > 其它

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

2013-02-17 02:42 525 查看
因为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());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐