首頁  >  文章  >  後端開發  >  Elasticsearch.Net使用教學 MVC4圖書管理系統(2)

Elasticsearch.Net使用教學 MVC4圖書管理系統(2)

高洛峰
高洛峰原創
2016-12-20 13:53:551626瀏覽

本文實例為大家分享了MVC4圖書管理系統的製作教程,供大家參考,具體內容如下

首先專案結構圖:

Elasticsearch.Net使用教程 MVC4图书管理系统

Model層的相關程式碼如下:
Book.cs代碼如下:

Model層的相關程式碼如下:

ViewModels的相關:

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; } 
 }

接下來就HomeController.cs和BooksController.cs的程式碼:

public class AppContext:DbContext 
 { 
 public AppContext() 
 { 
   
 } 
 public DbSet<Book> Books { get; set; } 
 }
public class SearchViewModel 
 { 
 public string Query { get; set; } 
  
 public IEnumerable<IHit<Book>> Results { get; set; } 
  
 public IDictionary<string, Suggest[]> Suggestions { get; set; } 
  
 public long Elapsed { get; set; } 
  
 }

Elasticsearch輔助類別:

首先是Elasticsearch.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); 
 } 
  
 }

Elasticsearchsearch.

首先是Elasticsearch.cs

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>(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>(book); 
  } 
  return Json("OK",JsonRequestBehavior.AllowGet); 
 } 
  
 protected override void Dispose(bool disposing) 
 { 
  if (disposing) 
  { 
  db.Dispose(); 
  } 
  base.Dispose(disposing); 
 } 
 }
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; 
  } 
  
 } 
 }

Views視圖
Books資料夾下:
Index.cshtml:

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"; } 
 } 
 }

Edit.cshtml:

