Перейти к содержимому

Как искать информацию в интернете

  • автор:

Как найти данные в интернете

Для получения данных из интернета существует определенная техника. Если всё делать по ней, а не как придется, то поиск будет занимать совсем немного времени и приводить к нужному результату легко и безболезненно.

Конечно, всегда есть вероятность, что походящей информации в сети попросту нет, но если искать «по науке», то, как правило, что-то найти да получается.

Первое, с чем нужно разобраться, это где мы будем искать. Второй момент – правильное составление запроса. Но обо всем по порядку.

Где в интернете вся информация

Если в нашем обычном «реальном» мире вся текстовая информация находится, условно говоря, в книгах, то в интернете она размещена на сайтах. Этих самых сайтов в сети миллиарды на самые разные темы.

Для того чтобы в «реальном» мире бесплатно получить книгу, нужно отправиться в библиотеку. В интернете тоже есть подобные структуры, называются они поисковые системы .

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

Какими поисковыми системами пользоваться

Лучше всего искать информацию через крупнейшие системы – Яндекс (yandex.ru) и Google (google.ru). Это лучшие поисковики из всех существующих. Яндекс – российский, Google – международный.

Я не буду сейчас рассказывать, как ими пользоваться – большинство и так это умеет. Поговорим лучше о том, в какой ситуации какая система предпочтительней.

В том случае, если вы не умеете пользоваться поисковиками, ознакомьтесь с уроком «Как и что можно найти в интернете».

Я бы рекомендовал следующее: когда вы ищете информацию на русском языке, то сначала попробуйте поискать ее через Яндекс. В русскоязычном интернете эта система более популярна и, как показывает опыт, лучше подходит для «нашего» человека.

Если Яндекс ничего подходящего не показал, то спрашивайте то же самое у Гугл. Сделать это можно прямо из Яндекса. Для этого нужно опуститься вниз страницы с неудачными результатами поиска до вот такой надписи:

Затем просто нажать на ссылку «Google», и в новом окне откроется поиск этого же запроса в Гугле.

В том случае, если вам нужно найти данные на английском или другом иностранном языке, рекомендую сразу идти в Гугл. Все-таки это международная поисковая система и по другим странам она ищет лучше.

Как сформулировать запрос

От того, как именно мы «спросим» у системы, будет зависеть получение или неполучение нужной информации. Результат-то поисковик нам выдаст в любом случае, но далеко не всегда тот, что мы хотели бы получить.

Многие думают, что умение правильно формулировать запрос приходит с опытом, который накапливается годами. Оно действительно так, но происходит это только из-за того, что человек просто начинает понимать (зачастую интуитивно), как работает поисковая система.

Нужно помнить, что любой поисковик – это машина. Можно назвать его и по-другому: программа, искусственный интеллект. То есть это не человек, а бездушная система. Она не понимает недосказанности, туманности формулировок, намеков и иронии. Хотя в последнее время технологии значительно улучшились.

Посмотрим на составление запроса глазами поисковой системы. Допустим, я открываю поисковик и в строке для печати запроса набираю слово «принтер». После этого нажимаю на кнопку поиска.

Система получает команду «перерыть» весь интернет и найти для меня информацию по принтеру. Но что именно мне нужно? Я хочу купить принтер или просто почитать про него? А, может, принтер у меня сломался, и я хочу найти мастерскую по ремонту? Или купить к нему расходные материалы (картриджи, чернила)?

Поисковик в замешательстве, поэтому старается предусмотреть все варианты. Вот какие результаты он мне показывает:

Как видите, здесь и статьи о принтере, и интернет-магазины, где их можно купить, и ремонтные мастерские и даже магазины по продаже картриджей.

Допустим, мне нужно узнать информацию о конкретной модели принтера. Но ведь их тысячи – откуда поисковику знать, какая именно меня интересует?! Мысли ведь он читать не умеет…

Чтобы ему помочь, нужно точно напечатать, что именно необходимо найти. Не просто «принтер» — это очень широкое понятие, — а конкретную модель.

И результат не заставит себя должно ждать:

Значит, чтобы поисковик нас понял, нужно сформулировать запрос конкретнее. Но не перестараться – желательно не использовать лишних слов, иначе система может попросту «запутаться».

Пример . У меня перестало работать видео. Причем в самом компьютере оно работает, а в интернете – нет. Можно было бы напечатать следующий запрос: «Что делать если не работает видео». Но, во-первых, этот запрос неточный — ведь у меня с ним проблемы только в интернете. А, во-вторых, в нем много лишних слов.

Лучше напечатать следующее: «не работает видео в интернете».

Кстати, если при печати вы допустите грамматическую ошибку, скорее всего, поисковик ее автоматически исправит и покажет правильные результаты – без ошибки. Расставлять в запросе знаки препинания и использовать заглавные буквы тоже не требуется.

Уточнение запроса

Даже если пользователь все время помнит о том, что запросы должны быть точными и конкретными, «непонятки» с поисковиком все-таки случаются. В этом случае нужно просто уточнить запрос – допечатать слово или несколько слов. Тогда система поймет, что именно мы хотим, и покажет более подходящие результаты.

