Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
О чем идет речь: Я пишу дипломный проект, в рамках которого нужно создать некую базу данных, содержащую множество статей, и поисковую машину к этой базе. По не зависящим от меня причинам, использую связку InterBase + PHP. Статьи регулярно поступают в базу, причем, при занесении новой статьи, происходит разбиение ее текста на отдельные слова, то есть индексация для последующего поиска. Поиск же происходит по ключевым словам, соединенным логическими операциями "И", "ИЛИ", "НЕ". Например, результатом поиска по выражению " (слово1 или слово2) и не слово3 " очевидно будут статьи в которых содержатся слово1 или слово2 и не содержится слово3. Как происходит поиск: Входной пользовательский запрос " (слово1 или слово2) и не слово3 " я преобразую в обратную польскую запись " {слово1}{слово2}<или>{слово3}<не><и> ". Затем делаю проход по этой записи. шаг 1: нахожу id статей, в которых встречается "слово1", преобразую полученый "рекордсет" в массив, и заношу этот массив в стек операндов шаг 2: то же самое для "слово2" шаг 3: встретив операцию "или", объединяю два массива из стека и получившийся массив заношу опять же в стек. ... и далее в таком же духе. Причем при обработке операции "НЕ" приходится создавать массив id всех статей и из него исключать элементы массива id статей, в которых содержится слово - аргумент "НЕ"... во как заморочено все В общем, без использования операции "НЕ" поиск происходит довольно быстро, но, при большом (десятки тысяч) количестве записей в таблице статей, этот способ поиска будет работать весьма неэффективно. Господа! Может быть, кто-нибудь сталкивался с подобной задачей и подскажет более быстрый, надежный и эффективный способ решения? Буду очень вашим советам и размышлениям по этому поводу! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2004, 16:25 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
думаю это поможет э литл бит /topic/52569&hl=%ef%e0%ef%e0+%ec%e0%ec%e0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2004, 16:51 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
там пришли к выводу, что правильно использовать select то-че-надо from откуда_нужно where id in (слово_1) and/or/not id in (слово_2) и т.д. Но на сколько-нибудь реальных объемах данных (сотни тысяч статей, которые следует индексировать), это imho будет работать медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2004, 17:35 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
я проверял на полумиллионе индексированных слов - мeньше секунды занимает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2004, 22:00 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
>Господа! Может быть, кто-нибудь сталкивался с подобной задачей и подскажет более быстрый, надежный и эффективный способ решения? Мы сталкивались. Если поддерживаются вложенные подзапросы, то можно сделать одним запросом, будет быстрее. Но в интербейзе по-моему встроенные подзапросы не поддерживаются. Совет. OR почему-то работает очень медленно (sybase ASA, MSSQL сервер, наверное и у других тоже), такие запросы лучше записывать как union all, с ним проблем нет, если поддерживается конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2004, 01:11 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
>>>> OR почему-то работает очень медленно А с чего ему работать быстро, если он исключает использование индексов и переходит на полное сканирование таблицы. Best wishes, ------------------------------- Kovalevsky Oleg Polarnet Ltd Moscow, Russia ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2004, 10:24 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
авторя проверял на полумиллионе индексированных слов не знаю какую информацию предполагается закладывать в базу, но проведем небольшие подсчеты: предположим в базу кладутся некие записи со средним количеством слов - 100. Это примерно 10-12 предложений человека с развитой речью. Полмилиона делим на 100 слов, получаем 5000 записей. А автор говорил о десятках тысяч. авторА с чего ему работать быстро, если он исключает использование индексов и переходит на полное сканирование таблицы Э... не очень понял :( Если я пишу Код: plaintext 1. 2. 3. где id индесированное поле, то поиск не будет индексированным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2004, 12:18 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
Допустим, требуется обрабатывать приблизительно 20 000 статей. Статья в среднем содержит 200 индексированных слов. То есть в таблице индексов индексов будет около 4 000 000 записей. И, если использовать запрос типа: Код: plaintext то можно не дождаться окончания его выполнения... (я не дождался:) Кстати, статей предполагается даже не 20 000, а сотни тысяч! Может быть есть какие-то альтернативные пути? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2004, 12:46 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
--то можно не дождаться окончания его выполнения... (я не дождался:) а зачем вам рекордсет с милионнами записей ? может таки лучше читать страницы через серверные курсоры - как это все делают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2004, 19:58 |
|
||
|
Поиск с использованием логических правил
|
|||
|---|---|---|---|
|
#18+
To Calm: Возможны вариации, но в большинстве случаев будет сканирование. Причем вариант SELECT id FROM mytable WHERE id IN (1, 2) поддается хорошей оптимизации Best wishes, ------------------------------- Kovalevsky Oleg Polarnet Ltd Moscow, Russia ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2004, 15:29 |
|
||
|
|

start [/forum/topic.php?fid=32&tid=1546327]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 392ms |

| 0 / 0 |
