Есть ли способ получить Solr для генерации подсчетов фасетов только по результирующему набору документов вместо всех документов? - PullRequest
0 голосов
/ 24 мая 2018

Я использую пользовательский интерфейс Solr Admin для создания этого запроса:

http://localhost:8983/solr/gencat.imagemetadata/select?q=id:"TH-1961-46483-10968-9"&wt=json&indent=true&facet=true&facet.field=externalid

Возвращает:

{
  "response": {
    "numFound": 1,
    "start": 0,
    "docs": [
      {
        "id": "TH-1961-46483-10968-9",
        "externalid": "100700000_00024"
      }
    ]
  },
  "facet_counts": {
    "facet_queries": {},
    "facet_fields": {
      "externalid": [
        "100700000_00024",
        1,
        "005471837_00001",
        0,
        "005471837_00002",
        0,
        "005471837_00003",
        0,
        "005471837_00099",
        0,
        ....
      ]
    }
  }
}

Мое предположение, что он собирался тольковозвращаемый фасет рассчитывает для одного найденного документа (так как я указываю нужный идентификатор).Вместо этого он возвращает структуру facet_counts с каждым значением externalid, индексированным Solr (предоставлено… все записи, кроме одной, равны 0. Количество externalid для документа, соответствующего запросу, равно 1, как и должно быть).Но мне нужны только подсчеты аспектов Solr для документов в результатах поиска.Не все.Это значительно замедляет запрос.

Да, я могу установить facet.mincount = 1, чтобы он возвращал только те подсчеты фасетов, у которых действительно есть подсчеты, но под обложками он все равно выглядит так, как будто просматривает все документы.... не только запрашиваемый набор результатов.В настоящее время требуется 2 минуты для выполнения запроса выше для наших 2+ миллиардов элементов.

Когда я поворачиваю tracing on; в cqlsh, я вижу, что он обрабатывает все 2+ миллиарда элементов.Если бы он только учитывал набор результатов, этот запрос был бы намного, намного быстрее.

externalid определяется следующим образом в файле схемы:

<field docValues="true" indexed="true" multiValued="false" name="externalid" stored="true" type="StrField"/>

Что я неправильно понимаю?Это замедляет мой запрос из-за того, что мне нужно выйти и найти все внешние идентификаторы, просто чтобы сказать, что они имеют счет 0.

Есть ли способ сказать Solr-огранке только смотреть на документы, найденные извопрос?

Я на Solr 6 под DSE 6.0

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете задать метод фасетов через параметр facet.method.fc является значением по умолчанию, и это поведение, которое вы ищете - вы уверены, что DSE фактически использует fc в качестве метода по умолчанию?(поскольку определение для fc состоит в том, что он должен выполнять итерации только для документов, соответствующих запросу):

fc

Рассчитывает количество фасетов по итерации по документам , которые соответствуют запросу, и суммирование терминов, встречающихся в каждом документе.

В настоящее время это реализовано с использованием кэша UnInvertedField, если поле является многозначным или имеет токены (согласно FieldType.isTokened ()).Каждый документ ищется в кэше, чтобы увидеть, какие термины / значения он содержит, и подсчет увеличивается для каждого значения.

Этот метод отлично подходит для ситуаций, когда число проиндексированных значений для полявысокий, но число значений в документе низкое .Для многозначных полей используется гибридный подход, который использует фильтры терминов из filterCache для терминов, которые соответствуют многим документам.Буквы fc обозначают кеш поля.

...