Поисковый движок
Изучите структуры данных в поисковых системах, освойте ключевые методы поиска и метрики релевантности, а также постройте обратный индекс.
Цель
Поисковый движок — проект, в котором мы изучим основные алгоритмы и структуры данных в поисковых системах. На практике применим различные методы поиска, индексирование, ранжирование, метрики релевантности и построим обратный индекс. Проект можно пройти на одном из четырех языков программирования на выбор – 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 — вам ответит живой человек из команды Хекслета.