Searchkick: область импорта с групповым предложением

Я пытаюсь сгруппировать фрагменты страницы по типу и агрегировать html-контент. Вот как выглядит моя область импорта поиска:

scope :search_import, -> {
  select("kind, string_agg(html_content, '\r\n') AS html_content")
  .group(:kind)
}

Когда я пытаюсь переиндексировать записи, searchkick использует find_in_batches, который автоматически устанавливает порядок по возрастанию для первичного ключа, чтобы упорядочивание пакетов работало. Это приводит меня к следующей ошибке: column "page_fragments.id" must appear in the GROUP BY clause or be used in an aggregate function.

Ясно, что я не могу добавить id в предложение группы, и я попытался обойти это, добавив агрегацию id в select: COUNT (*) AS id. Однако четкое указание первичного ключа "page_fragments"."id" в предложении порядка пропускает псевдоним.

Вопрос в том, что можно сделать? Похоже на тупик.


person peresleguine    schedule 14.11.2017    source источник


Ответы (2)


Что вы пытаетесь сделать со своим search_import прицелом? В документах searchkick указано, что он предназначен для охвата записей, которые вы хотите проиндексировать, и поэтому должен возвращать хэш ActiveRecord::Relation, а не group.

Searchkick использует find_in_batches для импорта документов. Для быстрой загрузки ассоциаций используйте область поиска search_import.

...

По умолчанию индексируются все записи. Чтобы контролировать, какие записи индексируются, используйте параметр should_index? вместе с областью поиска search_import.

person Daniel Westendorf    schedule 14.11.2017
comment
Идея состоит в том, чтобы изменить данные, которые должны быть проиндексированы. Я пытаюсь сгруппировать фрагменты страниц по типу и объединить их содержимое, поскольку это была модель страницы. Я подумал, что можно было бы имитировать id для сгруппированных записей, поскольку цепочка group также отвечает на метод find_in_batches. - person peresleguine; 15.11.2017
comment
Этот вариант использования не совсем соответствует тому, что делает Searchkick. Searchkick предназначен для индексации отдельных записей, а не сгруппированных и объединенных данных. Вы должны создать/обслуживать свои собственные индексы с помощью github.com/elastic/elasticsearch-ruby - person Daniel Westendorf; 15.11.2017

В итоге я создал отдельную модель PageFragmentAgg и добавил обратные вызовы в PageFragment, чтобы перестроить конкатенированные данные, которые должны быть проиндексированы.

person peresleguine    schedule 08.12.2017