Пример . Я хочу почитать про фильм «Одержимость». Захожу в поисковик и печатаю соответствующий запрос:

Вроде все точно и конкретно, но результаты я получаю не те. Система действительно выдает мне данные о фильме и даже сайты, где его можно посмотреть. Но это совершенно не тот фильм, который нужен. Видимо, с таким названием их несколько.

Значит, нужно уточнить запрос. Для этого просто допечатываю, какую-то дополнительную информацию (год, страну, режиссера).

Что делать, если все равно выдает «не то»

Бывает так, что запрос хорошо составлен и уточнение к нему есть, но все равно результаты не устраивают. Либо информация не та, либо ее качество хромает.

Мы уже говорили, что в этом случае имеет смысл идти в другой поисковик. Но что делать, если и там такая же картина?!

Тогда следует переформулировать запрос — написать то же самое, но другими словами. А иногда лучше даже расширить его – сделать не таким точным.

Пример . Допустим, я пенсионер и хочу бесплатно через интернет освоить компьютер. Печатаю максимально точный запрос «бесплатные компьютерные курсы в интернете для пенсионеров».

Получаю результаты. Какие-то из них – это платные курсы для пенсионеров. Другие же – бесплатные, но выездные. А третьи – вообще непонятно что.

Значит, нужно просто переформулировать запрос. Например, вместо «компьютерные курсы» напечатать «обучение компьютеру».

Как правильно гуглить? Практические советы по правильным запросам к поисковой системе

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

Поиск по картинкам

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

Можно искать изображения с компьютера, для этого достаточно просто на сайте Google просто кликнуть на иконку камеры в поисковой строке.

А дальше просто выбрать сохраненное изображение или фото или вставить ссылку из интернета.

Используя смартфон на Anroid, можно просто выбрать приложение Google и нажать на иконку фотоаппарата в поисковой строке. После этого можно загрузить любое фото, сделанное вами когда-либо и узнать, например сколько в интернете стоит кружка, за которую у вас просят дорого в локальном магазине. Или, допустим, узнать породу понравившейся собаки. Или можно, например, узнать, какая модель наушников перед вами. В примерах снизу точно видно, что гугл отработал максимально объективно и точно.

Этот способ напрямую зависит от ПО вашего смартфона, к примеру. На Realme Ui и в ОС телефонов Samsung Galaxy и в любом, у кого установлена камера Google есть возможность максимально быстро средствами своей камеры найти нужную вам информацию, к примеру я решил проверить своего кота Кузю. Просто нажал на соответствующую кнопку в камере и сделал фотографию спящего кота. И гугл и тут не подвел рассказал, что передо мной черный кот))))

Разумеется, подобный функционал есть и в поисковике от Яндекса.

Открываем Яндекс, переходим на вкладку картинку и в поисковой строке появляется фотоаппарат, по щелчку на который можно загрузить картинку или фотографию.

Ну и у кого установлен поисковик от Яндекса на смартфоне, он в любом месте интернета может долго подержать пальцем на интересующей его картинке и выбрать пункт поискать картинку в яндекс, там же он выведет нас на свое приложение умной камеры. По моему мнению яндекс нашел более адекватно и ближе к нам по пониманию, к примеру сразу предложил озон. При этом есть любопытные алгоритмы поиска типа поэзия, решения, сканер.

Поиск нужной фразы, из которой вы не помните кусок

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

Достаточно в поисковую строку поставить * вместо забытого

Всего-лишь один маленький символ, а позволяет вспомнить кусочек забытого. Очень полезна функция, на мой взгляд.

Как найти информацию за пределами русскоязычного интернета

Мне, в силу специфики профессии зачастую требуется найти информацию, которой почти нет в русском отделе интернета. Допустим, хотел найти профессиональные форумы по программированию контроллеров АСУТП от американской компании Allen Bradley. Поисковик выдает позиции интернет-магазинов, непонятные отрывки между пикабу и отзовиком, а полезной информации очень мало.

Для утонения языка запроса нужно ввести в поисковую строку команду lang:en в случае английского языка. Ну или любого другого.

И в итоге гугл нам выдаст выборку по англоязычным сайтам

Поиск на конкретном сайте

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

вбиваем запрос в поисковую строку site:ixbt.com а дальше сам запрос. И найдем сразу именно то, что помним, именно на нужном сайте, не привлекая ответы поисковика из голливудских сценариев про героев.

Объединение двух запросов в один

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

Поиск точной фразы

Если вы точно помните фразу, то достаточно ее просто заключить в кавычки "" и гугл не будет подсовывать варианты между требуемых слов. К примеру очень хочется вспомнить цитату Виталия кличко, а помним только три слова, но точно вводим их в кавычки

Поиск похожих сайтов

Иногда случается вопрос, а как найти сайты, которые делают такой же контент, который вам нравится.

Для этого достаточно ввести операнду related:ixbt.com

