欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Elasticsearch.Net使用入門教程(1)

 更新時(shí)間:2016年11月19日 11:54:24   作者:天風(fēng)隼  
這篇文章主要為大家詳細(xì)介紹了Elasticsearch.Net使用入門教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Elasticsearch.Net使用教程,供大家參考,具體內(nèi)容如下

首先去官網(wǎng)下載Elasticsearch 2.3.4安裝包,解壓后,在cmd命令行進(jìn)入安裝目錄,再進(jìn)入 bin目錄,運(yùn)行elasticsearch.bat命令。

elasticsearch插件elasticsearch-head安裝:

bin目錄下執(zhí)行命令plugin -install mobz/elasticsearch-head

然后開始.net編程,構(gòu)建控制臺應(yīng)用程序

Program.cs代碼如下:

class Program 
 { 
  static void Main(string[] args) 
  { 
   Console.WriteLine("*Program 開始運(yùn)行 : " + DateTime.Now); 
   var business = new Business(); 
 
   var swRead = new Stopwatch(); 
   //swRead.Start(); 
   //business.AddToDb();//sqlserver數(shù)據(jù)庫增加數(shù)據(jù) 
   //swRead.Stop(); 
   //Console.WriteLine("DB 寫入時(shí)間 : " + swRead.ElapsedMilliseconds); 
 
   //swRead.Reset(); 
   //swRead.Start(); 
   //business.AddToElasticIndex(); 
   //swRead.Stop(); 
   //Console.WriteLine("ES 寫入時(shí)間 : " + swRead.ElapsedMilliseconds); 
    
   var sw = new Stopwatch(); 
   sw.Start(); 
   var personsFromDB = business.GetFromDB(); 
   sw.Stop(); 
   Console.WriteLine("DB 讀時(shí)間 : " + sw.ElapsedMilliseconds); 
    
   sw.Reset(); 
   sw.Start(); 
   var personsFromEs = business.GetFromES(); 
   sw.Stop(); 
   Console.WriteLine("ES 讀時(shí)間 : " + sw.ElapsedMilliseconds); 
 
   Console.ReadLine(); 
  } 
 } 

BLL層的Business.cs類:

public class Business 
 { 
  private List<PersonDetail> _personList = new List<PersonDetail>(); 
   
  //SQLSERVER數(shù)據(jù)庫 
  PersonDbProvider dbProvider = new PersonDbProvider(); 
 
  //ElasticSearch 
  ESProvider esProvider = new ESProvider(); 
 
  public void AddToDb() 
  { 
   _personList = Util.Get10000PersonDetails();//輔助類,生成10000條數(shù)據(jù) 
 
   foreach (var personDetail in _personList) 
   { 
    dbProvider.AddPerson(personDetail); 
   } 
  } 
 
  public void AddToElasticIndex() 
  { 
   _personList = Util.Get10000PersonDetailsWithID(); 
   foreach (var personDetail in _personList) 
   { 
    esProvider.Index(personDetail); 
   } 
  } 
 
  public List<PersonDetail> GetFromDB() 
  { 
   return dbProvider.GetAllPersonDetails(); 
  } 
 
  public List<PersonDetail> GetFromES() 
  { 
   return esProvider.GetAll(); 
  } 
 
 } 

PersonDbProvider.cs和ElasticSearchProvider.cs以及Util.cs,Setting.cs類:

public class PersonDbProvider 
 { 
  public bool AddPerson(PersonDetail personDetail) 
  { 
   try 
   { //數(shù)據(jù)庫上下文 
    using (var db = new PersonContext()) 
    { 
     db.PersonDetails.Add(personDetail); 
     db.SaveChanges(); 
     return true; 
    } 
   } 
   catch (Exception) 
   { 
    return false; 
   } 
  } 
 
  public List<PersonDetail> GetAllPersonDetails() 
  { 
   try 
   { 
    using (var db = new PersonContext()) 
    { 
     return db.PersonDetails.ToList(); 
    } 
   } 
   catch (Exception) 
   { 
    return null; 
   } 
  } 
 } 
