Здравствуй, дорогой читатель.
Меня зовут Сергей и я хочу рассказать историю, как я писал поисковик для своих нужд.
В чем суть проблемы ?
При поиске нужного мне вопроса, я так или иначе натыкался на страницы трех источников, которые в итоге и давали мне ответ на мой вопрос, а именно:
И кто-то скажет:
-Окей, парень, что мешает тебе зайти на каждый ресурс и найти там то, что тебе надо?
На это, я бы ответил, что мой поиск не заканчивается одной статьей на хабре или одной репой на гите, я всегда ищу несколько ответов на мой вопрос.
И тогда я понял, что пора создать для себя ( возможно для кого-то еще ), удобный поиск ответов на свои вопросы и не отвлекаться на мусор, который может попасться при поиске.
Решение
Решение оказалось, довольно простым.
Возьмем три источника и будем искать только у них.
Так как в своей прошлой статье (годовой давности) я писал про закон Фиттса (https://habrahabr.ru/post/247257/), то и начнем тогда с интерфейса.
Версия для десктоп браузера:
Версия для мобайл браузера:
Выдача на десктоп браузере:
Выдача на мобайл устройстве:
Если с интерфейсом к поиску мы немного разобрались, то теперь надо было подумать, а как искать информацию которая мне нужна.
Тут тоже оказалось все не так сложно, по началу.
var express = require('express'); var path = require('path'); // модуль для парсинга пути var log = require('./libs/log')(module); var url = require('url'); var jsdom = require("jsdom"); var app = express(); var NEWS = { stackoverflow:[], habrhabr: [], github: [] } app.get('/api/search', function (req, responce) { responce.setHeader('Access-Control-Allow-Origin', '*'); responce.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); responce.setHeader('Access-Control-Allow-Credentials', true); var url_parts = url.parse(req.url, true); var str = url_parts.search; if (typeof str !== 'undefined' && str !== '') { var objURL = {}; str.replace( new RegExp( "([^?=&]+)(=([^&]*))?", "g" ), function( $0, $1, $2, $3 ){ objURL[ $1 ] = $3; } ); } if (typeof objURL.search !== 'undefined') { objURL.search = decodeURI(objURL.search) if (typeof objURL.type !== 'undefined') { if (objURL.type == 'stackoverflow') { jsdom.env("http://stackoverflow.com/search?q="+objURL.search,["http://code.jquery.com/jquery.js"],function (err, window) { var responceOBJ = []; var strClass = '' var links = window.$('.result-link a'); var exceprt = window.$('.summary .excerpt') if (links.length > 0 ) { for (var i = 0; i < links.length; i++) { responceOBJ[i] = {} responceOBJ[i].link = links[i].getAttribute('href'); responceOBJ[i].question = links[i].innerHTML; } for (var j = 0; j < exceprt.length; j++) { responceOBJ[j].text = exceprt[j].innerHTML; } responce.send(responceOBJ); window.close(); } }); } if (objURL.type == 'habrhabr') { jsdom.env("https://habrahabr.ru/search/?q="+objURL.search,["http://code.jquery.com/jquery.js"],function (err, window) { var responceOBJ = []; var strClass = '' var links = window.$('.post_title'); var exceprt = window.$('.html_format'); if (links.length > 0 ) { for (var i = 0; i < links.length; i++) { responceOBJ[i] = {} responceOBJ[i].link = links[i].getAttribute('href'); responceOBJ[i].question = links[i].innerHTML; } for (var j = 0; j < exceprt.length; j++) { responceOBJ[j].text = exceprt[j].innerHTML; } responce.send(responceOBJ); window.close(); } }); } if (objURL.type == 'github') { jsdom.env("https://github.com/search?utf8=%E2%9C%93&q="+objURL.search,["http://code.jquery.com/jquery.js"],function (err, window) { var responceOBJ = []; var strClass = '' var links = window.$('.repo-list-name a'); var exceprt = window.$('.repo-list-description'); if (links.length > 0 ) { for (var i = 0; i < links.length; i++) { responceOBJ[i] = {} responceOBJ[i].link = links[i].getAttribute('href'); responceOBJ[i].question = links[i].innerHTML; } for (var j = 0; j < exceprt.length; j++) { responceOBJ[j].text = exceprt[j].innerHTML; } responce.send(responceOBJ); window.close(); } }); } if (objURL.type !== 'github' && objURL.type !== 'stackoverflow' && objURL.type !== 'habrhabr') { return responce.send('{message:"type undefined"}'); } } else { return responce.send('{message:"type undefined"}'); } } else { return responce.send('{message:"search string undefined"}'); } }); app.listen(1337, function(){ log.info('Express server listening on port 1337'); });
После чего, я подключил метрики и запустил в продакшн.
На данный момент, мой небольшой сервис работает вот здесь:
http://gaserd.com/
Из того, что я хочу доделать и довести до ума:
- сделать поиск умнее
- сделать умную выдачу ( ранжировать )
- добавить еще несколько ресурсов ( одна из идей, это искать контент еще и на youtube, не все любят читать )
- добиться большей стабильности, чем есть сейчас.
В конце хотелось бы услышать Ваши пожелания и если Вы хотите связаться со мной, то вот моя почта gaserd123@gmail.com
ссылка на оригинал статьи https://habrahabr.ru/post/280350/
Добавить комментарий