Поиск в БД
Необходимо реализовать поиск в БД.
БД - MySQL и PgSQL
Работа с БД идет через адаптер.
Быстродействие поиска следует максимально оптимизировать.
Входные данные:
текстовую строка,
интервал дат создания записей (необязательный параметр),
область поиска - базисная компания, которой принадлежат записи справочников, входящие в область поиска (необязательный параметр)
Если в поисковом фильтре не задана компания, в базисе которой проводится поиск, то поиск выполняется в текущем базисе пользователя. получить из переменной CURRENT_PARTNER в сессии.
Выходные данные:
массив записей отсортированный по релевантности в порядке ее убывания
Описание поиска:
В результате поиска пользователю должен быть предоставлен набор записей из справочников системы, которые могут является объектами и/или документами системы (и те и другие - записи соответствующих справочников)
приоритет при выводе результатов имеют документы, т.е. записи о документах, которые непосредственно содержат искомые подстроки или же имеются таковые записи, ссылающиеся на эти документы.
пример: пользователь задает строку поиска в которой указывается наименование товара А полученного от поставщика Б. по факту создания записи о такой операции в в справочнике документов на приход товаров от поставщиков был создан документ оприходования B (т.е. запись документа имеет внутреннюю свзяь с записями о товаре А и поставщике Б)
в результате поиска система должна обнаружить:
* вхождение подстроки с наименованием товара А в запись о нем в справочнике товаров
* вхождение подстроки с наименованием подставщика Б в запись о нем в справочнике компаний
* связь записи о документе B с записями о товаре А и поставщике Б
В ходе сортировки полученного списка записей с учетом релевантности приоритет имеет запись о документе B и она попадает в верх списка, далее идут записи о товаре и поставщике (при прочих равных условиях они имеют одинаковую релевантность).
В случае если найден еще один документ Г, имеющий связь с товаром А, и другим поставщиком Д, то его релевантность меньше, в сравнении с документом В, т.к. он удовляетворяет только 1 искомой подстроке и выводится он в поисковом ответе вторым по очереди
Выборка записей при поиске выполняется по совпадению с поисковым запросом независимо от того в каком поле находится искомое значение, аналогично и нет зависимости от справочника, содержащего записи (если в условии поиска не задан таковой)
Реализация поиска:
метод адаптера + внешняя extjs-форма, вызываемая из любого модуля для задания условий поиска (фильтра). метод адаптера возращает набор id записей. сортировка записей в возращенном массиве в порядке релевантности поисковому запросу.
Оценка производительности:
Записи в справочниках в среднем имеют 10 полей. Поле записи может хранить свое значение в одном из 10 типов данных (значение должно быть проверено по всем типам). можно снизить нагрузку за счет поиска по сразу всем типам данных т.о.:
SELECT *
FROM property_value
WHERE (
f1 = 'подстрока' or
f2 = 'подстрока' or
..
fn = 'подстрока'
)
где f1..fn - перечень полей соответствующих хранимым типам данных
в дополнение к этому можно выполнять не последовательный поиск каждой из подстрок поискового запроса, а параллельно всех подстрок за один проход по полю записи.
Подробности при переписке.
Обязательно посмотрите приложенный файл.
Подробности при переписке.
skype mbarussia
200drive(at)gmail.com
В приват не пишите !!!!