Загрузка данных


// Простая база данных сайтов
const sites = [
    {
        title: "Что такое поисковые алгоритмы",
        url: "https://example.com/search-algorithms",
        description: "Обзор алгоритмов, используемых в интернет-поиске: краулинг, индексация, ранжирование.",
        keywords: ["алгоритм", "поиск", "интернет", "краулинг", "индексация"]
    },
    {
        title: "PageRank от Google",
        url: "https://example.com/pagerank",
        description: "Как работает алгоритм PageRank и почему ссылки важны для ранжирования.",
        keywords: ["pagerank", "google", "алгоритм", "ссылки", "ранжирование"]
    },
    {
        title: "История поисковых систем",
        url: "https://example.com/history",
        description: "От Archie до Google: как развивались поисковые системы интернета.",
        keywords: ["история", "поиск", "интернет", "google", "системы"]
    },
    {
        title: "SEO и факторы ранжирования",
        url: "https://example.com/seo",
        description: "Основные факторы, влияющие на позицию сайта в поисковой выдаче.",
        keywords: ["seo", "ранжирование", "факторы", "поиск", "сайт"]
    },
    {
        title: "Нейросети в поиске",
        url: "https://example.com/ai-search",
        description: "Как искусственный интеллект меняет алгоритмы поиска и ранжирования сайтов.",
        keywords: ["нейросети", "ии", "поиск", "алгоритм", "ранжирование"]
    }
];

function tokenize(text) {
    return text.toLowerCase().split(/\W+/).filter(w => w.length > 2);
}

// Упрощённый алгоритм ранжирования (TF-подобный)
function rankSites(query, sites) {
    const queryWords = tokenize(query);
    if (queryWords.length === 0) return [];

    return sites.map(site => {
        const text = (site.title + " " + site.description + " " + site.keywords.join(" ")).toLowerCase();
        let score = 0;

        queryWords.forEach(word => {
            // Совпадения в заголовке — вес 3
            if (site.title.toLowerCase().includes(word)) score += 3;
            // В ключевых словах — вес 2
            if (site.keywords.some(k => k.includes(word))) score += 2;
            // В описании — вес 1
            if (site.description.toLowerCase().includes(word)) score += 1;
        });

        return { ...site, score };
    })
    .filter(s => s.score > 0)
    .sort((a, b) => b.score - a.score);
}

function search() {
    const query = document.getElementById("query").value.trim();
    const resultsDiv = document.getElementById("results");

    if (!query) {
        resultsDiv.innerHTML = "<p>Введите поисковый запрос.</p>";
        return;
    }

    const results = rankSites(query, sites);

    if (results.length === 0) {
        resultsDiv.innerHTML = "<p>Ничего не найдено. Попробуйте другой запрос.</p>";
        return;
    }

    resultsDiv.innerHTML = results.map((r, i) => `
        <div class="result">
            <h4>${i + 1}. ${r.title}</h4>
            <p>${r.description}</p>
            <a href="${r.url}" target="_blank">${r.url}</a>
            <div class="score">Релевантность: ${r.score}</div>
        </div>
    `).join("");
}

// Поиск по Enter
document.getElementById("query").addEventListener("keypress", e => {
    if (e.key === "Enter") search();
});