這篇文章主要介紹了Elasticsearch.Net如何實現MVC4圖書管理系統(tǒng),具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)是一家專注于做網站、成都網站制作與策劃設計,柘城網站建設哪家好?創(chuàng)新互聯(lián)做網站,專注于網站建設10多年,網設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:柘城等地區(qū)。柘城做網站價格咨詢:18980820575首先項目結構圖:
Model層的相關代碼如下:
Book.cs代碼如下:
public class Book { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } [MaxLength(500)] [Display(Name = "標題")] public string Title { get; set; } [MaxLength(5000)] [Display(Name = "前言")] public string Foreword { get; set; } [Display(Name = "總頁數")] public int Pages { get; set; } [Display(Name = "作者")] public string Author { get; set; } }
public class AppContext:DbContext { public AppContext() { } public DbSetBooks { get; set; } }
ViewModels的相關:
public class SearchViewModel { public string Query { get; set; } public IEnumerable> Results { get; set; } public IDictionary Suggestions { get; set; } public long Elapsed { get; set; } }
接下來就HomeController.cs和BooksController.cs的代碼:
public class HomeController : Controller { private SearchService _searchService; public HomeController() { _searchService = new SearchService(); } public ActionResult Index() { return View(); } public ActionResult Search(string query, int page = 0, int pageSize = 10) { var result = _searchService.Find(query, page, pageSize); var suggestion = _searchService.FindPhraseSuggestion(query, 0, 3); var viewModel = new SearchViewModel { Query = query, Results = result.Item1,Elapsed = result.Item2, Suggestions = suggestion }; return View("Index", viewModel); } }
public class BooksController : Controller { private AppContext db = new AppContext(); public ActionResult Index() { return View(db.Books.ToList()); } public ActionResult Details(Guid? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Book book = db.Books.Find(id); if (book == null) { return HttpNotFound(); } return View(book); } public ActionResult Create() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include="Id,Title,Foreword,Pages,Author")] Book book) { if (ModelState.IsValid) { book.Id = Guid.NewGuid(); db.Books.Add(book); db.SaveChanges(); //添加書 Elasticsearch.Elasticsearch.Client.Index(book); return RedirectToAction("Index"); } return View(book); } public ActionResult Edit(Guid? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Book book = db.Books.Find(id); if (book == null) { return HttpNotFound(); } return View(book); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include="Id,Title,Foreword,Pages,Author")] Book book) { if (ModelState.IsValid) { db.Entry(book).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(book); } public ActionResult Delete(Guid? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Book book = db.Books.Find(id); if (book == null) { return HttpNotFound(); } return View(book); } [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public ActionResult DeleteConfirmed(Guid id) { Book book = db.Books.Find(id); db.Books.Remove(book); db.SaveChanges(); return RedirectToAction("Index"); } public JsonResult Reindex() { foreach (var book in db.Books) { //Indexing book Elasticsearch.Elasticsearch.Client.Index (book); } return Json("OK",JsonRequestBehavior.AllowGet); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } }
Elasticsearch輔助類:
首先是Elasticsearch.cs
public class Elasticsearch { private static ElasticClient _client; public static ElasticClient Client { get { if (_client == null) { //連接配置 var setting = new ConnectionSettings(ElasticsearchConfiguration.Connection,ElasticsearchConfiguration.DefaultIndex); _client = new ElasticClient(setting); } return _client; } } }
ElasticsearchConfiguration.cs類
public static class ElasticsearchConfiguration { public static string Host { get { return "http://localhost"; } } public static long Port { get { return 9200; } } public static Uri Connection { get { return new Uri(string.Format("{0}:{1}", Host, Port)); } } public static string DefaultIndex { get { return "library"; } } }
SearchService.cs代碼:
public class SearchService { public double MinScore { get {return 0.0005; }} //高亮標記前綴 public string PreHighlightTag { get { return @""; } } //高亮標記后綴 public string PostHighlightTag { get { return @""; } } public Tuple< IEnumerable>,long> Find(string query, int page = 0, int pageSize = 10) { var result = Elasticsearch.Elasticsearch.Client.Search (s => s .From(page * pageSize) .Size(pageSize) .MinScore(MinScore) .Highlight(h => h .PreTags(PreHighlightTag) .PostTags(PostHighlightTag) .OnFields( f => f.OnField(b => b.Foreword), f => f.OnField(b => b.Title) )) .Query(q => q.QueryString(qs => qs.Query(query).UseDisMax()))); return new Tuple >, long>(result.Hits,result.ElapsedMilliseconds); } //查找短語建議 public IDictionary FindPhraseSuggestion(string phrase, int page = 0, int pageSize = 5) { var result = Elasticsearch.Elasticsearch.Client.Search (s => s .From(page*pageSize) .Size(pageSize) .SuggestPhrase("did-you-mean", ps => ps .Text(phrase) .OnField(f => f.Foreword)) .Query(q => q.MatchAll())); return result.Suggest; } public IEnumerable > FindAll() { var result = Elasticsearch.Elasticsearch.Client.Search (s => s.AllIndices()); return result.Hits; } }
Views視圖
Books文件夾下:
Index.cshtml:
@model IEnumerable@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } Index
@Html.ActionLink("創(chuàng)建新書", "Create")
@foreach (var item in Model) { @Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.Foreword) @Html.DisplayNameFor(model => model.Pages) @Html.DisplayNameFor(model => model.Author) } @Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.Foreword) @Html.DisplayFor(modelItem => item.Pages) @Html.DisplayFor(modelItem => item.Author) @Html.ActionLink("編輯", "Edit", new { id=item.Id }) | @Html.ActionLink("詳細", "Details", new { id=item.Id }) | @Html.ActionLink("刪除", "Delete", new { id=item.Id })
Edit.cshtml:
@model Library.Web.Models.Book @{ ViewBag.Title = "Edit"; Layout = "~/Views/Shared/_Layout.cshtml"; }Edit
@using (Html.BeginForm()) { @Html.AntiForgeryToken()}Book
@Html.ValidationSummary(true) @Html.HiddenFor(model => model.Id)@Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title)@Html.LabelFor(model => model.Foreword, new { @class = "control-label col-md-2" })@Html.TextAreaFor(model => model.Foreword) @Html.ValidationMessageFor(model => model.Foreword)@Html.LabelFor(model => model.Pages, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.Pages) @Html.ValidationMessageFor(model => model.Pages)@Html.LabelFor(model => model.Author, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.Author) @Html.ValidationMessageFor(model => model.Author)@Html.ActionLink("返回列表", "Index")@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
Details.cshtml:
@model Library.Web.Models.Book @{ ViewBag.Title = "Details"; Layout = "~/Views/Shared/_Layout.cshtml"; }Details
Book
- @Html.DisplayNameFor(model => model.Title)
- @Html.DisplayFor(model => model.Title)
- @Html.DisplayNameFor(model => model.Foreword)
- @Html.DisplayFor(model => model.Foreword)
- @Html.DisplayNameFor(model => model.Pages)
- @Html.DisplayFor(model => model.Pages)
- @Html.DisplayNameFor(model => model.Author)
- @Html.DisplayFor(model => model.Author)
@Html.ActionLink("編輯", "Edit", new { id = Model.Id }) | @Html.ActionLink("返回列表", "Index")
Delete.cshtml:
@model Library.Web.Models.Book @{ ViewBag.Title = "Delete"; Layout = "~/Views/Shared/_Layout.cshtml"; }Delete
Are you sure you want to delete this?
Book
@using (Html.BeginForm()) { @Html.AntiForgeryToken()
- @Html.DisplayNameFor(model => model.Title)
- @Html.DisplayFor(model => model.Title)
- @Html.DisplayNameFor(model => model.Foreword)
- @Html.DisplayFor(model => model.Foreword)
- @Html.DisplayNameFor(model => model.Pages)
- @Html.DisplayFor(model => model.Pages)
- @Html.DisplayNameFor(model => model.Author)
- @Html.DisplayFor(model => model.Author)
| @Html.ActionLink("返回列表", "Index")}
Create.cshtml:
@model Library.Web.Models.Book @{ ViewBag.Title = "Create"; Layout = "~/Views/Shared/_Layout.cshtml"; }創(chuàng)建
@using (Html.BeginForm()) { @Html.AntiForgeryToken()}Book
@Html.ValidationSummary(true)@Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title)@Html.LabelFor(model => model.Foreword, new { @class = "control-label col-md-2" })@Html.TextAreaFor(model => model.Foreword) @Html.ValidationMessageFor(model => model.Foreword)@Html.LabelFor(model => model.Pages, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.Pages) @Html.ValidationMessageFor(model => model.Pages)@Html.LabelFor(model => model.Author, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.Author) @Html.ValidationMessageFor(model => model.Author)@Html.ActionLink("回到列表", "Index")@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
Home->Index.cshtml
@model Library.Web.ViewModels.SearchViewModel @{ ViewBag.Title = "Elasticsearch"; } @if (Model == null) { return; }@if (Model.Suggestions.Any(x => x.Key == "did-you-mean")) { 你的意思是: foreach (var suggestions in Model.Suggestions["did-you-mean"]) { var count = 0; foreach (var suggestion in suggestions.Options) { @suggestion.Text ? count++; } if (count == 0) { 沒有建議! } } }Results for: @Model.Query
@if (Model != null) {
文檔的分數(排名相關度) | Title | Content | Author |
---|---|---|---|
@result.Score | @if (result.Highlights != null && result.Highlights.Any(x => x.Key == "title")) { var hl = result.Highlights.FirstOrDefault(x => x.Key == "title"); foreach (var h in hl.Value.Highlights) { WriteLiteral(h); } } else { WriteLiteral(result.Source.Title); } | @if (result.Highlights != null && result.Highlights.Any(x => x.Key == "foreword")) { var hl = result.Highlights.FirstOrDefault(x => x.Key == "foreword"); foreach (var h in hl.Value.Highlights) { WriteLiteral(h + "..."); } } | @result.Source.Author |
沒有結果發(fā)現:( |
_Layout.cshtml
@ViewBag.Title @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr")@Html.ActionLink("Elasticsearch MVC示例", "Index", "Home", null, new { @class = "navbar-brand" })@using (Html.BeginForm("Search", "Home", FormMethod.Get,new {@class = "navbar-form navbar-left"})) {
- @Html.ActionLink("Home", "Index", "Home")
- @Html.ActionLink("Books", "Index", "Books")
}@RenderBody()@Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false)
結果如圖:
列表頁
創(chuàng)建頁:
搜索結果頁:
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Elasticsearch.Net如何實現MVC4圖書管理系統(tǒng)”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網站建設公司,,關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!