设为首页 收藏本站
查看: 965|回复: 0

[经验分享] constellio——基于solr的开源搜索引擎系统源码研究(二)

[复制链接]

尚未签到

发表于 2015-7-17 11:28:25 | 显示全部楼层 |阅读模式
  因为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 coreServers = new HashMap();
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();
}
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());
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87623-1-1.html 上篇帖子: solr 查询解析流程 下篇帖子: solr 学习资料
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表