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

本文实例为大家分享了Elasticsearch.Net使用教程,供大家参考,具体内容如下

首先去官网下载Elasticsearch 2.3.4安装包,解压后,在cmd命令行进入安装目录,再进入 bin目录,运行elasticsearch.bat命令。

elasticsearch插件elasticsearch-head安装:

bin目录下执行命令plugin -install mobz/elasticsearch-head

然后开始.net编程,构建控制台应用程序

Program.cs代码如下:

class Program
 {
  static void Main(string[] args)
  {
   Console.WriteLine("*Program 开始运行 : " + DateTime.Now);
   var business = new Business(); 

   var swRead = new Stopwatch();
   //swRead.Start();
   //business.AddToDb();//sqlserver数据库增加数据
   //swRead.Stop();
   //Console.WriteLine("DB 写入时间 : " + swRead.ElapsedMilliseconds); 

   //swRead.Reset();
   //swRead.Start();
   //business.AddToElasticIndex();
   //swRead.Stop();
   //Console.WriteLine("ES 写入时间 : " + swRead.ElapsedMilliseconds); 

   var sw = new Stopwatch();
   sw.Start();
   var personsFromDB = business.GetFromDB();
   sw.Stop();
   Console.WriteLine("DB 读时间 : " + sw.ElapsedMilliseconds); 

   sw.Reset();
   sw.Start();
   var personsFromEs = business.GetFromES();
   sw.Stop();
   Console.WriteLine("ES 读时间 : " + sw.ElapsedMilliseconds); 

   Console.ReadLine();
  }
 }

BLL层的Business.cs类:

public class Business
 {
  private List<PersonDetail> _personList = new List<PersonDetail>(); 

  //SQLSERVER数据库
  PersonDbProvider dbProvider = new PersonDbProvider(); 

  //ElasticSearch
  ESProvider esProvider = new ESProvider(); 

  public void AddToDb()
  {
   _personList = Util.Get10000PersonDetails();//辅助类,生成10000条数据 

   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
   { //数据库上下文
    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
   {
    //添加数据
    //在调用下面的index方法的时候,如果没有指定使用哪个index,ElasticSearch会直接使用我们在setting中的defaultIndex,如果没有,则会自动创建
    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);
   //默认的Operator是Or,当keyword是类似于"One Two"之类的中间有空格的时候,会被当成两个关键词搜索,然后搜索结果进行or运算
   //所以我们需要根据需求来调整Operator
   var searchResults = client.Search<PersonDetail>(s => s
    .Index("elastic-search-app")
    .Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.And)))
    ); 

   //--------------------------------------------------------------------------------------
   //另外由于ES是分词搜索,所以当我们要用"One"来搜索完整的单词"JustOne"的时候,就必须在"One"外面添加**,类似于SQL里面的%keyword%,但是这样的做法会导致在用完整的单词来搜索的时候搜索不到结果,所以我们需要使用下面的方式 

   //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是一个被索引的精确值,也就是说Foo, foo, FOO是不相等的,因此
   //在使用term query的时候要注意,term query在搜索的Field已经被索引的时候,是不支持大写的。
   // 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一般用于全文搜索,但是也可以用于单个属性的搜索(设置DefaultField属性),queryString query可以不区分大小写。QueryString还有一个好处就是我们可以搜索一个term中的一部分,
   //例如lastname为"t Boterhuis 1",那么我们可以用"terhuis"搜索到这个数据(虽然需要在外面包上**),在term query里面就做不到,因为ES把每一个属性的值都分析成一个个单独的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)
     })); 

   //然后重新创建索引
   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测试数据
  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测试数据
  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方法中则可以直接调用映射类,从而减少了OnModelCreating方法的复杂度,同时也增强了代码维护的可读性
   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

结果图:

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

(0)

相关推荐

  • 详解centos7虚拟机安装elasticsearch5.0.x-安装篇

    centos7虚拟机安装elasticsearch5.0.x-安装篇 请预先安装jdk详细步骤请参考:http://www.jb51.net/softjc/193398.html 创建新用户(非root用户) elasticsearch只能用非root启动,这里我创建了一个叫seven的用户 [root@localhost ~]# useradd seven [root@localhost ~]# passwd seven 下载elasticsearch [root@localhost ~]#

  • 详解spring-boot集成elasticsearch及其简单应用

    介绍 记录将elasticsearch集成到spring boot的过程,以及一些简单的应用和helper类使用. 接入方式 使用spring-boot中的spring-data-elasticsearch,可以使用两种内置客户端接入 1.节点客户端(node client): 配置文件中设置为local:false,节点客户端以无数据节点(node-master或node-client)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节

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

    本文实例为大家分享了MVC4图书管理系统的制作教程,供大家参考,具体内容如下 首先项目结构图: Model层的相关代码如下: Book.cs代码如下: public class Book { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } [MaxLength(500)] [Display(Name = "标题")] public string Title

  • 详解spring中使用Elasticsearch的代码实现

    在使用Elasticsearch之前,先给大家聊一点干货. 1.      ES和solr都是作为全文搜索引擎出现的.都是基于Lucene的搜索服务器. 2.   ES不是可靠的存储系统,不是数据库,它有丢数据的风险. 3.  ES不是实时系统,数据写入成功只是trans log成功(类似于MySQL的bin log),写入成功后立刻查询查不到是正常的.因为数据此刻可能还在内存里而不是进入存储引擎里.同理,删除一条数据后也不是马上消失.写入何时可查询?ES内部有一个后台线程,定时将内存中的一批数

  • spring 操作elasticsearch查询使用方法

    最近学习了一下elasticsearch使用,网上的资料又很少,真是一个头两个大.好歹最后终于了解了.留个笔记做日后查询. package com.gooddeep.dev.elasticsearch.commons.dao; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.elasticsearch.action.ActionFuture; import org.elasti

  • SpringBoot整合ElasticSearch实践

    本节我们基于一个发表文章的案例来说明SpringBoot如何elasticsearch集成.elasticsearch本身可以是一个独立的服务,也可以嵌入我们的web应用中,在本案例中,我们讲解如何将elasticsearch嵌入我们的应用中. 案例背景:每个文章(Article)都要属于一个教程(Tutorial),而且每个文章都要有一个作者(Author). 一.实体设计: Tutorial.java public class Tutorial implements Serializable

  • centos下root运行Elasticsearch异常问题解决

     在CentOS 6.5 上运行Elasticsearch 2.3,异常如下: Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root. at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:93) at org.elasticsearch.bootstrap.Bootstra

  • 基于Lucene的Java搜索服务器Elasticsearch安装使用教程

    一.安装Elasticsearch Elasticsearch下载地址:http://www.elasticsearch.org/download/ ·下载后直接解压,进入目录下的bin,在cmd下运行elasticsearch.bat 即可启动Elasticsearch ·用浏览器访问: http://localhost:9200/   ,如果出现类似如下结果则说明安装成功: { "name" : "Benedict Kine", "cluster_na

  • elasticsearch插件开发教程

    检索引擎Elasticsearch支持插件模式.有些时候你可能须要安装一些插件.甚至自己开发插件,这里就提供一个開始ES插件开发演示样例,ES版本号为1.5.2. 一.插件类继承自org.elasticsearch.plugins.AbstractPlugin package org.elasticsearch.plugin.helloworld; import java.util.ArrayList; import java.util.Collection; import java.util.

  • 安装ElasticSearch搜索工具并配置Python驱动的方法

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 我们建立一个网站或应用程序,并要添加搜索功能,令我们受打击的是:搜索工作是很难的.我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单

随机推荐