Проект

Поисковый движок

Алгоритмы и структуры данных

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

2-4
недели

Цель

Поисковый движок — проект, в котором мы изучим основные алгоритмы и структуры данных в поисковых системах. На практике применим различные методы поиска, индексирование, ранжирование, метрики релевантности и построим обратный индекс. Проект можно пройти на одном из четырех языков программирования на выбор – JavaScript, Python, PHP или Java

Архитектура

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

Описание

Всемирную сеть сложно представить без поисковиков. Чтобы они эффективно работали, используют разные поисковые движки. В этом проекте мы напишем собственную реализацию поискового движка.

Распространенная поисковая система с открытым исходным кодом — ElasticSearch.

Пример использования:

import search from '@hexlet-code';

const doc1 = { id: 'doc1', text: "I can't shoot straight unless I've had a pint!" };
const doc2 = { id: 'doc2', text: "Don't shoot shoot shoot that thing at me." };
const doc3 = { id: 'doc3', text: "I'm your shooter." };
const docs = [doc1, doc2, doc3];

search(docs, 'shoot'); // ['doc2', 'doc1']
Java
import hexlet.code.SearchEngine;

var doc1 = "I can't shoot straight unless I've had a pint!";
var doc2 = "Don't shoot shoot shoot that thing at me.";
var doc3 = "I'm your shooter.";

List<Map<String, String>> docs = List.of(
    Map.of("id", "doc1", "text", doc1),
    Map.of("id", "doc2", "text", doc2),
    Map.of("id", "doc3", "text", doc3)
);

List<String> result = SearchEngine.search(docs, "shoot");
System.out.println(result); // => ["doc2", "doc1"]
PHP
use function search;

$doc1 = "I can't shoot straight unless I've had a pint!";
$doc2 = "Don't shoot shoot shoot that thing at me.";
$doc3 = "I'm your shooter.";

$docs = [
    ['id' => 'doc1', 'text' => $doc1],
    ['id' => 'doc2', 'text' => $doc2],
    ['id' => 'doc3', 'text' => $doc3],
];

$result = search($docs, 'shoot');
print_r($result);
// =>    Array
// =>  (
// =>      [0] => doc2
// =>      [1] => doc1
// =>  )
Python
from search_engine.search_engine import search

doc1 = "I can't shoot straight unless I've had a pint!"
doc2 = "Don't shoot shoot shoot that thing at me."
doc3 = "I'm your shooter."

docs = [
    {'id': 'doc1', 'text': doc1},
    {'id': 'doc2', 'text': doc2},
    {'id': 'doc3', 'text': doc3},
]

result = search(docs, 'shoot')
print(result)  # => ['doc2', 'doc1']
Сколько стоят проекты?

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

Зачем проходить проекты?

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

Проекты — портфолио программиста. Их код останется в вашем аккаунте на GitHub и будет преимуществом при поиске работы.

Чтобы узнать о том, что такое проекты и в чём их польза, прочитайте нашу статью «Анатомия проектов Хекслета».

Что делать, если возникли трудности во время выполнения проекта?

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

Кто проверяет проекты?

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

У меня другой вопрос

Нажмите на виджет в правом нижнем углу экрана и поищите ответ в нашей справке. Или сразу пишите на support@hexlet.io — вам ответит живой человек из команды Хекслета.