Наш сайт выбран для примера, вообще можно вколотить любой сайт

Поиск текста только в адресе сайта

Допустим, вы знаете, как назывался сайт, но помните не точно и вам хочется его найти. Вводим операнду inurl:«требуемый текст»

тогда гугл будет искать только среди названий сайтов.

Исключение части запроса

Зачастую бывает когда ищешь что-то, а в результатах поиска вылезает один и тот же навязчивый и разбросанный на многие сайты материал. Допустим по запросу нива гугл выдает все связанное с популярным внедорожником, а нам не интересно читать про это, просто ставим минус перед тем, чего мы видеть не хотим. К примеру нива — автомобиль

как видите, мы получили интересные находки, а не ворох сайтов с автотематикой.

Поиск файла по его типу

Допустим, нам интересен именно конкретный тип файла. И мы точно знаем что скачивали документ в формате pdf но с очень необъективной темой. Вводим операнду filetype:pdf «нужный текст»

Так мы стократно повышаем шансы найти нужный PDF документ

Поиск по отрывкам из памяти

Тут зачастую вспоминается ситуация, когда помнишь несколько слов из текста песни, а название ее никак не вспомнишь. Используем операнду allintext:«требуемый текст»

Поиск сайтов, ссылающихся на ваш сайт

Если требуется найти сайты, которые в каких-то своих материалах делали отсылку на ваш сайт, можно ввести операнду

Поиск с учетом синонимов

Чтобы расширить результат можно попробовать нагуглить ваш запрос используя его синонимы. Используем знак тильда перед запросом

Конвертер и калькулятор

Очень удобно использовать поисковую строку как быстрый конвертер из всего во все и мгновенный калькулятор

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

И разумеется не забываем несерьезные, но вполне рабочие «Ок гугл!» «Siri» и «Алиса!»

Гуглить как Боженька: 10 фишек для быстрого поиска информации

Открываем Google, пишем то, что нужно найти в специальную строку и жмем Enter. «Все просто, чему вы меня учить собрались», — думаете вы. Ага, не тут-то было, друзья.

После сегодняшней статьи большинство из вас поймет, что делали это неправильно. Но этот навык – один из самых важных для продуктивного сотрудника. Потому что в 2021 году дергать руководство по вопросам, которые, как оказалось, легко гуглятся, — моветон.

Ну и на форумах не даст вам упасть лицом в грязь, чего уж там.

Затягивать не будем, ниже вас ждут фишки, которые облегчат вам жизнь.

Кстати, вы замечали, что какую бы ты ни ввёл проблему в Google, это уже с кем-то было? Серьёзно, даже если ввести запрос: «Что делать, если мне кинули в лицо дикобраза?», то на каком-нибудь форуме будет сидеть мужик, который уже написал про это. Типа, у нас с женой в прошлом году была похожая ситуация.

Если вам нужно найти точную цитату, например, из книги, возьмите ее в кавычки. Ниже мы отыскали гениальную цитату из книги «Мастер и Маргарита».

Бывает, что вы уже точно знаете, что хотите найти, но гугл цепляет что-то схожее с запросом. Это мешает и раздражает. Чтобы отсеять слова, которые вы не хотите видеть в выдаче, используйте знак «-» (минус).

Вот, например, поисковой запрос ненавистника песочного печенья:

Подходит для тех, кто привык делать всё и сразу. Уже через несколько долей секунд вы научитесь вводить сразу несколько запросов.

Для этого нужна палочка-выручалочка «|». Например, вводите в поисковую строку «купить клавиатуру | компьютерную мышь» и получаете страницы, содержащие «купить клавиатуру» или «купить компьютерную мышь».

Совет: если вы тоже долго ищете, где находится эта кнопка, посмотрите над Enter.

Выручит, если вы помните первое и последнее слово в словосочетании или предложении. А еще может помочь составить клевый заголовок. Короче, знак звездочка «*» как бы говорит гуглу: «Чувак, я не помню, какое слово должно там быть, но я надеюсь, ты справишься с задачей».

Если вы хотите найти файл в конкретном формате, добавьте к запросу «filetype:» с указанием расширения файла: pdf, docx и т.д., например, нам нужно было отыскать PDF-файлы:

Чтобы найти источник, в котором упоминаются сразу все ключевые слова, перед каждым словом добавьте знак «&». Слов может быть много, но чем их больше, тем сильнее сужается зона поиска.

Кстати, вы еще не захотели есть от наших примеров?

Признавайтесь, что вы делаете, когда нужно найти значение слова. «ВВП что такое» или «Шерофобия это». Вот так пишете, да?

Гуглить значения слов теперь вам поможет оператор «define:». Сразу после него вбиваем интересующее нас слово и получаем результат.

— Ты сильный?!

— Я сильный!

— Ты матерый?!

— Я матерый!

— Ты даже не знаешь, что такое сдаваться?!

— Я даже не знаю, что такое «матерый»!

Допустим, вам нужно найти статью не во всём Интернете, а на конкретном сайте. Для этого введите в поисковую строку «site:» и после двоеточия укажите адрес сайта и запрос. Вот так все просто.

