Ответ 1
Что вам нужно - то, что я называю - ядром объединения. Сама эта схема не будет содержать контент, она используется только как своего рода оболочка для объединения тех полей, которые вы хотите отображать из обоих ядер. Там вам понадобится
- schema.xml, который завершает все поля, которые вы хотите иметь в объединенном результате
- обработчик запросов, который объединяет два разных ядра для вас.
Важное ограничение, предварительно взятое из страницы Solr Wiki о DistributedSearch
Документы должны иметь уникальный ключ, и уникальный ключ должен быть сохранен (хранится = "true" в schema.xml). Уникальное ключевое поле должно быть уникальным для всех осколков. Если обнаружены документы с повторяющимися уникальными ключами, Solr попытается вернуть действительные результаты, но поведение может быть недетерминированным.
В качестве примера у меня есть shard-1 с идентификаторами полей, заголовком, описанием и shard-2 с полями id, title, abstractText. Итак, у меня есть эти схемы
схема осколка-1
<schema name="shard-1" version="1.5">
<fields>
<field name="id"
type="int" indexed="true" stored="true" multiValued="false" />
<field name="title"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="description"
type="text" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- type definition left out, have a look in github -->
</schema>
схема осколка-2
<schema name="shard-2" version="1.5">
<fields>
<field name="id"
type="int" indexed="true" stored="true" multiValued="false" />
<field name="title"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="abstractText"
type="text" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- type definition left out, have a look in github -->
</schema>
Чтобы унифицировать эти схемы, я создаю третью схему, которую я называю shard-unification, которая содержит все четыре поля.
<schema name="shard-unification" version="1.5">
<fields>
<field name="id"
type="int" indexed="true" stored="true" multiValued="false" />
<field name="title"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="abstractText"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="description"
type="text" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- type definition left out, have a look in github -->
</schema>
Теперь мне нужно использовать эту комбинированную схему, поэтому я создаю обработчик запросов в файле solrconfig.xml ядра solr-унификации
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="q.alt">*:*</str>
<str name="qf">id title description abstractText</str>
<str name="fl">*,score</str>
<str name="mm">100%</str>
</lst>
</requestHandler>
<queryParser name="edismax" class="org.apache.solr.search.ExtendedDismaxQParserPlugin" />
Что это. Теперь некоторые данные индекса необходимы в осколках-1 и осколках-2. Чтобы запросить единый результат, просто запросите объединение shard с соответствующим параметром shards.
http://localhost/solr/shard-unification/select?q=*:*&rows=100&start=0&wt=json&shards=localhost/solr/shard-1,localhost/solr/shard-2
Это вернет вам результат, например
{
"responseHeader":{
"status":0,
"QTime":10},
"response":{"numFound":2,"start":0,"maxScore":1.0,"docs":[
{
"id":1,
"title":"title 1",
"description":"description 1",
"score":1.0},
{
"id":2,
"title":"title 2",
"abstractText":"abstract 2",
"score":1.0}]
}}
Получить исходный осколок документа
Если вы хотите извлечь исходный осколок в каждый документ, вам просто нужно указать [shard]
в пределах fl
. Либо как параметр с запросом, либо по умолчанию по умолчанию, см. Ниже. Скобки являются обязательными, они также будут в полученном ответе.
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="q.alt">*:*</str>
<str name="qf">id title description abstractText</str>
<str name="fl">*,score,[shard]</str>
<str name="mm">100%</str>
</lst>
</requestHandler>
<queryParser name="edismax" class="org.apache.solr.search.ExtendedDismaxQParserPlugin" />
Рабочий образец
Если вы хотите увидеть запущенный пример, мой проект solrsample на github и выполнить ShardUnificationTest, Я также включил в себя обманку.