public class SearchService 
 { 
 public double MinScore { get {return 0.0005; }} 
  
 //高亮标记前缀 
 public string PreHighlightTag 
 { 
  get { return @"<strong>"; } 
 } 
  
 //高亮标记后缀 
 public string PostHighlightTag 
 { 
  get { return @"</strong>"; } 
 } 
  
  
 public Tuple< IEnumerable<IHit<Book>>,long> Find(string query, int page = 0, int pageSize = 10) 
 { 
  var result = Elasticsearch.Elasticsearch.Client.Search<Book>(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<IEnumerable<IHit<Book>>, long>(result.Hits,result.ElapsedMilliseconds); 
 } 
  
 //查找短语建议 
 public IDictionary<string, Suggest[]> FindPhraseSuggestion(string phrase, int page = 0, int pageSize = 5) 
 { 
  var result = Elasticsearch.Elasticsearch.Client.Search<Book>(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<IHit<Book>> FindAll() 
 { 
  var result = Elasticsearch.Elasticsearch.Client.Search<Book>(s => s.AllIndices()); 
  return result.Hits; 
 } 
  
 }

Details.cshtml:

@model IEnumerable<Library.Web.Models.Book> 
  
@{ 
 ViewBag.Title = "Index"; 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
  
<h2>Index</h2> 
  
<p> 
 @Html.ActionLink("创建新书", "Create") 
</p> 
<table class="table"> 
 <tr> 
 <th> 
  @Html.DisplayNameFor(model => model.Title) 
 </th> 
 <th> 
  @Html.DisplayNameFor(model => model.Foreword) 
 </th> 
 <th> 
  @Html.DisplayNameFor(model => model.Pages) 
 </th> 
 <th> 
  @Html.DisplayNameFor(model => model.Author) 
 </th> 
 <th></th> 
 </tr> 
  
@foreach (var item in Model) { 
 <tr> 
 <td> 
  @Html.DisplayFor(modelItem => item.Title) 
 </td> 
 <td> 
  @Html.DisplayFor(modelItem => item.Foreword) 
 </td> 
 <td> 
  @Html.DisplayFor(modelItem => item.Pages) 
 </td> 
 <td> 
  @Html.DisplayFor(modelItem => item.Author) 
 </td> 
 <td> 
  @Html.ActionLink("编辑", "Edit", new { id=item.Id }) | 
  @Html.ActionLink("详细", "Details", new { id=item.Id }) | 
  @Html.ActionLink("删除", "Delete", new { id=item.Id }) 
 </td> 
 </tr> 
} 
  
</table>
cs

.cshtml. .cshtml

@model Library.Web.Models.Book 
  
@{ 
 ViewBag.Title = "Edit"; 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
  
<h2>Edit</h2> 
  
  
@using (Html.BeginForm()) 
{ 
 @Html.AntiForgeryToken() 
  
 <div class="form-horizontal"> 
 <h4>Book</h4> 
 <hr /> 
 @Html.ValidationSummary(true) 
 @Html.HiddenFor(model => model.Id) 
  
 <div class="form-group"> 
  @Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" }) 
  <div class="col-md-10"> 
  @Html.EditorFor(model => model.Title) 
  @Html.ValidationMessageFor(model => model.Title) 
  </div> 
 </div> 
  
 <div class="form-group"> 
  @Html.LabelFor(model => model.Foreword, new { @class = "control-label col-md-2" }) 
  <div class="col-md-10"> 
  @Html.TextAreaFor(model => model.Foreword) 
  @Html.ValidationMessageFor(model => model.Foreword) 
  </div> 
 </div> 
  
 <div class="form-group"> 
  @Html.LabelFor(model => model.Pages, new { @class = "control-label col-md-2" }) 
  <div class="col-md-10"> 
  @Html.EditorFor(model => model.Pages) 
  @Html.ValidationMessageFor(model => model.Pages) 
  </div> 
 </div> 
  
 <div class="form-group"> 
  @Html.LabelFor(model => model.Author, new { @class = "control-label col-md-2" }) 
  <div class="col-md-10"> 
  @Html.EditorFor(model => model.Author) 
  @Html.ValidationMessageFor(model => model.Author) 
  </div> 
 </div> 
  
 <div class="form-group"> 
  <div class="col-md-offset-2 col-md-10"> 
  <input type="submit" value="Save" class="btn btn-default" /> 
  </div> 
 </div> 
 </div> 
} 
  
<div> 
 @Html.ActionLink("返回列表", "Index") 
</div> 
  
@section Scripts { 
 @Scripts.Render("~/bundles/jqueryval") 
}

_Layout.cshtml

@model Library.Web.Models.Book 
  
@{ 
 ViewBag.Title = "Details"; 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
  
<h2>Details</h2> 
  
<div> 
 <h4>Book</h4> 
 <hr /> 
 <dl class="dl-horizontal"> 
 <dt> 
  @Html.DisplayNameFor(model => model.Title) 
 </dt> 
  
 <dd> 
  @Html.DisplayFor(model => model.Title) 
 </dd> 
  
 <dt> 
  @Html.DisplayNameFor(model => model.Foreword) 
 </dt> 
  
 <dd> 
  @Html.DisplayFor(model => model.Foreword) 
 </dd> 
  
 <dt> 
  @Html.DisplayNameFor(model => model.Pages) 
 </dt> 
  
 <dd> 
  @Html.DisplayFor(model => model.Pages) 
 </dd> 
  
 <dt> 
  @Html.DisplayNameFor(model => model.Author) 
 </dt> 
  
 <dd> 
  @Html.DisplayFor(model => model.Author) 
 </dd> 
  
 </dl> 
</div> 
<p> 
 @Html.ActionLink("编辑", "Edit", new { id = Model.Id }) | 
 @Html.ActionLink("返回列表", "Index") 
</p>

結果如圖:

列表頁

Elasticsearch.Net使用教程 MVC4图书管理系统

創建頁:點: ,也希望大家多多支持PHP中文網。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn