Solr MultiCore Поиск - PullRequest
       4

Solr MultiCore Поиск

4 голосов
/ 07 марта 2011

Я использую Apache Solr для поиска. Я использую это, чтобы обеспечить личный пользовательский поиск. каждый пользователь имеет отдельный физический индекс Lucene. Итак, для 10 пользователей у меня есть 10 отдельных физических индексов на диске.

Для поддержки поиска по этим индексам я планирую использовать Solr MultiCore Feature . С различными статьями, которые я читал об этом, похоже, это будет работать.

Где я на самом деле не уверен, что когда поисковик solr получает запрос, вместо того, чтобы отправлять запрос всем многоядерным процессам, как мне направить запрос в то ядро, к которому подключен индекс конкретного пользователя? Это изменение конфигурации или мне нужно сделать изменения уровня кода?

т.е. Я хочу отправить запрос только одному ядру solr (на основе идентификатора пользователя). Это вообще возможно?

ОБНОВЛЕНИЕ: Так что в соответствии с одним из солутонов я могу добавить многоядерные файлы в solrconfig.xml, т.е. во время запуска solr мне нужно будет упомянуть ядра (или в моем случае пользователей). Так что теперь, если я хочу добавить индекс нового пользователя, мне, вероятно, нужно остановить solr, отредактировать его конфигурацию, добавить ядро ​​пользователя и снова запустить solr. Есть ли способ динамически добавлять ядра в работающий экземпляр Solr?

Ответы [ 4 ]

10 голосов
/ 07 марта 2011

Ядра Solr - это, по сути, несколько индексов, работающих в одном контексте на сервере приложений. Вы можете думать об этом как об установке 1 war-файла для каждого пользователя. Каждое ядро ​​разделено именем, поэтому вы должны себя отслеживать, какой URL действителен для какого пользователя.

Например,

http://host.com/solr/usercore1/select?q=test http://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>

... вместо отправки запроса всем многоядерным процессорам ...

Этот подход называется сегментированием и основан на распределенном поиске, который является совершенно отдельной функцией, которая фокусируется на разбиении одного индекса пользователя на несколько экземпляров solr.

[EDIT] Один из подходов к созданию новых ядер заключается в использовании solrj, который обеспечивает подпрограмму CoreAdmin.createCore(..). Вы также можете сделать это с помощью ручного HTTP-запроса: /cores?action=CREATE&name=usercore3 ...

Solr также может динамически перезагружать свою конфигурацию, если у вас есть сценарий, который редактировал конфигурацию cores , эти изменения также должны быть приняты.

7 голосов
/ 26 октября 2011

Вы можете объединить многоядерный с шардингом по следующему URL:

http://localhost:8983/solr/core0/select?shards=localhost:8983/solr/core0,localhost:8983/solr/core1&q=*:*
3 голосов
/ 09 июня 2012

Я использую Solrj.

Первое создание ядер. Я нашел 2 способа.

первый путь:

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.

Таким образом, в вашем случае вы просто получите имя ядра, связанное с пользователем, выполняющим поисковый запрос. Экземпляр coreContainer будет общим, но не экземпляр SolrServer.

Кстати, я делаю что-то похожее на тебя!

Увидимся.

1 голос
/ 21 ноября 2011

Когда вы используете mmulticore, вы создаете отдельную папку conf, которая содержит отдельный запрос и схему, а также способ получения результатов.

И когда вы нажмете на URL ниже

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...