#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, который выполняет сегментированный поиск с использованием параметра shards: http://wiki.apache.org/solr/DistributedSearch
и затем
- выполните запрос фильтра по результату в рамках одного запроса http://wiki.apache.org/solr/CommonQueryParameters#fq
Пример:
ваш локальный «комбинированный 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