Mecanismo de busca .NET Core + MongoDB

Post on 21-Jan-2018

2.632 views 1 download

Transcript of Mecanismo de busca .NET Core + MongoDB

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!