首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solr MultiCore搜索

Solr MultiCore搜索
EN

Stack Overflow用户
提问于 2011-03-07 14:56:01
回答 4查看 14.4K关注 0票数 4

我正在使用阿帕奇索尔进行搜索。我用这个来提供基于个人用户的搜索。也就是说,每个用户都有一个单独的物理Lucene索引。因此,对于10个用户,我在磁盘上有10个单独的物理索引。

为了支持对这些索引的搜索,我计划使用Solr MultiCore特征。我一直在阅读有关这方面的各种文章,看来这是可行的。

实际上,我不确定的是,当solr搜索程序获得一个查询时,而不是将查询发送到所有多核,我如何将查询转移到与特定用户索引相关联的核心?这是配置更改,还是需要进行代码级别的更改?

也就是说,我只想将查询发送到一个solr-core (基于userid)。这有可能吗?

更新:,因此,根据其中一个解决方案,我可以在solrconfig.xml中添加多个核,即在开始solr时,我需要提到核心(在我的例子中是用户)。所以现在,如果我想添加一个新的用户索引,我可能需要停止solr,编辑它的配置,添加用户核心&重新启动solr。有任何方法可以动态地向运行中的solr实例添加核心吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-07 15:00:05

Solr核心本质上是运行在应用服务器上同一上下文中的多个索引。您可以将其看作是为每个用户安装1个war文件。每个核心由一个名称分隔,因此您必须自己跟踪哪个url对哪个用户有效。

例如,

http://host.com/solr/usercore1/select?q=test http://host.com/solr/usercore2/select?q=test

它基于配置solr.xml:

代码语言:javascript
复制
<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还可以动态地重新加载它的配置,如果您有一个编辑核心配置的脚本,那么这些更改也应该被选中。

票数 10
EN

Stack Overflow用户

发布于 2011-10-26 08:43:25

您可以通过以下URL将多核与切分结合起来:

代码语言:javascript
复制
http://localhost:8983/solr/core0/select?shards=localhost:8983/solr/core0,localhost:8983/solr/core1&q=*:*
票数 8
EN

Stack Overflow用户

发布于 2012-06-08 21:06:21

我用的是solrj。

首先创建核心。我找到了两种方法。

第一条路:

代码语言:javascript
复制
SolrCore solrCore = coreContainer.create(new CoreDescriptor(
        coreContainer,
        coreName,
        "."));
coreContainer.register(solrCore, true);

第二条路:

代码语言:javascript
复制
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);

要查询特定的核心,我只需:

代码语言:javascript
复制
SolrServer solrServer = new EmbeddedSolrServer(coreContainer, coreName);

然后以我通常使用solrj的方式执行我的查询。

因此,在您的示例中,您只需获得与执行搜索请求的用户关联的corename。coreContainer实例将是共享的,而不是SolrServer实例。

顺便说一句,我在做一些和你相似的事情!

再见。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5221132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档