Поиск для разработчиков или как я пришел к этому

от автора


Здравствуй, дорогой читатель.
Меня зовут Сергей и я хочу рассказать историю, как я писал поисковик для своих нужд.

В чем суть проблемы ?

При поиске нужного мне вопроса, я так или иначе натыкался на страницы трех источников, которые в итоге и давали мне ответ на мой вопрос, а именно:

И кто-то скажет:
-Окей, парень, что мешает тебе зайти на каждый ресурс и найти там то, что тебе надо?
На это, я бы ответил, что мой поиск не заканчивается одной статьей на хабре или одной репой на гите, я всегда ищу несколько ответов на мой вопрос.
И тогда я понял, что пора создать для себя ( возможно для кого-то еще ), удобный поиск ответов на свои вопросы и не отвлекаться на мусор, который может попасться при поиске.

Решение

Решение оказалось, довольно простым.
Возьмем три источника и будем искать только у них.
Так как в своей прошлой статье (годовой давности) я писал про закон Фиттса (https://habrahabr.ru/post/247257/), то и начнем тогда с интерфейса.
Версия для десктоп браузера:
image
Версия для мобайл браузера:
image
Выдача на десктоп браузере:
image
Выдача на мобайл устройстве:
image

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

Немного кода

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/


Комментарии

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

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