Временное решение для группировки результатов поиска solr по полю коллекции - PullRequest
0 голосов
/ 12 октября 2019

Я новичок в Solr. Там могут быть ошибки. Сожалею. Я использую версию 7.7.1. Допустим, есть следующие документы:

{
  "documents": [
    {
      "id": 1,
      "category": [
        "a",
        "b"
      ],
      "score":0.10 //lucene score
    },
    {
      "id": 2,
      "category": [
        "b",
        "c",
        "d",
        "e"
      ],
      "score":0.20 //lucene score
    },
    {
      "id": 3,
      "category": [
        "a",
        "e"
      ],
      "score":0.30 //lucene score
    },
    {
      "id": 4,
      "category": [
        "d",
        "e"
      ],
      "score":0.40 //lucene score
    },
    {
      "id": 5,
      "category": [
        "a",
        "c"
      ],
      "score":0.50 //lucene score
    }
  ]
}

Основная задача следующая. Я получаю 3 или более разных категорий, и мне нужен только один документ с наибольшим количеством баллов для каждой категории. Другими словами, мне нужно сгруппировать результат по полю категории, каждая группа должна быть отсортирована по счету desc, а каждая группа должна быть ограничена 1.

Например, для полученных категорий a, b, c результат долженсодержит 3 документа

document with id == 5 for a category
document with id == 2 for b category
document with id == 5 for c category

Можно ли создать запрос solr для получения такого результата с одиночным запросом ?

Я пробовал следующие подходы, но они не помоглиили плохо работает:

  1. Группировка не рассматривается из-за того, что поле категории является коллекцией.

  2. Фасетка возвращает только количество результатов. Мне нужен полный документ.

  3. Есть возможность сделать запрос для каждой категории. Но одновременно может быть 50 категорий, и я думаю, что на выполнение 50 запросов в solr потребуется много времени.

1 Ответ

1 голос
/ 12 октября 2019

json.facet может быть полезным здесь. Вы можете использовать ниже запрос, и он даст вам ответ в соответствии с вашими потребностями. В этом запросе сначала создаются сегменты для поля категории, отсортированные в порядке возрастания, а затем вложенные сегменты идентификаторов, отсортированные с учетом значения lucene для запроса, прошедшего через параметр " qq ".

Я использовал функциональный запрос, который мы используем, чтобы оценить количество люценов для данного запроса. Пока это простой запрос, но вы также можете создать комплекс и передать его в параметр qq. Прочитайте здесь: - https://lucene.apache.org/solr/guide/6_6/function-queries.html не получите больше информации о функциональных запросах.

q=*&qq=category:a&json.facet={
categories:{
    type:terms,
    field:category,
    sort:{index:asc},
    facet:{
        id:{
            type:terms,
            field:id,
            sort:"query_score desc",
            facet:{
                query_score:"min(if(exists(query($qq)),query($qq),0))"
            }
        }
    }
}

}

[ Ответ на вышеуказанный запрос ]

{
  "responseHeader":{
    "status":0,
    "QTime":7,
    "params":{
      "qq":"category:a",
      "q":"*",
      "json.facet":"{ categories:{ type:terms, field:category, sort:{index:asc}, facet:{ id:{ type:terms, field:id, sort:\"query_score desc\", facet:{ query_score:\"min(if(exists(query($qq)),query($qq),0))\" } } } } }",
      "indent":"on",
      "fl":"*,query($qq,-1)",
      "rows":"0",
      "wt":"json"}},
  "response":{"numFound":5,"start":0,"docs":[]
  },
  "facets":{
    "count":5,
    "categories":{
      "buckets":[{
          "val":"a",
          "count":3,
          "id":{
            "buckets":[{
                "val":"1",
                "count":1,
                "query_score":0.5389965176582336},
              {
                "val":"3",
                "count":1,
                "query_score":0.5389965176582336},
              {
                "val":"5",
                "count":1,
                "query_score":0.5389965176582336}]}},
        {
          "val":"b",
          "count":2,
          "id":{
            "buckets":[{
                "val":"1",
                "count":1,
                "query_score":0.5389965176582336},
              {
                "val":"2",
                "count":1,
                "query_score":0.0}]}},
        {
          "val":"c",
          "count":2,
          "id":{
            "buckets":[{
                "val":"5",
                "count":1,
                "query_score":0.5389965176582336},
              {
                "val":"2",
                "count":1,
                "query_score":0.0}]}},
        {
          "val":"d",
          "count":2,
          "id":{
            "buckets":[{
                "val":"2",
                "count":1,
                "query_score":0.0},
              {
                "val":"4",
                "count":1,
                "query_score":0.0}]}},
        {
          "val":"e",
          "count":3,
          "id":{
            "buckets":[{
                "val":"3",
                "count":1,
                "query_score":0.5389965176582336},
              {
                "val":"2",
                "count":1,
                "query_score":0.0},
              {
                "val":"4",
                "count":1,
                "query_score":0.0}]}}]}}}

Для получения дополнительной информации о json.facet: - https://lucene.apache.org/solr/guide/7_2/json-facet-api.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...