当前位置: 移动技术网 > IT编程>开发语言>.net > Elasticsearch.Net使用教程 MVC4图书管理系统(2)

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

八方来财树,电视背景墙壁纸,baidutv

本文实例为大家分享了mvc4图书管理系统的制作教程,供大家参考,具体内容如下

首先项目结构图:

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 dbset<book> books { get; set; } 
 } 

viewmodels的相关:

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

接下来就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>(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); 
 } 
 } 

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

views视图
books文件夹下:
index.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> 

edit.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") 
} 

details.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> 

delete.cshtml:

@model library.web.models.book 
 
@{ 
 viewbag.title = "delete"; 
 layout = "~/views/shared/_layout.cshtml"; 
} 
 
<h2>delete</h2> 
 
<h3>are you sure you want to delete this?</h3> 
<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> 
 
 @using (html.beginform()) { 
 @html.antiforgerytoken() 
 
 <div class="form-actions no-color"> 
  <input type="submit" value="delete" class="btn btn-default" /> | 
  @html.actionlink("返回列表", "index") 
 </div> 
 } 
</div> 

create.cshtml:

@model library.web.models.book 
 
@{ 
 viewbag.title = "create"; 
 layout = "~/views/shared/_layout.cshtml"; 
} 
 
<h2>创建</h2> 
 
 
@using (html.beginform()) 
{ 
 @html.antiforgerytoken() 
 
 <div class="form-horizontal"> 
 <h4>book</h4> 
 <hr /> 
 @html.validationsummary(true) 
 
 <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="创建" class="btn btn-default" /> 
  </div> 
 </div> 
 </div> 
} 
 
<div> 
 @html.actionlink("回到列表", "index") 
</div> 
 
@section scripts { 
 @scripts.render("~/bundles/jqueryval") 
} 

home->index.cshtml

@model library.web.viewmodels.searchviewmodel 
@{ 
 viewbag.title = "elasticsearch"; 
} 
 
<div class="jumbotron"> 
 <h1>elasticsearch入门</h1> 
 <p class="lead">安装和配置群集</p> 
 <ol> 
 <li> 
  <a href="http://www.oracle.com/technetwork/java/ 
javase/downloads/">安装java</a> 
 </li> 
 <li> 
  <a href="http://www.elasticsearch.org/ 
download/">安装elasticsearch</a> 
 </li> 
 <li>运行elasticsearch</li> 
 <li><a href="/books/create">增加一些书籍</a></li> 
 </ol> 
</div> 
 
 
@if (model == null) 
{ 
 return; 
} 
<div style="margin-top: 30px;"> 
 @if (model.suggestions.any(x => x.key == "did-you-mean")) 
 { 
 <span>你的意思是: </span> 
 foreach (var suggestions in model.suggestions["did-you-mean"]) 
 { 
  var count = 0; 
  foreach (var suggestion in suggestions.options) 
  { 
  <a href="/home/search?query=@suggestion.text"><strong>@suggestion.text </strong> </a> 
  count++; 
  } 
  if (count == 0) 
  { 
  <span class="alert-danger">没有建议!</span> 
  } 
 
 } 
 } 
</div> 
 
<h3><strong>results for:</strong> @model.query</h3> 
 
@if (model != null) 
{ 
 <table class="table table-condensed"> 
 <thead> 
  <tr><th>文档的分数(排名相关度)</th><th>title</th><th>content</th><th>author</th></tr> 
 </thead> 
 
 <tbody> 
  @foreach (var result in model.results) 
  { 
  <tr> 
   <td>@result.score</td> 
   <td> 
   <a href="/books/details/@result.id"> 
    @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); 
    } 
   </a> 
   </td> 
 
   <td> 
   @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 + "..."); 
    } 
   } 
 
   </td> 
 
   <td>@result.source.author</td> 
  </tr> 
 
  } 
  @if (!model.results.any()) 
  { 
  <tr> 
   <td colspan="4" class="alert alert-danger" style="text-align:center;">没有结果发现:(</td> 
  </tr> 
  } 
 </tbody> 
 
 </table> 
 <h4><span class="label label-default">@model.results.count()</span>搜索结果用了 @model.elapsed 毫秒</h4> 
} 

_layout.cshtml

<!doctype html> 
<html> 
<head> 
 <meta charset="utf-8" /> 
 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 <title>@viewbag.title</title> 
 @styles.render("~/content/css") 
 @scripts.render("~/bundles/modernizr") 
 
</head> 
<body> 
 <div class="navbar navbar-inverse navbar-fixed-top"> 
 <div class="container"> 
  <div class="navbar-header"> 
  <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> 
   <span class="icon-bar"></span> 
   <span class="icon-bar"></span> 
   <span class="icon-bar"></span> 
  </button> 
  @html.actionlink("elasticsearch mvc示例", "index", "home", null, new { @class = "navbar-brand" }) 
  </div> 
  <div class="navbar-collapse collapse"> 
  <ul class="nav navbar-nav"> 
   <li>@html.actionlink("home", "index", "home")</li> 
   <li>@html.actionlink("books", "index", "books")</li> 
  </ul> 
 
 
  @using (html.beginform("search", "home", formmethod.get,new {@class = "navbar-form navbar-left"})) 
  { 
   <div class="form-group"> 
   <input class="form-control" type="text" placeholder="搜索" name="query" /> 
   </div> 
   <button type="submit" class="btn btn-default">提交</button> 
  } 
 
 
 
  </div> 
 
 </div> 
 </div> 
 <div class="container body-content"> 
 @renderbody() 
 <hr /> 
 <footer> 
  <p>© @datetime.now.year - elasticsearch, nest, asp.net 应用</p> 
 </footer> 
 </div> 
 
 @scripts.render("~/bundles/jquery") 
 @scripts.render("~/bundles/bootstrap") 
 @rendersection("scripts", required: false) 
</body> 
</html> 

结果如图:


列表页


创建页:


搜索结果页:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网