Часто заголовок полностью отображает суть статьи или материалов, которые вам нужны. Поэтому в некоторых случаях удобно пользоваться поиском по заголовку. Для этого введите «intitle:», а после него свой запрос. Получается примерно так:

Чтобы расширить количество страниц в выдаче за счёт синонимов, указывайте перед запросом тильду «

». К примеру, загуглив «

cтранные имена», вы найдете сайты, где помимо слова «странные» будут и его синонимы: «необычные, невероятные, уникальные».

Ну и, конечно, не забывайте о расширенных инструментах, которые предлагает Google. Там вы можете установить точный временной промежуток для поиска, выбирать язык и даже регион, в которым был опубликован материал.

В комментариях делитесь, о каких функциях вы знали, а о каких услышали впервые 🙂

Кстати, еще больше интересных фишек в области онлайн-образования, подборки с полезными ресурсами и т.д., вы найдете в нашем Telegram-канале. Присоединяйтесь!

Отличная статья для моего семилетнего сына.

Вот знал, что самым популярным комментом будет нечто вроде "миллениалы открыли для себя поисковые операторы". Но тут прям хитро написано)

Хороший обзор для моей мамы. Но меня интересовало как исключить из выдачи статьи, написанные всратыми сеошниками под поисковые роботы?

Искать на английском языке

Если вы ищите непонятно что, то никак. Даже «всратая» контекстная реклама не поможет)

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

Потому и такой на них спрос.

Искать только на проверенных сайтах

Ну за годы эволюции поисковиков этого стало на порядок меньше всё-таки. Правда контекстной рекламы прибавилось взамен строк органической выдачи.

Ждём "10 фишек эксель" и "7 горячих клавиш виндоус" ^_^

По Excel можем посоветовать очень полезный канал с подробными уроками и программами для начинающих практиков и для тех, кто использует программу для более сложных задач (обработка больших массивов данных, работа с макросами, программирование на VBA) — https://www.youtube.com/user/easyexcellesson

Открою простой секрет хорошего гугления: на английском.

Англосаксы не делают дорвеи?

Больше авторитетных источников, данные к своей статье я так и искал

Про site:
Всегда так делаю, когда у сайта плохо работает его собственный поиск (пример vc.ru )

Хороший обзор, спасибо! По Яндексу есть нечто подобное?

Примерно то же самое:
1. Кавычки, точный поиск: "это чистый спирт"

2. Минус-слова для отсечения: рецепты печенья -песочное
В противовес этому, если нужно обязательное присутствие слова в запросе, ставим перед ним плюс: рецепты печенья +овсяное

3. Поиск нескольких фраз: купить мышь | купить клавиатуру
Причем, можно писать даже так: купить (мышь | клавиатуру)

4. Звездочка в запросе тоже есть, но я не умею ее готовить (не пользуюсь)

5. Поиск по типам документов работает через указание MIME типа (почти что и расширение файла): mime:pdf презентация

6. & помогает искать ответы, где указанные части фразы находятся в одном предложении, но я с ним тоже не особо дружу

Как устроен поиск

Привет, юзернейм! Каждый день мы сталкиваемся с поиском различных данных. Почти на каждом веб-сайте с большим количеством информации сейчас есть поиск. Поиск есть в домашних компьютерах, в мобильных телефонах, в различного рода программном обеспечении. Конечно, если спросить любого разработчика про поиск с точки зрения технологий, на ум сразу придет elasticsearch, lucene или sphinx. Сегодня я хочу заглянуть с тобой «под капот» полнотекстового поиска и разобраться в первом приближении, как же он работает, на примере hh.ru.

image

Дисклеймер: данная статья не является единственно верной точкой зрения и служит лишь вводной точкой для начального ознакомления с работой текстового поиска и некоторыми вариантами реализации его отдельных частей.

Если посмотреть на детали поиска, то помимо очевидной части в виде поисковой строки можно увидеть еще много чего:

  • подсказку (она же suggest),
  • счетчик поисковой выдачи (counter),
  • различные виды сортировки (sort),
  • фасеты (facet) — сгруппированные характеристи документов, например, метро, на котором находится вакансия, также выполняющие функцию фильтров (filters),
  • синонимы (synonyms),
  • пагинация (pagination),
  • сниппет (snippet) — небольшое описание документа в выдаче,
  • etc.

И все это служит для одной цели — удовлетворить потребность пользователя в нахождении нужной информации максимально быстро и релевантно. Например, фильтрация важна, чтобы сузить поисковую выдачу, в нашем случае это может быть фильтр по опыту кандидата, местоположению, или занятости. Фасеты полезны, чтобы отображать, сколько в каждом зарплатном диапазоне находится вакансий. Также важно дополнять запросы и документы синонимами, чтобы по запросу «разработчик java» могли найти документы «java developer».

