Запросить несколько коллекций с разными полями в solr

Учитывая следующий (одноядерный) запрос:

http://localhost/solr/a/select?indent=true&q=*:*&rows=100&start=0&wt=json
http://localhost/solr/b/select?indent=true&q=*:*&rows=100&start=0&wt=json

Первый запрос возвращает "numFound": 40000 " Второй запрос возвращает "numFound": 10000 "

Я попытался сместить их вместе:

   http://localhost/solr/a/select?indent=true&shards=localhost/solr/a,localhost/solr/b&q=*:*&rows=100&start=0&wt=json

Теперь я получаю "numFound": 50000 ". Единственная проблема: "a" имеет больше столбцов, чем "b". Таким образом, запрос нескольких коллекций возвращает значения a.

Можно ли запрашивать несколько коллекций с разными полями? Или они должны быть одинаковыми? И как мне изменить свой третий URL-адрес, чтобы получить этот результат?

Ответ 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, Я также включил в себя обманку.

Ответ 2

Осколки должны использоваться в Solr

Когда индекс становится слишком большим, чтобы соответствовать одной системе или когда один запрос занимает слишком много времени, чтобы выполнить

поэтому число и имена столбцов всегда должны быть одинаковыми. Это указано в этом документе (где также цитируется предыдущая цитата): http://wiki.apache.org/solr/DistributedSearch

Если вы оставите свой запрос так, как есть, и сделайте два осколка с одинаковыми полями, этот shoudl будет работать так, как ожидалось.

Если вам нужна дополнительная информация о том, как осколки работают в SolrCould, посмотрите на этот документ: http://wiki.apache.org/solr/SolrCloud