powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Поиск с использованием логических правил
10 сообщений из 10, страница 1 из 1
Поиск с использованием логических правил
    #32637352
Фотография FromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем идет речь:
Я пишу дипломный проект, в рамках которого нужно создать некую базу данных, содержащую множество статей, и поисковую машину к этой базе.

По не зависящим от меня причинам, использую связку InterBase + PHP.

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

Поиск же происходит по ключевым словам, соединенным логическими операциями "И", "ИЛИ", "НЕ".
Например, результатом поиска по выражению " (слово1 или слово2) и не слово3 " очевидно будут статьи в которых содержатся слово1 или слово2 и не содержится слово3.

Как происходит поиск:
Входной пользовательский запрос
" (слово1 или слово2) и не слово3 "
я преобразую в обратную польскую запись
" {слово1}{слово2}<или>{слово3}<не><и> ".
Затем делаю проход по этой записи.

шаг 1: нахожу id статей, в которых встречается "слово1", преобразую полученый "рекордсет" в массив, и заношу этот массив в стек операндов
шаг 2: то же самое для "слово2"
шаг 3: встретив операцию "или", объединяю два массива из стека и получившийся массив заношу опять же в стек.
...
и далее в таком же духе. Причем при обработке операции "НЕ" приходится создавать массив id всех статей и из него исключать элементы массива id статей, в которых содержится слово - аргумент "НЕ"... во как заморочено все

В общем, без использования операции "НЕ" поиск происходит довольно быстро, но, при большом (десятки тысяч) количестве записей в таблице
статей, этот способ поиска будет работать весьма неэффективно.

Господа! Может быть, кто-нибудь сталкивался с подобной задачей и подскажет более быстрый, надежный и эффективный способ решения?

Буду очень вашим советам и размышлениям по этому поводу!
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32637417
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю это поможет э литл бит

/topic/52569&hl=%ef%e0%ef%e0+%ec%e0%ec%e0
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32637470
Фотография Calm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там пришли к выводу, что правильно использовать
select то-че-надо
from откуда_нужно
where
id in (слово_1)
and/or/not
id in (слово_2)

и т.д.

Но на сколько-нибудь реальных объемах данных (сотни тысяч статей, которые следует индексировать), это imho будет работать медленно.
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32637723
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я проверял на полумиллионе индексированных слов - мeньше секунды занимает
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32637817
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Господа! Может быть, кто-нибудь сталкивался с подобной задачей и подскажет более быстрый, надежный и эффективный способ решения?

Мы сталкивались. Если поддерживаются вложенные подзапросы, то можно сделать одним запросом, будет быстрее. Но в интербейзе по-моему встроенные подзапросы не поддерживаются.

Совет. OR почему-то работает очень медленно (sybase ASA, MSSQL сервер, наверное и у других тоже), такие запросы лучше записывать как union all, с ним проблем нет, если поддерживается конечно.
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32638081
Kovalevsky Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>>> OR почему-то работает очень медленно

А с чего ему работать быстро, если он исключает использование индексов и переходит на полное сканирование таблицы.

Best wishes,
-------------------------------
Kovalevsky Oleg
Polarnet Ltd
Moscow, Russia
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32638377
Фотография Calm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя проверял на полумиллионе индексированных слов

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

предположим в базу кладутся некие записи со средним количеством слов - 100. Это примерно 10-12 предложений человека с развитой речью.

Полмилиона делим на 100 слов, получаем 5000 записей. А автор говорил о десятках тысяч.

авторА с чего ему работать быстро, если он исключает использование индексов и переходит на полное сканирование таблицы
Э... не очень понял :(

Если я пишу
Код: plaintext
1.
2.
3.
select id
from mytable
where
  id= 1  OR id= 2 

где id индесированное поле, то поиск не будет индексированным?
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32638453
Фотография FromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, требуется обрабатывать приблизительно 20 000 статей.
Статья в среднем содержит 200 индексированных слов.
То есть в таблице индексов индексов будет около 4 000 000 записей.
И, если использовать запрос типа:
Код: plaintext
SELECT txt FROM t_doc WHERE\n    id     in ( select t_idx.doc from t_idx inner join t_word on t_idx.word=t_word.id where t_word.word in ( \'a1\', \'a2\' ))\nand id     in ( select t_idx.doc from t_idx inner join t_word on t_idx.word=t_word.id where t_word.word = \'b1\' )\nand id     in ( select t_idx.doc from t_idx inner join t_word on t_idx.word=t_word.id where t_word.word = \'b2\' )\nand id not in ( select t_idx.doc from t_idx inner join t_word on t_idx.word=t_word.id where t_word.word in ( \'c1\', \'c2\' ))\n
см. /topic/52569&hl=%ef%e0%ef%e0+%ec%e0%ec%e0
то можно не дождаться окончания его выполнения... (я не дождался:)

Кстати, статей предполагается даже не 20 000, а сотни тысяч!

Может быть есть какие-то альтернативные пути?
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32639309
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--то можно не дождаться окончания его выполнения... (я не дождался:)

а зачем вам рекордсет с милионнами записей ?

может таки лучше читать страницы через серверные курсоры - как это все делают?
...
Рейтинг: 0 / 0
Поиск с использованием логических правил
    #32639565
Kovalevsky Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Calm: Возможны вариации, но в большинстве случаев будет сканирование. Причем вариант

SELECT id FROM mytable WHERE id IN (1, 2)

поддается хорошей оптимизации

Best wishes,
-------------------------------
Kovalevsky Oleg
Polarnet Ltd
Moscow, Russia
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Поиск с использованием логических правил
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]