Помимо самого поиска рядом всегда находится много компонентов, облегчающих жизнь пользователю: опечаточник, отвечающий за исправление ошибок, или саджест, который подсказывает более подходящие запросы, когда вы взаимодействуете со строкой поиска. В некоторых случаях важно уметь переформулировать запрос. Например, часть запроса переместить в фильтры: из запроса «программист москва» Москву можно вынести в фильтр по городу.

1. Базовое

А теперь к делу. Сам поиск делится на две больших стадии:

  • индексация (обработка документов и раскладывание их по специальным структурам индекса, для того чтобы потом можно было быстро осуществить сам поиск),
  • поиск (применение фильтров, булев поиск, ранжирование и т. д.).

1.1. Индексация

Небольшое лирическое отступление. Дальше я введу понятие терма — так принято называть минимальную единицу индексации и запроса. Это та самая единица, которая сохранится в словаре индекса. Это может быть слово, приведенное к его нормальной словоформе или основе, число, емэйл, буквенные n-граммы или что-то еще. Обычно терм включает в себя поле, в котором он индексируется или в котором производится поиск.

Для начала входные документы нужно превратить в набор термов и отфильтровать стоп-слова. Ими могут быть как часто встречающиеся слова — предлоги, союзы, междометия, так и другие вещи, например, спецсимволы, по которым мы не хотим искать. Чтобы поиск работал с разными словоформами, в процессе индексации мы обычно приводим все слова к какому-то базовому состоянию. Обычно используется одна из двух процедур: либо стемминг — процесс выделения основы слова (разработка->разработ), либо лемматизация — процесс приведения к нормальной форме слова (навыками->навык).

1.2 Структуры индекса

Самым популярным способом представления индекса является инвертированный индекс (inverted index). По сути это разновидность хэш таблицы, где ключом является терм, а значением список документов (а обычно список id документов, который называется postings list), в котором этот терм присутствует. Обычно инвертированный индекс состоит из двух частей — словаря (term dictionary) и списков документов по каждому терму (posting list):

image

Кроме того в индексе может содержаться информация о позициях термов в документе (position index), которая будет полезна при поиске термов на определенном расстоянии, в частности при фразовых запросах, о частотности термов, что поможет в ранжировании и при построении плана запроса. Но об этом немного ниже.

1.2.1 Term dictionary

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

  • Хэш-таблица, где терм — ключ, а значение — ссылка на список документов этого терма.
  • Упорядоченный список, по которому можно искать бинарным поиском.
  • Префиксное дерево (trie).

image

Конечно, префиксное дерево может быть не единственной структурой для хранения термов в индексе. Например, рядом может находиться также и суффиксное дерево, которое будет в свою очередь оптимальнее для запросов с джокерами (запросы вида po*sql).

1.2.2 Posting list

Список документов представляет собой упорядоченный список из идентификаторов документов, что позволяет производить с ним некоторые оптимизации. Обычно он хранит в себе не только список документов, в которых встречается терм, но и позиции (postings), на которых оно встретилось. Это решает сразу несколько проблем: мы сразу знаем сколько раз встретилось слово в документе, мы можем делать запросы по фразам и запросы с определенным расстоянием между термами, пересекая сразу несколько списков документов и смотря на позиции термов.

image

Например в данном списке по терму scala в 6 документе в title слово встречается 4 раза, в позициях 2, 15, 18 и 25.

1.2.3 Документы со множественными полями

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

Плюс ко всему в индексе обычно хранятся не только текстовые поля, но также могут храниться признаки документов, какие-то числовые значения и т. д. Хранение в индексе обычно происходит в виде <поле-терм>.

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

1.3 Сжатие и оптимизации индекса

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

1.3.1 Компрессия дельтами

Так как мы помним, что список документов по терму (он же postings list) упорядочен, то первая идея, как его сжать, — это сделать вместо списка с id документов список со смещениями id относительно предыдущих. На конкретном списке из 6 идентификаторов это будет выглядеть так:

image

Таким образом перемещаясь по списку, мы будем всегда вычислять текущий идентификатор из полученного предыдущего значения. Например, ко второму смещению 3 мы добавим первое значение 2 и получим id 5, к третьему 4 мы добавим значение 5, и получим 9 и так далее. При большом количестве документов это очень хорошо работает, особенно в связке с другим способом сжатия — записью чисел формата переменной длины.

1.3.2 VarByte и VarInt

Это способ сохранения каждого отдельного элемента списка в память так, чтобы он занимал минимальное количество места. Например, если первые три смещения влезают всего в 1 байт, то и больше занимать незачем. Учитывая, что наш список содержит не id документов, а дельты — сжатие будет очень эффективным. В таком представлении чисел первый бит каждого байта является флагом, заканчивается ли на этом байте представление текущего числа.

image

Если первый бит байта 0 — то это последний байт числа, если 1 — нет.

1.3.3 Skip list / Jump table

