Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Поиск с использованием логических правил / 10 сообщений из 10, страница 1 из 1
05.08.2004, 16:25
    #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
05.08.2004, 16:51
    #32637417
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск с использованием логических правил
думаю это поможет э литл бит

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

и т.д.

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

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

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

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

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

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

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

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

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

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

где id индесированное поле, то поиск не будет индексированным?
...
Рейтинг: 0 / 0
06.08.2004, 12:46
    #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
06.08.2004, 19:58
    #32639309
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск с использованием логических правил
--то можно не дождаться окончания его выполнения... (я не дождался:)

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

может таки лучше читать страницы через серверные курсоры - как это все делают?
...
Рейтинг: 0 / 0
07.08.2004, 15:29
    #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]