Upload
luiz-fernando-duarte-jr
View
2.632
Download
1
Embed Size (px)
Citation preview
Mecanismo de busca com .NET Core + MongoDB
Apresentação
Conceitos Fundamentais
MongoDB
.NET Core
Referências
Dúvidas
Cronograma
Ciência da Computação
Computação Móvel
Dev, analista, gerente...
11 anos programando
- 7 anos com mecanismos de busca
- 3 buscadores no ar
- inúmeros projetos
Conceitos Fundamentais
Fonte de Dados
Classificação
Indexação
Pesquisa
AtualizaçãoConceitos
Fundamentais
1. Fonte de Dados
- Carga de dados
- crawling
- SQL
2. Classificação
- redes neurais
- machine learning
- rankings
- NoSQL?
3. Indexação
- normalização
- tagging
- inverted index
- stopwords, sinônimos
- NoSQL!
4. Pesquisa
- normalização
- tagging
- inverted index
- stopwords, sinônimos
- resultados
5. Atualização
- index rebuild?
- live update?
- Redis…
- MongoDB!
MongoDB
MongoDB
Onde baixo?http://mongodb.org
O que mais vou precisar?GUI Mongo: http://studio3t.com (opcional)
- free
- tenha RAM de sobra
- orientado a documentos
- schemaless
- array fields
- indexed array fields
MongoDB
Subindo servidor:
$ cd C:\mongo\bin
$ mongod --dbpath C:\dotnetprojects\buscador\data
MongoDB
Subindo o cliente:
C:\mongo\bin> mongo
MongoDB
Carga de dados:use searchengine
custArray = [{"Nome":"Luiz Júnior", "Profissao":"Professor", "Tags":["LUIZ","JUNIOR","PROFESSOR"]}, {"Nome":"Luiz Fernando", "Profissao":"Autor", "Tags": ["LUIZ","FERNANDO","AUTOR"]}, {"Nome":"Luiz Tools", "Profissao":"Blogueiro", "Tags": ["LUIZ","TOOLS","BLOGUEIRO"]}, {"Nome":"Luiz Duarte", "Profissao":"Blogueiro", "Tags": ["LUIZ","DUARTE","BLOGUEIRO"]}]db.Customer.insert(custArray);
MongoDB
Índice:
db.Customer.createIndex({"Tags":1});
.NET Core
.NET Core
Vantagens:multiplataforma, veloz, escala, velocidade e baixo custo, C#
Desvantagens:imaturidade, falta muita biblioteca ainda
.NET Core
Onde baixo?https://www.microsoft.com/net/core
Como verifico se está funcionando?dotnet --version
O que mais vou precisar?Visual Studio Community (opcional)
https://www.visualstudio.com/pt-br/downloads/
.NET Core
Criando o projeto:
.NET Core
customizando shared/_Layout.cshtml:<li><a asp-area="" asp-controller="Home" asp-action="Search">Search</a></li>
customizando Views/Home/Search.cshtml:
<div class="row" style="margin-top: 20px"> <form method="GET" action="/Home/Search"> <p><label>Pesquisa: <input type="text" name="q" /></label></p> <p><input type="submit" value="Pesquisar" class="btn btn-primary" /></p> </form></div>
.NET Core
Dependência MongoDB:
.NET Core
customizando Models/Customer.cs: public class Customer { [BsonId] public ObjectId Id { get; set; } [BsonRequired] [BsonElement("Nome")] public string Nome { get; set; }
public string Profissao { get; set; } public List<string> Tags { get; set; } }
.NET Core
customizando Models/DataAccess.cs:public class DataAccess{ MongoClient _client; IMongoDatabase _db;
public DataAccess() { _client = new MongoClient("mongodb://localhost:27017"); _db = _client.GetDatabase("searchengine"); }
public long CountCustomers(){ return _db.GetCollection<Customer>(typeof(Customer).Name).Count(new FilterDefinitionBuilder<Customer>().Empty); }
.NET Core
Teste para ver se funciona:// HomeController.cspublic IActionResult Search(){ ViewData["Message"] = "Search page."; ViewData["Count"] = new DataAccess().CountCustomers(); return View();}
<!-- Search.cshtml --><p>@Html.Raw(ViewData["Count"]) clientes cadastrados!</p>
.NET Core
customizando Models/DataAccess.cs:public IEnumerable<Customer> GetCustomers(string query){ var tags = query.ToUpper().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).ToList(); var filter = Builders<Customer>.Filter.All(c => c.Tags, tags); return _db.GetCollection<Customer>(typeof(Customer).Name).Find(filter).ToList();}
.NET Core
customizando HomeController.cs: public IActionResult Search(String q) { ViewData["Message"] = "Search page."; var da = new DataAccess(); ViewData["Count"] = da.CountCustomers();
if(!String.IsNullOrEmpty(q)) { return View(da.GetCustomers(q)); }
return View(); }
.NET Core
customizando Search.cshtml:
<hr /> @if(Model != null) { <ul> @foreach(var item in Model) { <li>@Html.DisplayFor(modelItem => item.Nome)</li> } </ul> }
Referências
Dúvidas?
Obrigado!