Список с пропусками — это одна из структур для быстрого перемещения по списку документов определенного терма, пропуская ненужную часть списка. Идея в том, чтобы хранить ссылки на отдаленные элементы списка на диске перед самим списком, т. к. после сжатий мы не можем сказать, где конкретно будет находиться 100 или 200 документ. Например, это удобно, когда есть запрос из двух термов, где один терм будет встречаться часто, а второй наоборот будет встречаться редко, и список документов будет начинаться только с 200-го id документа. Тогда при наличии списка с пропусками для первого списка мы сможем сэкономить время на перемещении и пропустить сразу ненужный блок идентификаторов.

image

1.4 Запросы

1.4.0 Запрос по терму

Самый простой тип запроса, в котором нам просто требуется найти соответствующий список документов и выдать отсортированные после ранжирования документы.
Например так мы найдем список позиций по запросу java:

image

1.4.1 Булевы запросы (and, or, not)

Булев поиск — одна из самых важных частей в информационном поиске, с которой мы сталкиваемся повсеместно. Весь булев поиск построен на комбинации AND, OR и NOT. Например, когда мы ищем запрос из двух слов: java android, то на самом деле в поиске в простом варианте он преобразуется в java AND android. И это значит, что мы хотим найти все документы, в которых содержатся оба слова.

Стоит сразу упомянуть, как происходит перемещение по списку документов. Так как списки документов для каждого терма отсортированы, обычно есть два способа для перемещения по спискам: перемещаться по документам последовательно, проходя их один за одним, или переместиться сразу к определенному документу, пропустив те, которые не нужны (например, когда первый список сильно меньше, и нам не нужно проходить большой блок документов во втором списке). В таком случае мы сначала используем указатель из skip pointers для второго списка, чтобы переместиться максимально близко к нужному id документа, а потом перемещаемся до него линейно.

В момент поиска происходит следующее: в индексе по термам java и android находятся списки документов, затем по ним делается пересечение — то есть мы находим документы, в которых есть оба терма. При таком поиске как раз используются оба способа перемещения по спискам для более быстрого пересечения.

image

С запросами OR вида java OR scala, где нам нужно найти все документы, содержащие хотя бы один из термов дело обстоит по другому — тут нам не нужно, чтобы терм находился во всех списках документов сразу. Но бывают запросы с несколькими оператором OR, и тогда может встречаться условие минимального количества совпадений, например может быть запрос java OR scala OR cotlin OR clojure с минимум двумя совпадениями, и тогда мы должны показать все документы, в которых встречаются хотя бы два слова из запроса.

В таком случае эффективнее всего работает куча. Мы можем хранить в ней ссылки на итераторы каждого из списка и получать минимальный элемент за константное время. После того как мы берем минимальный элемент, мы удаляем итератор из кучи, делаем шаг вперед и снова добавляем в кучу. Отдельно можно хранить текущего кандидата на добавление в результат и счетчик, сколько раз он встретился, и в тот момент, когда кандидат будет отличаться от минимального элемента в куче, смотреть, проходим ли мы по минимальному количеству совпадений в операции. И либо добавлять в финальный список результата, либо отбрасывать документ.

image

1.4.2 Префикс/джокеры

Иногда нам хочется найти все документы, в которых встречается слово которое начинается на определенный префикс. В таких случаях нам поможет префикс запрос, который будет выглядеть как jav*. Префиксный запрос очень хорошо работает, когда словарь реализован на префиксном дереве, и тогда мы просто доходим до вложенности префикса и берем все термы, которые лежат ниже.

1.4.3 Запросы на фразах и near query

Бывают случаи, когда нужно найти именно фразу целиком, например, “java developer”, или найти слова, между которыми будет не более скольки-то слов, например, “java” и ”developer”, между которыми не более 2 слов, чтобы находились документы, содержащие java android kotlin developer. Для этого дополнительно используются списки позиций слова в каждом документе.

image

В момент пересечения списков документов происходит все то же самое, как и при операции AND. Но после того, как документ найден в обоих списках, производится дополнительная проверка — то, что термы находятся на нужном расстоянии друг от друга, по разнице позиций (position).

1.4.4 План запроса

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

Самый простой способ оптимизировать запрос — это выполнять пересечение списков документов в порядке увеличения их размера. Таким образом мы не будем впустую пересекать документы из больших списков, которые отсутствуют в маленьких списках.

Разберем для примера запрос android AND java AND sql. Допустим, что в списке android 10 документов, в sql — 20, а в java — 100. В таком случае лучше всего сначала пересечь наименьшие списки, и оптимизированный запрос будет выглядеть как (android AND sql) AND java.

В случае с OR самое простое — считать количество документов при пересечении как сумму двух потенциально пересекаемых списков.

1.4.5 Расширение запроса — синонимы

Помимо того, что пользователь вводит в поисковую строку, обычно поиск пытается сам расширить запрос, чтобы найти больше релевантных документов. Для расширения поиска может использоваться многое: история запросов пользователя, какие-то персонализированные данные о нем и другое. Но помимо всего этого есть еще и универсальный способ расширения запроса — синонимы.

В таком случае при записи документов в индекс терм заменяется на «ссылку» в словарь синонимов:

image

То же самое происходит при преобразовании запроса. Например, когда мы запрашиваем sales manager, на самом деле запрос выглядит как:

