Java Solr多核搜索

Java Solr多核搜索,java,apache,search,solr,Java,Apache,Search,Solr,我正在使用进行搜索。我使用它来提供基于个人用户的搜索。i、 e.每个用户都有一个单独的物理Lucene索引。对于10个用户,我在磁盘上有10个单独的物理索引 为了支持对这些索引的搜索,我计划使用。我读了很多关于这方面的文章,看起来这是可行的 我实际上不确定的是,当solr搜索者得到一个查询时,我如何将查询传送到与该特定用户的索引相连的核心,而不是将查询发送到所有多个核心?这是配置更改还是需要进行代码级更改 i、 我只想将查询发送到一个solr核心(基于userid)。这可能吗 更新:因此,根据其

我正在使用进行搜索。我使用它来提供基于个人用户的搜索。i、 e.每个用户都有一个单独的物理Lucene索引。对于10个用户,我在磁盘上有10个单独的物理索引

为了支持对这些索引的搜索,我计划使用。我读了很多关于这方面的文章,看起来这是可行的

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

i、 我只想将查询发送到一个solr核心(基于userid)。这可能吗


更新:因此,根据其中一种解决方案,我可以在solrconfig.xml中添加多个核心,即在启动solr时,我需要提及核心(或者在我的情况下是用户)。所以现在,如果我想添加一个新用户的索引,我可能需要停止solr,编辑它的配置,添加用户core并再次启动solr。是否有任何方法可以动态地将核心添加到正在运行的solr实例中

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

例如:

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

它基于config solr.xml:


…而不是将查询发送到所有多核

这种方法称为分片(sharding),它基于分布式搜索,这是一种完全独立的功能,其重点是在多个solr实例上拆分一个用户索引

[编辑] 创建新内核的一种方法是solrj,它提供了一个例程。您也可以使用手动HTTP请求执行此操作:
/cores?action=CREATE&name=usercore3


Solr还可以动态地重新加载其配置,如果您有一个用于编辑核心配置的脚本,那么这些更改也应该被接受

您可以通过以下URL将多核与分片相结合:

http://localhost:8983/solr/core0/select?shards=localhost:8983/solr/core0,localhost:8983/solr/core1&q=*:*

使用mmulticore时,将创建单独的conf文件夹,其中包含单独的查询和模式以及获取结果的方式

当你点击下面的网址

http://{your localhost}:8983/solr
您将看到已创建的核心列表。对于每个核心,您必须创建如下索引

http://{your localhost}:8983/solr/{your_core_name1}/dataimport?command=full-import
http://{your localhost}:8983/solr/{your_core_name2}/dataimport?command=full-import
http://{your localhost}:8983/solr/{your_core_name3}/dataimport?command=full-import
在创建索引之后,在执行这样的搜索时,您必须参考核心

http://{your localhost}:8983/solr/{your_core_name3}/select/?q=*:*&start=0&rows=100
我在用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实例不会被共享

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


再见。

谢谢您的回复。有关更多信息,请参阅我的更新。我也不想做分布式搜索。i、 对于单个用户,我将只有一个索引。我想我正在取得进展,注册。这非常感谢你给出了正确的想法。。。
SolrServer solrServer = new EmbeddedSolrServer(coreContainer, coreName);