public class ESProvider 
 { 
  public static ElasticClient client = new ElasticClient(Setting.ConnectionSettings); 
 
  public bool Index(PersonDetail person) 
  { 
   var client = new ElasticClient(Setting.ConnectionSettings); 
   try 
   { 
    //添加數(shù)據(jù) 
    //在調(diào)用下面的index方法的時(shí)候,如果沒有指定使用哪個(gè)index,ElasticSearch會直接使用我們在setting中的defaultIndex,如果沒有,則會自動創(chuàng)建 
    var index = client.Index(person); 
    return index.Created; 
   } 
   catch (Exception ex) 
   { 
    Console.WriteLine(" Excepton Message : " + ex.Message); 
   } 
   return false; 
  } 
 
 
  public List<PersonDetail> GetAll() 
  { 
   var searchResults = client.Search<PersonDetail>(s => s 
    .From(0) 
    .Size(10000) 
    ); 
   return searchResults.Documents.ToList(); 
  } 
 
  public List<PersonDetail> GetEntities(string keyword) 
  { 
   var client = new ElasticClient(Setting.ConnectionSettings); 
 
   #region 全文搜索 
 
   keyword = String.Format("*{0}*", keyword); 
   //默認(rèn)的Operator是Or,當(dāng)keyword是類似于"One Two"之類的中間有空格的時(shí)候,會被當(dāng)成兩個(gè)關(guān)鍵詞搜索,然后搜索結(jié)果進(jìn)行or運(yùn)算 
   //所以我們需要根據(jù)需求來調(diào)整Operator 
   var searchResults = client.Search<PersonDetail>(s => s 
    .Index("elastic-search-app") 
    .Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.And))) 
    ); 
 
   //-------------------------------------------------------------------------------------- 
   //另外由于ES是分詞搜索,所以當(dāng)我們要用"One"來搜索完整的單詞"JustOne"的時(shí)候,就必須在"One"外面添加**,類似于SQL里面的%keyword%,但是這樣的做法會導(dǎo)致在用完整的單詞來搜索的時(shí)候搜索不到結(jié)果,所以我們需要使用下面的方式 
 
   //wholeKeyword = keyword; 
   //keyword = String.Format("*{0}*", keyword); 
   //QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And }; 
   //if (!String.IsNullOrEmpty(wholeKeyword)) 
   //{ 
   // QueryContainer wholeWordQuery = new QueryStringQuery() { Query = wholeKeyword }; 
   // query = query || wholeWordQuery; 
   //} 
   //var searchResults = client.Search<Person>(s => s 
   // .Index("zhixiao-application") 
   // .Query(query) 
   //); 
 
   #endregion 
 
   #region 指定屬性搜索 
 
   //使用term Query 
   //Term是一個(gè)被索引的精確值,也就是說Foo, foo, FOO是不相等的,因此 
   //在使用term query的時(shí)候要注意,term query在搜索的Field已經(jīng)被索引的時(shí)候,是不支持大寫的。 
   // QueryContainer query2 = new TermQuery { Field = item.Key, Value = item.Value.ToLower() }; 
   //-------------------------------------------------------------------------------------- 
   //var searchResults = client.Search<PersonDetail>(s => s 
   // .Index("elastic-search-app") 
   // .Query(q => q.Term(t => t.OnField(f => f.LastName == "keyword"))) 
   //); 
   //效果同上 
   //QueryContainer termQuery = new TermQuery { Field = "lastname", Value = "keyword" }; 
   //var searchResults = client.Search<PersonDetail>(s => s 
   // .Index("elastic-search-app") 
   // .Query(termQuery) 
   //); 
   //-------------------------------------------------------------------------------------- 
   //使用 Query String query 
   //QueryString query一般用于全文搜索,但是也可以用于單個(gè)屬性的搜索(設(shè)置DefaultField屬性),queryString query可以不區(qū)分大小寫。QueryString還有一個(gè)好處就是我們可以搜索一個(gè)term中的一部分, 
   //例如lastname為"t Boterhuis 1",那么我們可以用"terhuis"搜索到這個(gè)數(shù)據(jù)(雖然需要在外面包上**),在term query里面就做不到,因?yàn)镋S把每一個(gè)屬性的值都分析成一個(gè)個(gè)單獨(dú)的term,提高了搜索的效率。 
   //keyword = "t Boterhuis 2"; 
   //QueryContainer wholeWordQuery = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And }; 
   //var searchResults = client.Search<PersonDetail>(s => s 
   // .Index("elastic-search-app") 
   // .Query(wholeWordQuery) 
   //); 
 
   #endregion 
 
   return searchResults.Documents.ToList(); 
  } 
 
  public List<PersonDetail> Sort(string keyword) 
  { 
   // 首先我們把原先的索引先刪除了 
   var response = 
    client.DeleteIndex( 
     new DeleteIndexRequest(new IndexNameMarker() 
     { 
      Name = "elastic-search-app", 
      Type = typeof(PersonDetail) 
     })); 
 
   //然后重新創(chuàng)建索引 
   var indexResult = client.CreateIndex("PD-application"); 
   var response1 = client.Map<PersonDetail>(m => m.MapFromAttributes()); 
   IEnumerable<PersonDetail> persons = new List<PersonDetail> 
   { 
    new PersonDetail() 
    { 
     Id = 4, 
     FirstName = "Boterhuis-040", 
     LastName = "Gusto-040", 
    }, 
    new PersonDetail() 
    { 
     Id = 5, 
     FirstName = "sales@historichousehotels.com", 
     LastName = "t Boterhuis 1", 
    }, 
    new PersonDetail() 
    { 
     Id = 6, 
     FirstName = "Aberdeen #110", 
     LastName = "sales@historichousehotels.com", 
    }, 
    new PersonDetail() 
    { 
     Id = 7, 
     FirstName = "Aberdeen #110", 
     LastName = "t Boterhuis 2", 
    }, 
   }; 
   foreach (var person in persons) 
   { 
    client.Index(person); 
   } 
   var searchResults = client.Search<PersonDetail>(s => s 
    .Index("PD-application") 
    .Sort(sort => sort.OnField(f => f.Id).Order(SortOrder.Ascending)) 
 
   ); 
   return searchResults.Documents.ToList(); 
  } 
 } 
