我正在使用阿帕奇索尔进行搜索。我用这个来提供基于个人用户的搜索。也就是说,每个用户都有一个单独的物理Lucene索引。因此,对于10个用户,我在磁盘上有10个单独的物理索引。
为了支持对这些索引的搜索,我计划使用Solr MultiCore特征。我一直在阅读有关这方面的各种文章,看来这是可行的。
实际上,我不确定的是,当solr搜索程序获得一个查询时,而不是将查询发送到所有多核,我如何将查询转移到与特定用户索引相关联的核心?这是配置更改,还是需要进行代码级别的更改?
也就是说,我只想将查询发送到一个solr-core (基于userid)。这有可能吗?
更新:,因此,根据其中一个解决方案,我可以在solrconfig.xml中添加多个核,即在开始solr时,我需要提到核心(在我的例子中是用户)。所以现在,如果我想添加一个新的用户索引,我可能需要停止solr,编辑它的配置,添加用户核心&重新启动solr。有任何方法可以动态地向运行中的solr实例添加核心吗?
发布于 2011-03-07 15:00:05
Solr核心本质上是运行在应用服务器上同一上下文中的多个索引。您可以将其看作是为每个用户安装1个war文件。每个核心由一个名称分隔,因此您必须自己跟踪哪个url对哪个用户有效。
例如,
http://host.com/solr/usercore1/select?q=testhttp://host.com/solr/usercore2/select?q=test
它基于配置solr.xml:
<solr persistent="true" sharedLib="lib">
<cores adminPath="/admin/cores">
<core name="usercore1" instanceDir="usercore1" />
<core name="usercore2" instanceDir="usercore1" />
</cores>
</solr>将查询发送到所有多核的...instead .
这种方法称为分块,基于分布式搜索,这是一个完全独立的特性,它侧重于在多个solr实例上拆分一个用户的索引。
编辑一种创建新核心的方法是solrj,它提供了一个常规的CoreAdmin.createCore(..)。您也可以使用手动HTTP请求来完成此操作:/cores?action=CREATE&name=usercore3.
Solr还可以动态地重新加载它的配置,如果您有一个编辑核心配置的脚本,那么这些更改也应该被选中。
发布于 2011-10-26 08:43:25
您可以通过以下URL将多核与切分结合起来:
http://localhost:8983/solr/core0/select?shards=localhost:8983/solr/core0,localhost:8983/solr/core1&q=*:*发布于 2012-06-08 21:06:21
我用的是solrj。
首先创建核心。我找到了两种方法。
第一条路:
SolrCore solrCore = coreContainer.create(new CoreDescriptor(
coreContainer,
coreName,
"."));
coreContainer.register(solrCore, true);第二条路:
SolrQuery solrQuery = new SolrQuery();
solrQuery.setParam(CommonParams.QT, "/admin/cores");
solrQuery.setParam(
CoreAdminParams.ACTION,
CoreAdminParams.CoreAdminAction.CREATE.name());
solrQuery.setParam(
CoreAdminParams.NAME,
name);
solrQuery.setParam(
CoreAdminParams.INSTANCE_DIR,
"./" + name);
solrQuery.setParam(
CoreAdminParams.CONFIG,
solrHomeRelativePath + solrConfigHomeRelativePath);
solrQuery.setParam(
CoreAdminParams.SCHEMA,
solrHomeRelativePath + solrSchemaHomeRelativePath);
solrQuery.setParam(
CoreAdminParams.DATA_DIR,
".");
solrServer.query(solrQuery);要查询特定的核心,我只需:
SolrServer solrServer = new EmbeddedSolrServer(coreContainer, coreName);然后以我通常使用solrj的方式执行我的查询。
因此,在您的示例中,您只需获得与执行搜索请求的用户关联的corename。coreContainer实例将是共享的,而不是SolrServer实例。
顺便说一句,我在做一些和你相似的事情!
再见。
https://stackoverflow.com/questions/5221132
复制相似问题