image

Таким образом в ответе мы получим не только те документы, которые содержат sales manager, но и те, которые содержат sales agent и sales.

1.5 Фильтрация

1.5.1 Fast range filter

Иногда нам хочется фильтровать что-то по диапазону значений, например, по опыту в годах. Допустим, нам хочется найти все вакансии с требуемым опытом от 3 до 11 лет. Первое решение — сделать запрос со всеми вариантами из диапазона, объединив их через OR. Но проблема в том, что значений может быть слишком много. Один из способов решить такую проблему — записывать значение сразу с несколькими точностями:

image

В данном случае мы будем хранить 5 точностей: год (будем считать это за исходное значение), два, четыре, восемь и шестнадцать.

Тогда при записи будет происходить следующее: например, при записи документа с требованием опыта 6 лет, мы записываем значение сразу во все точности:

image

При фильтрации «от 3 до 11 лет» происходит следующее: мы выбираем только нужные нам значения в нужных точностях, и получается всего 3 значения вместо 8 и получаем запрос (real value == 3) OR (precision 4 == 4) OR (precision 4 == 8)

image

1.5.2 Битовые маски

Битовые маски — это неотъемлемая часть индекса. Самое важное использование — это фильтрация удаленных документов. При удалении документа из индекса физическое удаление происходит не сразу. Рядом с индексом записывается специальная структура, где каждый бит означает id документа в индексе, и при удалении возводится бит, а при поиске эти документы фильтруются и не попадают в выдачу.

Также можно использовать битовые маски, чтобы выставлять права доступа для каждого пользователя к определенным документам и для кэширования отдельных популярных фильтров. Тогда обычно битовые маски сохраняются отдельно от индекса.

Например, у нас есть популярные фильтры: город Москва, только частичная занятость, без опыта работы. Тогда перед запросом мы можем достать уже сохраненные битовые маски для этих документов, сложить их, и получить финальную битовую маску — какие документы проходят все три этих фильтра, тем самым сэкономив время на фильтрацию.

image

2. Ранжирование

Как мы помним, главная задача поиска — получение максимально релевантной информации за минимальное время. И в этом нам поможет ранжирование документов после того, как мы отфильтровали документы по текстовому запросу и применили нужные фильтры и права.

Самый простой и дешевый способ сделать ранжирование — это просто отсортировать документы по дате. В некоторых системах раньше так и делалось, например, в новостях или в объявлениях недвижимости, так пользователю показывались сначала самые новые документы.

Иногда может использоваться модель ранжирования по количеству найденных слов в документе, например, когда документов не так много, и мы хотим найти все документы, в которых встречается хотя бы одно из слов запроса. В таком случае релевантнее будут те документы, в которых встречаются все слова из запроса или большее их количество.

Конечно, в настоящее время эти способы уже стали неактуальны, и их скорее можно отнести к истории вопроса.

2.1 TF-IDF

TF-IDF (term frequency — inverse document frequency) — одна из самых базовых и самых используемых формул ранжирования. Суть формулы в том, чтобы сделать меньшей значимость терм, используемых повсеместно, например, предлогов и междометий, и сделать более значимыми термы, которые встречаются редко, тем самым показав в выдаче сначала документы с редкими и более значимыми термами из запроса. А теперь давайте разберем формулу на части:

TF (term frequency) — это частота встречающегося терма в документе. Подсчитывается она просто:

TF терма `java` = количество терма `java` в документе / количество всех термов в документе

IDF (inverse document frequency) — инверсия частоты, с которой слово встречается в коллекции документов. Помогает уменьшить вес часто употребляемых слов.

IDF(`java`) = log(число документов в коллекции / число документов в которых встречается терм `java`)

Далее чтобы получить TF-IDF термина java нам нужно просто перемножить полученные значения TF и IDF. Больший вес получат документы, у которых термы встречаются чаще, но при этом они встречаются в меньшем количестве других документов. Это позволяет правильно взвесить запрос, например, слово developer будет встречаться в вакансиях программистов намного чаще, чем название конкретного языка программирования, и при запросе java developer это позволит сделать правильное ранжирование поисковой выдачи.

2.2 Вес поля

Комбинации с весами довольно хорошо помогают, когда в документе есть несколько полей, например заголовок и текст. Тогда мы можем задать больший коэффициент для термов, которые встретились в заголовке документа, и меньший для тех, что нашлись в его теле.

2.3 BM25 и BM*

BM25 (Okapi best match 25) является одной из вариаций формулы TF-IDF со свободными весами и нормализацией на средний размер документа. В отдельную формулу выделяют BM25F, которая по сути использует вместо среднего размера документа средний размер конкретного поля (например заголовка или основного текста).

2.4 Другие формулы ранжирования

Помимо основных формул ранжирования существуют и другие, например:

  • DFR (divergence from randomness),
  • IBS (information-based models),
  • LM Dirichlet,
  • Jelinek-Mercer.

2.5 Ранжирование машинным обучением

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

2.6 Top k документов после ранжирования