public static class Util 
 { 
 
  //生成10000條sqlserver測試數(shù)據(jù) 
  public static List<PersonDetail> Get10000PersonDetails() 
  { 
   var personDetailsList = new List<PersonDetail>(); 
    
   for (int i = 0; i < 10000; i++) 
   { 
    personDetailsList.Add(new PersonDetail() 
    { 
     FirstName = "FN" + new Random().Next(int.MaxValue), 
     LastName = "LN" + new Random().Next(int.MaxValue) 
    }); 
   } 
   return personDetailsList; 
  } 
 
  //生成10000條ElasticSearch測試數(shù)據(jù) 
  public static List<PersonDetail> Get10000PersonDetailsWithID() 
  { 
   var personDetailsList = new List<PersonDetail>(); 
    
   for (int i = 0; i < 10000; i++) 
   { 
    personDetailsList.Add(new PersonDetail() 
    { 
     Id = i * new Random().Next(99), 
     FirstName = "FN" + new Random().Next(int.MaxValue), 
     LastName = "LN" + new Random().Next(int.MaxValue) 
    }); 
   } 
   return personDetailsList; 
  } 
 
 } 
public static class Setting 
 { 
  public static Uri Node 
  { 
   get 
   { 
    return new Uri("http://localhost:9200"); 
   } 
  } 
  //連接配置 
  public static ConnectionSettings ConnectionSettings 
  { 
   get 
   { 
    return new ConnectionSettings(Node, defaultIndex: "es-index-app"); 
   } 
  } 
 
 } 

Model層代碼:

public partial class PersonDetail 
 { 
  public long Id { get; set; } 
  public string FirstName { get; set; } 
  public string LastName { get; set; } 
 } 
public partial class PersonContext : DbContext 
 { 
  static PersonContext() 
  { 
   Database.SetInitializer<PersonContext>(null); 
  } 
 
  public PersonContext() 
   : base("Name=PersonContext") 
  { 
  } 
 
  public DbSet<PersonDetail> PersonDetails { get; set; } 
 
  protected override void OnModelCreating(DbModelBuilder modelBuilder) 
  { 
   //在重寫OnModelCreating方法中則可以直接調(diào)用映射類,從而減少了OnModelCreating方法的復(fù)雜度,同時(shí)也增強(qiáng)了代碼維護(hù)的可讀性 
   modelBuilder.Configurations.Add(new PersonDetailMap()); //屬性映射約定 
  } 
 } 
