Поиск по связанным индексам на Алголии

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

У меня есть следующая структура для моих индексов:

  • Публикация (атрибуты: id, title, keywords)
  • PublicationFile (атрибуты: id, publication_id, text, page_number)

Публикация имеет много файлов публикации, файл публикации содержит содержимое файла и страницу, на которой он был найден (text и page_number).

title, keywords и text являются доступными для поиска атрибутами, поэтому, если кто-то ищет «экономика», я хочу выполнить поиск по обоим моим индексам.

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

Publication1 keyword1 keyword2 Found results in Publication1's file contents in: [file a (pages: 1, 2, 3), file b (pages: 5)]

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

В общем, мои вопросы:

  1. Есть ли способ структурировать свои данные, чтобы избежать вложенных циклов для их обработки?
  2. Есть ли способ сделать это через Algolia без изменения моей структуры? В идеале я хотел бы повторно использовать поисковый код внешнего интерфейса Algolia и избегать обработки этих данных в моем внутреннем интерфейсе.

person Omar Bahareth    schedule 31.01.2017    source источник


Ответы (1)


Чтобы ответить на ваши вопросы:

1) Да, я расскажу подробнее ниже

2) Нет, к сожалению, нет, вам придется изменить структуру данных.


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

{
  objectID: "publicationFieIdId",
  publicationId: '',
  title: '',
  keywords: ['', ''],
  text: "",
  page_number: 1,
  published_at: 1485892992 // timestamp
}

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

Несколько статей или ссылок на документацию, которые могут быть полезны, чтобы объяснить, почему:

https://blog.algolia.com/inside-the-engine-part-7-better-relevance-via-dedup-at-query-time/

https://www.algolia.com/doc/guides/search/distinct/< /а>

Надеюсь это поможет!

Максим

person Maxime    schedule 31.01.2017
comment
Спасибо! это действительно помогает, мне просто нужно найти способ, чтобы данные не превышали 10 КБ на запись. - person Omar Bahareth; 01.02.2017
comment
На самом деле, повторяя это снова, мне все равно придется использовать свой сервер для обработки данных для отображения в той же структуре, что и в примере в моем вопросе, верно? Таким образом, похоже, что нет способа избежать этой части, но как мне разбить данные на страницы, если я их обрабатываю? Я хочу, чтобы в результатах поиска отображались публикации и имена файлов/номера страниц, в которых были найдены результаты. Основным элементом результата является публикация, а совпадения файлов рассматриваются как подэлементы. - person Omar Bahareth; 01.02.2017
comment
Я так и не смог получить именно то, что хотел, но дедупликация с использованием идентификатора файла позволила мне отображать совпадения как в виде публикации, так и в виде файла. Я также поместил их в один индекс, аналогичный сообщению в блоге, на которое вы ссылаетесь, я использовал record_type и record_priority, чтобы отсортировать результаты таким образом, который имеет смысл для моего варианта использования. Я не получил из вашего ответа именно то, что мне было нужно (и, как вы сказали, это пока не представляется возможным), но ваш ответ был лучшим компромиссом в моем случае. Большое спасибо. - person Omar Bahareth; 10.02.2017