- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как удалить плохие SEO-ссылки и очистить ссылочную массу сайта
Применяем отклонение ссылок
Сервис Rookee
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Доброго времени суток ;)
Возникло много вопросов по организации и выполнения поиска по инверсному индексу.
1) Где можно почитать про способы организации и хранения такого индекса? Если не сложно, то ссылки на статьи/публикации были бы очень кстати. Есть ли готовые решения? Ведь реализация хранения в файлах при помощи Б-деревьев с "нуля" - трудоемкая задача, т.к. нужно учитывать ограничение на рамер файлов, да и делать уйму работы, которая уже сделана до меня.
2) Очень интересно, каким образом эффективно выполнять поиск для запроса, в которым между словами стоит лог. связка "И". Насколько я понимаю, инверсный индекс позволяет быстро находить индекс документа, в котором встречается одно из слов запроса. Для нахождения результатов многословного запроса (связка И) прийдется находить пересечение множеств всех результатов по каждому из слов. Какие существуют эфффективные алгоримы решения? Сливать все идентификаторы документов (по каждому из слов) в кучу, сортировать и делать фильтрацию? Но ведь по каждому из слов это может быть несколько миллионов докуметов...
3) Ну и, наконец, больше всего интересует, как правильно сделать поиск на точное вхождение ("поиск в кавычках"). Тут пока никаких идей...
4) Кстати проблема реализации быстрых алгоритмов ранжирования - тоже актуальна для меня. Например, как быстро выполнить ранжирование в зависимости от расстояний между словани, их веса. как это все вяжеться с инверсным индексом.
Если, кто-то уже нашел ответы на эти вопросы, то буду очень признателен.
Возникло много вопросов по организации и выполнения поиска по инверсному индексу.
1) Где можно почитать про способы организации и хранения такого индекса? Если не сложно, то ссылки на статьи/публикации были бы очень кстати.
читайте литературу - например, рекомендованную И.Сегаловичем.
Сейчас весьма популярны алгоритмы аналогичные описанным Ricardo Baeza-Yates.
Есть ли готовые решения? Ведь реализация хранения в файлах при помощи Б-деревьев с "нуля" - трудоемкая задача, т.к. нужно учитывать ограничение на рамер файлов, да и делать уйму работы, которая уже сделана до меня.
2) Очень интересно, каким образом эффективно выполнять поиск для запроса, в которым между словами стоит лог. связка "И". Насколько я понимаю, инверсный индекс позволяет быстро находить индекс документа, в котором встречается одно из слов запроса. Для нахождения результатов многословного запроса (связка И) прийдется находить пересечение множеств всех результатов по каждому из слов. Какие существуют эфффективные алгоримы решения? Сливать все идентификаторы документов (по каждому из слов) в кучу, сортировать и делать фильтрацию? Но ведь по каждому из слов это может быть несколько миллионов докуметов...
не хотите программировать современные схемы - пользуйтесь стандартными базами данных, например, Oracle, где эти проблемы решены до Вас и за Вас
пересекут миллионы документов, проблема с использованием баз данных - тяжело держать много пользователей одновременно
кстати, для действительно многословного запроса не стоит все слова добавлять через "И", если Вас интересует только релевантность
3) Ну и, наконец, больше всего интересует, как правильно сделать поиск на точное вхождение ("поиск в кавычках"). Тут пока никаких идей...
если имеет в виду поиск по одному слову - очевидно - храните и словоформы
если имеется в виду поск по подстроке - см. п.1 - там это есть
Во-первых, огромное спасибо за компетентный ответ, а, во-вторых, разрешите задать еще несколько новых вопросов :)
читайте литературу - например, рекомендованную И.Сегаловичем.
Если можно ссылку на сообщение с рекоммендованной лит-рой, буду очень признателен.
Сейчас весьма популярны алгоритмы аналогичные описанным Ricardo Baeza-Yates.
Есть идеи, где можно взять эту книгу в электронном варианте? По приведенной ссылке - только название книги ;)
Кстати, для хранения инверсного индекса ведь можно применит формат хранения BerkleyDB? Кто-то уде так делал или это мои фантазии? ;) Единственно не ояень понятно, как обрабатывать конкурентные запросы (особенно одновременно чтение и модификация)
кстати, для действительно многословного запроса не стоит все слова добавлять через "И", если Вас интересует только релевантность
Спасибо, учту. Насчет ранжирования по релевантности - это тоже к п.1 ?
если имеет в виду поиск по одному слову - очевидно - храните и словоформы
если имеется в виду поск по подстроке - см. п.1 - там это есть
Нет, поиск - по исходной словоформе - тут как раз все понятно. Меня интересует имеено поиск по фразе.
Кстати, насчет БД. Если есть опят использования СУБД в качестве "сердца" поискавика - поделитесь опытом. Каие ограничения на размер индекса, узкие места в производительности.
Есть идеи, где можно взять эту книгу в электронном варианте? По приведенной ссылке - только название книги ;)
eMule вам поможет. Там вообще много книжек найти можно.
Есть идеи, где можно взять эту книгу в электронном варианте? По приведенной ссылке - только название книги ;)
Вам уже Interitus ответил....
Но мой ответ - купить. У Вас какой бюджет? Потратить на нужные книжки 30-300 баксов - обязательно!
Кстати, для хранения инверсного индекса ведь можно применит формат хранения BerkleyDB? Кто-то уде так делал или это мои фантазии? ;) Единственно не ояень понятно, как обрабатывать конкурентные запросы (особенно одновременно чтение и модификация)
Вы чего хотите - сделать что-нибудь или супер-пупер?
Если что-нибудь - хоть контектным поиском по файлам.
Если правильно - как сказано...
Спасибо, учту. Насчет ранжирования по релевантности - это тоже к п.1 ?
См. также статьи Яндекса в РОМИП и статьи М.Губина в RCDL.
Кстати, насчет БД. Если есть опят использования СУБД в качестве "сердца" поискавика - поделитесь опытом. Каие ограничения на размер индекса, узкие места в производительности.
ограничений на размер индекса нет.
Узкие места - это универсальные продукты, следовательно несколько хуже в специальных условиях - например, ORACLE любит хапать все ресурсы для "оптимального" ответа на запрос - это плохо для обслуживания большого числа "одновременных" запросов.
Зато есть и преимущества - поисковик это не только "сердце"...
Если что-нибудь - хоть контектным поиском по файлам.
любая БД (хоть на мускуле) вытянет 18 миллионов запросов в сутки(а э
то уже не что нибудь), если конечно железяки с каналом вытянут
любая БД (хоть на мускуле) вытянет 18 миллионов запросов в сутки(а э
то уже не что нибудь), если конечно железяки с каналом вытянут
да, наверное, для простых запросов, однако, для поиска по нескольким словам, когда надо еще сортировать результаты...
(особенно, при допущении развитого языка запросов со скобками, логическими операторами и т.п., что сильно удлиняет SQL запрос)
может быть, я чего не понимаю, однако, средний размер документа в больших базах (только текст) около 4 Кбайт. Это порядка 300 разных лемм на документ.
хотел бы я посмотреть на ОДИН сервер, который сможет помещать и пересекать в оперативной памяти выборки для частотных слов, для базы, скажем на 10 миллионов документов (около 3 Г записей, не менее 30 Гбайт индекса) хранимую в реляционной форме. Важно, что основной индекс не может быть целиком засунут в оперативную память.
(я-то лично сомневаюсь, что кроме Oracle это, вообще, что-нибудь потянет)
поглядев на потолок, беру оттуда формулу для типичного сервера реляционной базы данных:
количество выполняемых (поиск и ранжирование) запросов в день
равно
10*количество долларов стоимости железа
поделить на
количество документов в миллионах
(можно помножить, или поделить на три)
естесственно нагрузку надо распределять. по моему вообще поиск с помощью одной машины ( пусть даже супер пупер) можно производить для каких нибудь локальных целей. конечно оракля нужна, нужно распределять запрос по разным серверам по принципу "ухо-мозг-рот".
Посмотрел литературу, многое почерпнул ;)
Но все же остались и белые пятна.
Во-первых все тот же поиск подстроки в кавычках. Его можно делать конечно и по индексу, отфильтровуя и оставляя в пост-листе (объединенном по "И" для всех поисковых терминов) только те документы, в которых слова расположены рядом. Это единственный способ? Не будет ли он слишком медленным - просматривать все документы на предмет нахождения слов рядом.
Далее, интересно как же все-таки лучше организовать инвертированный индекс. Можно сделать Б+-деревом, а ведь можно и полностью лексикон (словарь) сохранить в памяти со ссылками на пост-листы для каждого слова лексикона. Что является правильным для поисковика?
Ну и наконец как правильно индексировать изменяющиеся документы. Ведь перед переиндексацией следует удалить все предыдущие ссылки на документ в пост-листах, но т.к. инвертированный индекс предназначен только для поиска по вхождениям терминов - сделать это будет проблематично. Как вариант - держать 2 представления для индексатора и поисковика (прямой и обратный индекс соответственно), но преобразование всего индекса из прямой формы в обратную очень трудоемо и вряд ли подойдет для реальной поисковой системы. Подскажите, как быть?
Посмотрел литературу, многое почерпнул ;)
Но все же остались и белые пятна.
Во-первых все тот же поиск подстроки в кавычках. Его можно делать конечно и по индексу, отфильтровуя и оставляя в пост-листе (объединенном по "И" для всех поисковых терминов) только те документы, в которых слова расположены рядом. Это единственный способ? Не будет ли он слишком медленным - просматривать все документы на предмет нахождения слов рядом.
Далее, интересно как же все-таки лучше организовать инвертированный индекс. Можно сделать Б+-деревом, а ведь можно и полностью лексикон (словарь) сохранить в памяти со ссылками на пост-листы для каждого слова лексикона. Что является правильным для поисковика?
Ну и наконец как правильно индексировать изменяющиеся документы. Ведь перед переиндексацией следует удалить все предыдущие ссылки на документ в пост-листах, но т.к. инвертированный индекс предназначен только для поиска по вхождениям терминов - сделать это будет проблематично. Как вариант - держать 2 представления для индексатора и поисковика (прямой и обратный индекс соответственно), но преобразование всего индекса из прямой формы в обратную очень трудоемо и вряд ли подойдет для реальной поисковой системы. Подскажите, как быть?
1. Вы так и не сказали цели Ваших изысканий (построение супер-поисковика по неструктурированным документам, просто образование, решение корпоративной задачи и т.д.) В зависимости от посылок ответы совершенно разные.
2. По сути вопросов:
(a) обязательно читать Дональда Кнута (Вам будет интересен 3 том, но без остальных - никуда :)
(б) По поводу "кавычек" (почему именно кавычек? синтаксис запроса может быть любым... но однозначным) в индексе неструктурированных документов хранится и координатная информация, отнесенная к каждому термину. В процессе выполнения логических операций в этом же месте производится сравнение ближайшего расстояния. Для кавычек оно должно быть 1. Координатка может быть устроена совсем просто (типа номер вхождения), а может и сложно (типа номер абзаца-номер предложения-номер во фразе-позиция во фразе 🚬 )
(с) инверсный индекс организовать можно и так и так - все зависит от разработчика и задач. Надо помнить, что существует масса "несловарных" терминов типа КТ315, ММВБ, 666 (шайтан :) , многие авторы специально каверкают слова) и пр.
вы будете обязаны их по образу и подобию занести в свои листы знаний.
(д) как обновляется индекс - у каждого свое ноу-хау. Простейший прием - полное перестроение по сырым документам. Для большого интернет-енджина непреемлимо. Инкриментальность у каждого своя.
(е) подумайте - а оно Вам надо. Подход типа: расскажите мне, как сделать, а я уж напрограммирую - неприемлим т.к. рассказ - это 90% успеха (ничего личного)
Очень благодарен вам за ответ, на самом деле мне просто необходимо понять насколько мои идеи адекватны тому, что существует на сегодяншний день
1. Вы так и не сказали цели Ваших изысканий (построение супер-поисковика по неструктурированным документам, просто образование, решение корпоративной задачи и т.д.) В зависимости от посылок ответы совершенно разные.
Цель - исключительно образовательная. Ничего коммерческого. Поиск подразумевается делать по неструктурировнным документам. Насчет супер-пуппер - не знаю, это уже как оплучится ;)
2. По сути вопросов:
(a) обязательно читать Дональда Кнута (Вам будет интересен 3 том, но без остальных - никуда :)
(б) По поводу "кавычек" (почему именно кавычек? синтаксис запроса может быть любым... но однозначным) в индексе неструктурированных документов хранится и координатная информация, отнесенная к каждому термину. В процессе выполнения логических операций в этом же месте производится сравнение ближайшего расстояния. Для кавычек оно должно быть 1. Координатка может быть устроена совсем просто (типа номер вхождения), а может и сложно (типа номер абзаца-номер предложения-номер во фразе-позиция во фразе 🚬 )
Да но как тогда быть с шумовыми стоп-словами? Ведь они в индексе отсутствуют и соответсвенно запрос "Петя и Вася" не может быть выполнен в силу отсутствия "и" в индексе. Выход - индексировать все слова, включая стоп-слова?
(с) инверсный индекс организовать можно и так и так - все зависит от разработчика и задач. Надо помнить, что существует масса "несловарных" терминов типа КТ315, ММВБ, 666 (шайтан :) , многие авторы специально каверкают слова) и пр.
вы будете обязаны их по образу и подобию занести в свои листы знаний
Я задумывался над этим и вряд ли возможным будет хранение всего разнообразия лексем в ОЗУ, т.к. тут будут и числа и разнообразные сокращения, аббревиатуры и проч, как вы правильно написали.
(д) как обновляется индекс - у каждого свое ноу-хау. Простейший прием - полное перестроение по сырым документам. Для большого интернет-енджина непреемлимо. Инкриментальность у каждого своя.
Полное перестроение - это совсем "больно", т.к. лучше уже пользоваться прямым индексом. Т.е хранить оба: прямой и обратный. Прямой позволит определить термины, по которым надо произвести зачистку пост-листа, чтобы удалить документ подлежащий переиндексации.
Но вряд ли это самый лучший способ. Возможно вы сможете посоветовать, где прочитать о лучших? Информационный поиск имеет долгую истории развития и прежде всего развития в плане научных изысканий, а посему существует много публикаций на тему. Я ведь спрашиваю о достаточно базовых вещях, которые вряд ли уж настолько ноу-хау ;)
(е) подумайте - а оно Вам надо. Подход типа: расскажите мне, как сделать, а я уж напрограммирую - неприемлим т.к. рассказ - это 90% успеха (ничего личного)
Ну раз уже занялся - значит надо ;) Кстати, я не в коем случае не прошу вас раскрывать ваши ноу-хау... Только ткнуть носом в уже существующие и доступные публике алгоритмы.