Как построить поисковик в C # - PullRequest
10 голосов
/ 29 мая 2010

Я пытаюсь создать веб-приложение в ASP.NET MVC, и мне нужно создать довольно сложную функцию поиска. Когда пользователь вводит поисковый запрос, я хочу выполнить поиск во множестве источников данных, которые включают документы, таблицы в базе данных, URL-адреса веб-страниц и некоторые API, например, Facebook. Будем весьма благодарны за любые советы, уроки и подсказки.

Ответы [ 3 ]

16 голосов
/ 29 мая 2010

Ваш вопрос говорит о том, что вы, вероятно, не планируете реализовать всю функцию с нуля, поэтому вот несколько ссылок, которые могут оказаться полезными.

  • Один (самый простой) вариант - использовать стороннюю поисковую систему (например, Пользовательский поиск Google , но Bing, вероятно, имеет аналогичный API). Это позволяет вам искать (только) свою страницу с помощью Google и отображать результаты индивидуально. Ограничение состоит в том, что он ищет только данные, отображаемые на некоторых (связанных) страницах.

  • Более сложный подход заключается в использовании некоторой библиотеки .NET, которая реализует индексирование для вас (на основе данных, которые вы предоставляете). Популярной библиотекой является, например, Lucene.Net . В этом случае вы даете ему данные, которые вы хотите явно искать (релевантный контент с веб-страниц, содержимое базы данных и т. Д.), Чтобы у вас был больший контроль над тем, что ищется (но это немного больше работы).

5 голосов
/ 29 мая 2010

Построение фактических структур и алгоритмов индекса поиска не является тривиальным подвигом. Вот почему люди используют Lucene, Sphinx, Solr и т. Д. Использование google.com, как рекомендовано в комментариях, не даст вам никакого контроля и плохого соответствия по сравнению с тем, что вы получите от одной из этих бесплатных поисковых систем, если правильно настроить б.

Я рекомендую взглянуть на Solr , он дает вам мощь Lucene, но его гораздо проще использовать, плюс он добавляет несколько удобных функций, таких как кэширование, шардинг, огранка и т. Д.

SolrNet - это клиент Solr для .Net, у него есть пример приложения ASP.NET MVC, который вы можете использовать, чтобы увидеть, как он работает, и в качестве основы для вашего проекта.

Отказ от ответственности: я автор SolrNet.

2 голосов
/ 04 июня 2013

Я написал специальную поисковую систему для своего сайта MVC 4. Он анализирует каталоги View и считывает все файлы .cshtml, сопоставляя предоставленные термины с регулярным выражением. Вот основной код:

List<string> results = new List<string>();
        DirectoryInfo di = new DirectoryInfo(System.Configuration.ConfigurationManager.AppSettings["PathToSearchableViews"]);
        //get all view directories except the shared
        foreach (DirectoryInfo d in di.GetDirectories().Where(d=>d.Name != "Shared"))
        {
            //get all the .cshtml files
            foreach (FileInfo fi in d.GetFiles().Where(e=>e.Extension  == ".cshtml"))
            {
                //check if cshtml file and exclude partial pages
                if (fi.Name.Substring(0,1) != "_")
                {
                    MatchCollection matches;
                    bool foundMatch = false;
                    int matchCount = 0;
                    using (StreamReader sr = new StreamReader(fi.FullName))
                    {
                        string file = sr.ReadToEnd();
                        foreach (string word in terms)
                        {
                            Regex exp = new Regex("(?i)" + word.Trim() + "(?-i)");
                            matches = exp.Matches(file);
                            if (matches.Count > 0)
                            {
                                foundMatch = true;
                                matchCount = matches.Count;
                            }
                        }
                        //check match count and create links
                        //
                        //
                    }
                }
            }
        }
        return results;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...