Elasticsearch - выводит документы с разными значениями в начало результатов - PullRequest
0 голосов
/ 18 июня 2019

Допустим, например, у меня есть индекс «книги», и у каждой книги есть author_id.Поскольку авторов всего несколько, идентификаторы авторов будут часто повторяться по всем книгам.Книги в моем указателе выглядят примерно так:

{
    "title": "Elasticsearch for dummies",
    "author_id": 1,
    "purchases": 10
},
{
    "title": "Great book",
    "author_id": 1,
    "purchases": 5
},
{
    "title": "Great book 2",
    "author_id": 1,
    "purchases": 8
},
{
    "title": "My cool book",
    "author_id": 2,
    "purchases": 14
},
{
    "title": "Interesting book title",
    "author_id": 2,
    "purchases": 20
},
{
    "title": "amazing book",
    "author_id": 2,
    "purchases": 16
},
{
    "title": "Silly Walks vol II",
    "author_id": 3,
    "purchases": 13
},
{
    "title": "Wild animals you can pet",
    "author_id": 3,
    "purchases": 5
},
{
    "title": "GoT Spoilers",
    "author_id": 3,
    "purchases": 4
}

Представьте, что есть тысячи книг и всего 50 авторов.Если я сортирую только по покупкам, я получу страницу результатов, на которой показаны книги только одного или двух авторов.Мне нужно, чтобы в результатах было представлено как можно больше авторов.Есть ли какая-нибудь комбинация function_score + script_score, которую я могу использовать для достижения этой цели?Я попытался поэкспериментировать с Math.exp в безболезненном сценарии, но безрезультатно.

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Вы можете использовать агрегацию терминов, чтобы сделать "группировать по" результатам по author_id с комбинацией агрегирования tophits, чтобы получить только несколько результатов для каждого автора. Итак, что-то вроде этого должно дать список авторов, упорядоченных по книге, с максимальным количеством покупок, где у каждого автора есть корзина с макс. 3 книгами, которые он написал, упорядоченные по количеству покупок.

aggs: {
  authors: {
    terms: {
      field: 'author_id',
      order: { max_purchases: desc }
    },
    aggs: {
      books: {
       top_hits: {
        size: 3, 
        _source: {include: ['title', 'purchases']},  
        sort: [{purchases: {order: desc  } }] 
       },
       max_purchase : { max : { field : purchases}}
      }
  }
}

0 голосов
/ 22 июня 2019

Итак, я использовал Свертывание полей , которое в основном позволяет вам делать регулярные запросы и «свернуть» результаты, основанные на определенном поле.Таким образом, вместо того, чтобы иметь каждый из ваших результатов один за другим, у вас есть лучший результат для каждого отдельного значения в этом поле.Затем вы можете использовать inner_hits, чтобы получить список из n сообщений для каждого отдельного значения, и вы можете использовать from / size для разбивки на страницы каждой группы.

0 голосов
/ 18 июня 2019

Вы можете использовать cardinality метрику, чтобы получить уникальный счет из данных эластичного поиска.

Ниже может помочь ссылка - https://www.elastic.co/guide/en/elasticsearch/guide/master/cardinality.html

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