Полнотекстовый поиск по многим таблицам - PullRequest
2 голосов
/ 30 апреля 2010

У меня есть три таблицы, каждая из которых имеет столбец с полнотекстовым индексом. Пользователь вводит условия поиска в одно текстовое поле, а затем будут выполняться поиск по всем трем таблицам.

Это лучше объяснить на примере:

documents
  doc_id
  name FULLTEXT

table2
  id
  doc_id
  a_field FULLTEXT

table3
  id
  doc_id
  another_field FULLTEXT

(я понимаю, что это выглядит глупо, но это потому, что я удалил все остальные поля и таблицы, чтобы упростить его).

Таким образом, в основном я хочу выполнить полнотекстовый поиск по name, a_field и another_field, а затем показать результаты в виде списка documents, предпочтительно с указанием причины, по которой был найден этот документ, например, если another_field соответствует, я бы отобразил, что такое another_field.

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

search_results
  table_name
  row_id
  score

(позже это можно сделать для кэширования результатов на несколько дней, например, с помощью хэша поисковых терминов).

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

Во-вторых, анализ результатов затруднен. Я хочу отобразить список документов, но не сразу знаю doc_id без какого-либо соединения; однако таблица, к которой нужно присоединиться, зависит от столбца table_name, и я не уверен, как этого добиться.

Желание искать несколько похожих таблиц должно быть обычным делом, поэтому я думаю, что я спрашиваю, правильно ли я подхожу к этому? Может кто-нибудь сказать мне лучший способ сделать это, пожалуйста.

1 Ответ

1 голос
/ 30 апреля 2010

Я бы создал денормализованный одиночный индекс. Т.е. поместите все три типа документов в одну таблицу с полями для doc_id, doc_type и одного полнотекстового блока. Затем вы можете искать все три типа документов одновременно.

Вы также можете обнаружить, что Lucene будет иметь смысл в этой ситуации. Это дает вам более быстрый поиск, а также намного больше функциональности в отношении того, как работает поиск и оценка.

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

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