Распределенный поиск по нескольким экземплярам Solr

#performance #search #solr #full-text-search

#Производительность #Поиск #solr #полнотекстовый поиск

Вопрос:

У меня есть 100 миллиардов строк данных, которые я разделил на несколько экземпляров solr, каждый с отдельной схемой.

Мне нужно:

  • Запрашивайте каждый экземпляр.
  • Получите результаты из каждого экземпляра.
  • Добавьте эти результаты в окончательный запрос.
  • Вызовите конечный экземпляр Solr для получения конечного результата.

Как я могу это сделать? Нужно ли мне писать отдельный обработчик запросов?

например,

 $ curl http://localhost:8983/solr/select?q=query1.result AND ... AND queryN.result
  

Комментарии:

1. Вы можете сделать это в ElasticSearch. Но не уверен насчет Solr. elasticsearch.org/guide/reference/api/multi-search.html

Ответ №1:

то, что вы ищете, называется распределенным поиском -> http://wiki.apache.org/solr/DistributedSearch

Комментарии:

1. ах, ладно .. извините.. неправильно понял ваш вопрос. В этом случае — я думаю — вам нужно объединить «вспомогательные» результаты в вашем приложении, чтобы сгенерировать новый, окончательный запрос.

2. как это сделать внутри самого solr?

Ответ №2:

я сделал это с помощью solrj (например, решение)

  File home = new File("C:\workspace\SolrMultipleCore\solr");
 File f = new File( home, "solr.xml" );
 CoreContainer container = new CoreContainer();
 container.load( "C:\workspace\SolrMultipleCore\solr", f );
 EmbeddedSolrServer server = new EmbeddedSolrServer( container,"core1");
 EmbeddedSolrServer server1 = new EmbeddedSolrServer( container,"core2");
 String query=params.getParams("q");
 String query1=params.getParams("q1");
 SolrQuery solrquery=new SolrQuery(query);
 QueryResponse q = server.query(solrquery);
 QueryResponse q1 = server1.query(solrquery);
  

Solr.xml

 <solr persistent="true">
 <property name="snapshooter" value="C:solr1binsnapshooter.sh" />
 <cores adminPath="/admin/cores">
  <core name="core1" instanceDir="core0"/>   
  <core name="core2" instanceDir="core1" />
 </cores>
</solr>
  

Я все еще изучаю, как это сделать внутри solr.

Дайте мне знать, нужны ли какие-либо подробности по этому

Ответ №3:

Я думаю, что DirectSolrConnection могло бы помочь. У меня похожие требования, как у вас, и я использовал DirectSolrConnection для этого.

Комментарии:

1. Как вы можете использовать DirectSolrConnection для распределенного поиска. Вам потребуется иметь при себе экземпляр SolrCore.

Ответ №4:

Вы можете использовать комбинацию сегментов и фильтрующих запросов:

и затем

Пример:

ваш локальный «комбинированный solr» запущен на localhost: 8983, а другие solr работают на host1: 8983, host2: 8983, … Вы выполняете удаленный поиск на этих одноранговых узлах для ‘field1:query1’, но хотите отфильтровать из результатов запрос ‘field2: query2’. Итак, вы вызываете:

http://localhost:8983/solr/select?shards=host1:8983/solr,host1:8983/solramp;q=field1:query1amp;fq=field2:query2