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ção
Conceitos
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:mongobin
$ mongod --dbpath C:dotnetprojectsbuscadordata
MongoDB
Subindo o cliente:
C:mongobin> 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.cs
public 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!

Mecanismo de busca .NET Core + MongoDB