Важным моментом в поиске является взятие топа документов или определенной его части, например для пагинации. Основной проблемой является то, что во время ранжирования мы не знаем, сколько всего документов и в каком порядке они стоят.

Также мы не можем гарантировать, что весь список документов сможет уместиться в памяти и будет быстро отсортирован. И именно поэтому обычно используются специальные алгоритмы для взятия top k документов.

Один из способов взять топ документов — использовать кучу. Размер кучи всегда k, где k обычно размер страницы * номер нужной страницы. Итерируемся по потоку документов и пускаем все их скоры через heap. При таком способе можно гарантировать сложность n*log(n) и расход памяти k.

Помимо этого можно использовать оптимизации при загрузки не первой страницы топа. Например, если человек переходит на следующую страницу после того, как он уже был на другой странице по этому запросу, например с 10 страницы переходит на 12, то можно запоминать score последнего документа с 10 страницы и все документы с большим значением score сразу отбрасывать. Так можно сэкономить на размере кучи или массива, чтобы не хранить для страницы n — (n*page size) отсортированных документов.

3. Физическое хранение индекса

3.1 Сегменты

Обычно хранение индекса происходит в виде сегментов — небольших самостоятельных индексов. Для записи в таких индексах доступен только один сегмент, последний.

В индекс может производиться добавление документов, но удаление из них операция довольно таки тяжелая: чтобы удалить один документ, нужно пройтись по всем спискам документов каждого терма, удалить документ из каждого и изменить их. В общем, задача не из простых. Поэтому удаление производится методом установки специального бита и фильтрацией таких документов битовой маской. Также происходит обновление документа (старая версия документа помечается как удаленная, а новая версия добавляется в конец открытого индекса). Физическое удаление документа из индекса происходит только во время слияния сегментов (merge).

Одним из плюсов нескольких сегментов в индексе является то, что операцию поиска можно делать, проходясь сразу параллельно по всем сегментам индекса:

image

Но большое количество сегментов не всегда хорошо. При слишком большом количестве сегментов в индексе поисковые запросы могут выполняться дольше, и сам индекс будет занимать больше памяти, чем мог бы, из-за дублирования словаря в каждом сегменте.

3.2 Слияние сегментов (megre)

Существует еще одна важная операция над индексом — слияние сегментов. Основное предназначение данной операции в избавлении индекса от «мусора» — удаленных или старых версий измененных документов. Во время слияния объединяются несколько сегментов, перестраивается их словарь и списки документов, а также происходит физическое удаление неактуальных документов (удаленных или старых версий измененных).

image

Это может быть дорогостоящей операцией, поэтому существуют стратегии слияний, которые определяют правила, когда нужно и оптимальнее всего их делать. Они могут зависеть от разных факторов:

  • процент удаленных документов в индексе,
  • количество сегментов на одном уровне (например, при переходе на следующий уровень размер новых сегментов увеличивается в 2 раза),
  • время когда можно делать слияние (возможно, в определенное время суток нагрузка на поиск меньше).

4. Поисковый кластер

Когда речь заходит о поиске не на одной машине, а на целом кластере, то одним из вариантов является разделить поиски на базовые и меты. Базовые поиски отвечают непосредственно за поиск по сегментам индекса, а мета-поиски распределяют запрос по базовым (например, если у базовых сделано шардирование или в зависимости от нагрузки и т. д.). И после того, как мета получает результаты от базовых, она сливает их в один итоговый результат, чтобы отдать его пользователю.

image

4.1 Шардинг и репликация

Шардинг в поиске можно делать как на уровне доменной области (например, в hh есть отдельные индексы для вакансий, резюме и работодателей), так и внутри конкретного индекса. Это позволяет распределить нагрузку между машинами с индексом.

Также в поисковых кластерах, как и во всех отказоустойчивых распределенных системах хранения, часто применяется репликация данных. Во-первых, это нужно для ускорения поиска, чтобы можно было отправлять разные запросы на разные базовые поиски. Во-вторых, это делается для избыточности данных, чтобы потеря одной реплики не была проблемой для всего кластера, и поиск мог спокойно считывать данные с других реплик.

4.2 Спекулятивные таймауты

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

Одной из смешанных стратегий, которая как раз используется в поиске hh, являются спекулятивные таймауты, когда поиск производится последовательно через определенные промежутки времени, чтобы на мета-поиске уложиться в общий таймаут:

image

5. Бонус трек… или что дальше

Вот мы и посмотрели, как устроен поиск в первом приближении, но осталось еще куча не затронутых тем и тем, в которые можно углубиться. Дальше можно посмотреть, как устроены другие части поиска: как работают кластера, фасеты, статистики, как выделяются сниппеты из целых документов, которые показываются в поисковой выдаче, и как в них работает подсветка искомых термов (highlight), работа с опечатками. Отдельных тем заслуживают саджест поисковой строки, устройство индексации на кластере, другие способы работы описанных уже в статье механизмов, например взятия top k документов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

From $34/Day — Car Rental HPN With Zero Terminal Shuttle