Как сделать поиск аналогичный поиску на “github.com”?

204
04 февраля 2019, 16:30

Используется - "octokit.net".
Меня интересует поиск по "repositories", "users" и фильтрация результатов по языку.

Сценарий:
1. Пользователь. Вводит поисковую фразу;
2. Сайт. Выполняет поиск;
3. Сайт. Выводит результат:
a. repositories;
b. users;
Фильтр:
- языки;

После нажатия кнопок "repositories" или "users" в таблицу выводится результат. После нажатия кнопки языки (например "C#"), результаты фильтруются.

Общий результат поиска:
Репозитарии
- Репозитарии - 108 951 результатов
- C# (репозитарий) - 4 315 результатов

**Пользователи**  
        - Пользователи  - ~ 4K результата   
        - C# (пользователи ) - ~ 72 результата   

Как повторить данный сценарий работы поисковика?
Я написал предварительный код, но как сделать чтобы он работал более правильно не понимаю.

Метод не завершен "searchUser(string searchQuery_str)".
Я планирую сделать это по аналогии с «SearchReposit(string searchQuery_str, string lang_str)»

Текущая логика кода:
- поиск по всем репозитариям:
- отправляем запрос;
- получаем получаем ответ;
- поиск по репозитариям которые используют C#:
- отправляем запрос;
- фильтруем запрос по языку "C#";
- получаем ответ;

Т.е. сейчас выполняется для каждого случая отдельный запрос(var request), а мне кажется, что нужно выполнить один запрос, а потом выполнять над ним следующие действия:
- фильтровать;
- сортировать;
- очистить фильтрацию;
- очистить сортировку.

Вопрос в том: как сделать чтобы можно было выполнить один запрос(var request), а потом выполнять над ним следующие действия:
- фильтровать;
- сортировать;
- очистить фильтрацию;
- очистить сортировку;
- вычислить количество результатов поиска?

Правильно ли я понимаю логику и возможно ли это сделать?

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

Ссылка на документацию по поиску - ссылка
Ссылка на библиотеку octokit.net - ссылка

  private async void button1_Click(object sender, EventArgs e)
 {
            // Получаем поисковую фразу
            string searchQuery_str = Search_txB.Text;
            string lang_str;
 
 
            // Поиск по репозитариям. "Результат"
            lang_str = "";
            var countRepo = await SearchReposit(searchQuery_str, lang_str);
 
 
             label5.Text = countRepo;
 
            // Поиск по репозитариям. "Результат"
            lang_str = "C#";
            var countRepoLang = await SearchReposit(searchQuery_str, lang_str);
 
            label7.Text = countRepoLang;
 
 }
 
 
public async Task<string> SearchReposit(string searchQuery_str, string lang_str)
 {
            // Поиск по "Реозитариям"
            var request = new SearchRepositoriesRequest(searchQuery_str); // mvc client side framework - Структура клиентской стороны mvc           
 
            switch (lang_str)
            {
               case "C#":
                   request.Language = Language.CSharp;
                   break;                
            }
 
            var resultRepo = await client.Search.SearchRepo(request);
 
            // Количество репозитариев
            decimal countRepo_dec = Convert.ToDecimal(resultRepo.TotalCount);
 
            // Количество репозитариев. Форматирование
            string countRepo_str = formatValue(countRepo_dec);
 
            return countRepo_str;            
}
 
   // Поиск по "Пользователям" ()
public async void searchUser(string searchQuery_str)     
{        
            var request = new SearchUsersRequest(searchQuery_str); // _____
 
            var resultUser = await client.Search.SearchUsers(request);
 
            label6.Text = resultUser.TotalCount.ToString();
            // var resultUsers = await client.Search.SearchUsers(request);
}
Answer 1

Используя функцию sort(), вы можете отсортировать репозитории, пользователей и все остальное по указанным в их категориях. Если категория такого-то проекта C#, вы forом сравниваете их категории и, если категория равна той, что на кнопке, вы выводите.

Answer 2

Изменил переменную request:
- было "var" - стало SearchRepositoriesRequest;
- было "локальной" - стало "глобальной";

Изменил метод SearchReposit(string searchQuery_str, string lang_str)
- добавил аргумент "bool null_flg" - стало "SearchReposit(string searchQuery_str, string lang_str, bool null_flg)";
- добавил проверку "bool null_flg";
if (null_flg == false)
{ request = new SearchRepositoriesRequest(searchQuery_str); }

Код выглядит так

SearchRepositoriesRequest request;
    public async Task<string> SearchReposit(string searchQuery_str, string lang_str, bool null_flg)
            {
                //SearchRepositoriesRequest request = new SearchRepositoriesRequest();
                // Поиск по "Реозитариям"
                // if (request == null) // ошб
                if (null_flg == false)
                {
                     request = new SearchRepositoriesRequest(searchQuery_str); // mvc client side framework - Структура клиентской стороны mvc           
                    // return request; 
                }
                switch (lang_str)
                {
                   case "C#":
                       request.Language = Language.CSharp;
                       break;                
                }
                var resultRepo = await client.Search.SearchRepo(request);
                // Количество репозитариев
                decimal countRepo_dec = Convert.ToDecimal(resultRepo.TotalCount);
                // Количество репозитариев. Форматирование
                string countRepo_str = formatValue(countRepo_dec);
                return countRepo_str;            
            }

    private async void button1_Click(object sender, EventArgs e)
            {
                // Получаем поисковую фразу
                string searchQuery_str = Search_txB.Text;
                string lang_str;
                bool null_flg;

                // Поиск по репозитариям. "Результат"
                lang_str = "";
                null_flg = false;
                var countRepo = await SearchReposit(searchQuery_str, lang_str, null_flg);
                null_flg = true;
                label5.Text = countRepo;
                // Поиск по репозитариям. "Результат"            
                lang_str = "C#";
                var countRepoLang = await SearchReposit(searchQuery_str, lang_str, null_flg);
                label7.Text = countRepoLang;
            }

Будет ли это нормальным решением или можно сделать более грамотно?

READ ALSO
Надо ли тестировать static?

Надо ли тестировать static?

И снова к вопросу, надо ли тестировать и использовать статические методыЧто-то эта тема опять всплыла: раз, два

204
html блок как переменная

html блок как переменная

Как правильно сохранить html блок и использовать его как переменную в других файлах? Задача автоматизировать добавление некоторых кусков...

284
При большой нагрузке получаю SQLSTATE[HY000] [2003] Can&#39;t connect to MySQL server on

При большой нагрузке получаю SQLSTATE[HY000] [2003] Can't connect to MySQL server on

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

240
одновременная передача данных

одновременная передача данных

Согласно документации одной из бирж криптовалют для создания ордера я использую такой код

217