Solr сворачивает qparserplugin с помощью group.facet=при подсчете фасетов стиля

#solr4

#solr4

Вопрос:

У меня индекс Solr около 5 миллионов документов объемом 8 ГБ с использованием Solr 4.7.0. Мне требуется группировка в Solr, но я нахожу ее слишком медленной. Вот конфигурация группы:

 group=on
group.facet=on
group.field=workId
group.ngroups=on
  

На компьютере достаточно памяти в 24 ГБ, а 4 ГБ выделено для самого Solr. Запросы обычно занимают около 1200 мс по сравнению с 90 мс, когда группировка отключена.

Я наткнулся на плагин под названием CollapsingQParserPlugin, который использует запрос фильтра для удаления всех, кроме одного, из группы.

fq={!свернуть поле= рабочий идентификатор}

Он предназначен для индексов, которые имеют много уникальных групп. У меня около 3,8 миллиона. Этот подход намного быстрее, примерно на 120 мс. Для меня это прекрасное решение, за исключением одной вещи. Поскольку он отфильтровывает других членов группы, учитываются только фасеты из репрезентативного документа. Например, если у меня есть следующие три документа:

 "docs": [
  {
    "id": "1",
    "workId": "abc",
    "type": "book"
  },
  {
    "id": "2",
    "workId": "abc",
    "type": "ebook"
  },
  {
    "id": "3",
    "workId": "abc",
    "type": "ebook"
  }
]
  

после сворачивания в результатах отображается только верхний. Поскольку два других отфильтровываются, количество фасетов выглядит следующим образом

 "type": ["book":1]
  

вместо

 "type": ["book":1, "ebook":1]
  

Есть ли способ получить количество фасетов group.facet с помощью запроса фильтра свертывания?

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

1. Чарльз, просто интересно, нашел ли ты решение. Согласно коммиттеру, CollapsingQParserPlugin поддерживает количество фасетов, которые соответствуют «group.truncate», а не «group.facets». Я не думаю, что решение, предложенное @cpburnz, работает в этом случае. Я буду признателен, если вы поделитесь своими выводами.

Ответ №1:

Согласно Йонику Сили, правильное количество фасетов группы может быть собрано с помощью API фасетов JSON. Его комментарии можно найти по адресу:

https://issues.apache.org/jira/browse/SOLR-7036?focusedCommentId=15601789amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15601789

Я протестировал его метод, и он отлично работает. Я все еще использую CollapsingQParserPlugin для свертывания результатов, но я исключаю фильтр при подсчете фасетов следующим образом:

 fq={!tag=workId}{!collapse field=workId}

json.facet={
  type: {
    type: terms,
    field: type,
    facet: {
      workCount: "unique(workId)"
    },
    domain: {
      excludeTags: [workId]
    }
  }
}
  

И результат:

 {  
  "facets": {  
    "count": 3,
    "type": {  
      "buckets": [  
        {  
          "val": "ebook",
          "count": 2,
          "workCount": 1
        },
        {  
          "val": "book",
          "count": 1,
          "workCount": 1
        }
      ]
    }
  }
}
  

Ответ №2:

Я не смог найти способ сделать это с помощью конфигураций Solr или плагинов, поэтому я разработал обходной путь для эффективного создания групповых фасетов, все еще используя CollapsingQParserPlugin .

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

 "docs": [
  {
    "id": "1",
    "workId": "abc",
    "type": "book",
    "facetType": [
      "book",
      "ebook"
    ]
  },
  {
    "id": "2",
    "workId": "abc",
    "type": "ebook",
    "facetType": [
      "book",
      "ebook"
    ]
  },
  {
    "id": "3",
    "workId": "abc",
    "type": "ebook",
    "facetType": [
      "book",
      "ebook"
    ]
  }
]
  

Когда я прошу Solr сгенерировать количество фасетов, я использую новое поле:

 facet.field=facetType
  

Это гарантирует, что все значения фасета учтены и что подсчеты представляют группы. Но когда я использую запрос фильтра, я возвращаюсь к использованию старого поля:

 fq=type:book
  

Таким образом, выбирается правильный документ для представления группы.

Я знаю, что это грязный и сложный способ заставить его работать, но он работает, и это то, что мне было нужно. Также требуется возможность запрашивать ваши документы перед вставкой в Solr, что требует некоторой разработки. Если у кого-нибудь есть более простое решение, я все равно хотел бы его услышать.