//Fluent API配置Configuration映射類 
 public class PersonDetailMap : EntityTypeConfiguration<PersonDetail> 
 { 
  public PersonDetailMap() 
  { 
   // 主鍵 
   this.HasKey(t => new { t.Id, t.FirstName, t.LastName }); 
 
   // 屬性 
   this.Property(t => t.Id) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
 
   this.Property(t => t.FirstName) 
    .IsRequired(); 
 
   this.Property(t => t.LastName) 
    .IsRequired(); 
 
   // 表 & 列 映射 
   this.ToTable("PersonDetails"); 
   this.Property(t => t.Id).HasColumnName("Id"); 
   this.Property(t => t.FirstName).HasColumnName("FirstName"); 
   this.Property(t => t.LastName).HasColumnName("LastName"); 
  } 
 } 

sqlserver腳本:

USE [Person] 
GO 
 
SET ANSI_NULLS ON 
GO 
 
SET QUOTED_IDENTIFIER ON 
GO 
 
CREATE TABLE [dbo].[PersonDetails]( 
 [Id] [bigint] IDENTITY(1,1) NOT NULL, 
 [FirstName] [nvarchar](max) NOT NULL, 
 [LastName] [nvarchar](max) NOT NULL 
) ON [PRIMARY] 
 
GO 

結(jié)果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • asp.net實(shí)現(xiàn)調(diào)用帶有輸出參數(shù)的存儲過程實(shí)例

    asp.net實(shí)現(xiàn)調(diào)用帶有輸出參數(shù)的存儲過程實(shí)例

    這篇文章主要介紹了asp.net實(shí)現(xiàn)調(diào)用帶有輸出參數(shù)的存儲過程,結(jié)合實(shí)例形式分析了前端基于jQuery的ajax調(diào)用及后臺存儲過程調(diào)用的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • 在ASP.NET Core Mvc集成MarkDown的方法

    在ASP.NET Core Mvc集成MarkDown的方法

    這篇文章主要介紹了在ASP.NET Core Mvc集成MarkDown的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 如何限制asp.net中上傳文件的大小的代碼

    如何限制asp.net中上傳文件的大小的代碼

    maxRequestLength是控制上傳大小得參數(shù)請求的最大大?。ㄒ郧ё止?jié)為單位)
    2011-10-10
  • .NET中基于事件的異步模式-EAP

    .NET中基于事件的異步模式-EAP

    從.NET 4.5開始,支持的三種異步編程模式:基于事件的異步編程設(shè)計(jì)模式、異步編程模型、基于任務(wù)的編程模型,感興趣的朋友可以參考下
    2013-01-01
  • .NET中獲取程序根目錄的常用方法介紹

    .NET中獲取程序根目錄的常用方法介紹

    這篇文章主要介紹了.NET中獲取程序根目錄的常用方法有哪些,具體都有什么功能,需要的朋友可以參考下
    2014-06-06
  • Visual Studio 2013更新內(nèi)容簡介

    Visual Studio 2013更新內(nèi)容簡介

    這篇文章主要為大家分享了Visual Studio 2013更新內(nèi)容簡介,感興趣的小伙伴們可以參考一下
    2016-05-05
  • MVC、MVP和MVVM分別是什么_動力節(jié)點(diǎn)Java學(xué)院整理

    MVC、MVP和MVVM分別是什么_動力節(jié)點(diǎn)Java學(xué)院整理

    MVC,MVP 和 MVVM分別是什么?MVC(Model-View-Controller)是最常見的軟件架構(gòu)之一,業(yè)界有著廣泛應(yīng)用。它本身很容易理解,但是要講清楚,它與衍生的 MVP 和 MVVM 架構(gòu)的區(qū)別就不容易了。
    2017-08-08
  • ASP.NET比較常用的26個(gè)性能優(yōu)化技巧

    ASP.NET比較常用的26個(gè)性能優(yōu)化技巧

    這篇文章主要給大家介紹asp.net中比較常用的26個(gè)性能優(yōu)化技巧,主要設(shè)計(jì)到asp.net中常用的26個(gè)性能優(yōu)化方面的內(nèi)容,對于asp.net中常用的26個(gè)性能優(yōu)化技巧感興趣的朋友可以參考下本篇文章
    2015-10-10
  • 近幾天對DataSet的新認(rèn)識

    近幾天對DataSet的新認(rèn)識

    近幾天對DataSet的新認(rèn)識...
    2007-04-04
  • WPF依賴屬性用法詳解

    WPF依賴屬性用法詳解

    本文詳細(xì)講解了WPF依賴屬性的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02

最新評論