Elasticsearch.Net使用(一)【入门篇】

http://blog.csdn.net/wulex/article/details/52138564 

  1. 加数据   
  2.                //在调用下面的index方法的时候,如果没有指定使用哪个index,ElasticSearch会直接使用我们在setting中的defaultIndex,如果没有,则会自动创建  
  3.                var index = client.Index(person);  
  4.                return index.Created;  
  5.            }  
  6.            catch (Exception ex)  
  7.            {  
  8.                Console.WriteLine(" Excepton Message : " + ex.Message);  
  9.            }  
  10.            return false;  
  11.        }  
  12.   
  13.   
  14.        public List<PersonDetail> GetAll()  
  15.        {  
  16.            var searchResults = client.Search<PersonDetail>(s => s  
  17.                .From(0)  
  18.                .Size(10000)  
  19.                );  
  20.            return searchResults.Documents.ToList();  
  21.        }  
  22.   
  23.        public List<PersonDetail> GetEntities(string keyword)  
  24.        {  
  25.            var client = new ElasticClient(Setting.ConnectionSettings);  
  26.  
  27.            #region 全文搜索  
  28.   
  29.            keyword = String.Format("*{0}*", keyword);  
  30.            //默认的Operator是Or,当keyword是类似于"One Two"之类的中间有空格的时候,会被当成两个关键词搜索,然后搜索结果进行or运算  
  31.            //所以我们需要根据需求来调整Operator  
  32.            var searchResults = client.Search<PersonDetail>(s => s  
  33.                .Index("elastic-search-app")  
  34.                .Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.And)))  
  35.                );  
  36.   
  37.            //--------------------------------------------------------------------------------------  
  38.            //另外由于ES是分词搜索,所以当我们要用"One"来搜索完整的单词"JustOne"的时候,就必须在"One"外面添加**,类似于SQL里面的%keyword%,但是这样的做法会导致在用完整的单词来搜索的时候搜索不到结果,所以我们需要使用下面的方式  
  39.   
  40.            //wholeKeyword = keyword;  
  41.            //keyword = String.Format("*{0}*", keyword);  
  42.            //QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };  
  43.            //if (!String.IsNullOrEmpty(wholeKeyword))  
  44.            //{  
  45.            //    QueryContainer wholeWordQuery = new QueryStringQuery() { Query = wholeKeyword };  
  46.            //    query = query || wholeWordQuery;  
  47.            //}  
  48.            //var searchResults = client.Search<Person>(s => s  
  49.            //    .Index("zhixiao-application")  
  50.            //    .Query(query)  
  51.            //);  
  52.  
  53.            #endregion  
  54.  
  55.            #region 指定属性搜索  
  56.   
  57.            //使用term Query  
  58.            //Term是一个被索引的精确值,也就是说Foo, foo, FOO是不相等的,因此  
  59.            //在使用term query的时候要注意,term query在搜索的Field已经被索引的时候,是不支持大写的。  
  60.            // QueryContainer query2 = new TermQuery { Field = item.Key, Value = item.Value.ToLower() };  
  61.            //--------------------------------------------------------------------------------------  
  62.            //var searchResults = client.Search<PersonDetail>(s => s  
  63.            //    .Index("elastic-search-app")  
  64.            //    .Query(q => q.Term(t => t.OnField(f => f.LastName == "keyword")))  
  65.            //);  
  66.            //效果同上  
  67.            //QueryContainer termQuery = new TermQuery { Field = "lastname", Value = "keyword" };  
  68.            //var searchResults = client.Search<PersonDetail>(s => s  
  69.            //    .Index("elastic-search-app")  
  70.            //    .Query(termQuery)  
  71.            //);  
  72.            //--------------------------------------------------------------------------------------  
  73.            //使用 Query String query  
  74.            //QueryString query一般用于全文搜索,但是也可以用于单个属性的搜索(设置DefaultField属性),queryString query可以不区分大小写。QueryString还有一个好处就是我们可以搜索一个term中的一部分,  
  75.            //例如lastname为"t Boterhuis 1",那么我们可以用"terhuis"搜索到这个数据(虽然需要在外面包上**),在term query里面就做不到,因为ES把每一个属性的值都分析成一个个单独的term,提高了搜索的效率。   
  76.            //keyword = "t Boterhuis 2";  
  77.            //QueryContainer wholeWordQuery = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };  
  78.            //var searchResults = client.Search<PersonDetail>(s => s  
  79.            //    .Index("elastic-search-app")  
  80.            //    .Query(wholeWordQuery)  
  81.            //);  
  82.  
  83.            #endregion  
  84.   
  85.            return searchResults.Documents.ToList();  
  86.        }  
  87.   
  88.        public List<PersonDetail> Sort(string keyword)  
  89.        {  
  90.            // 首先我们把原先的索引先删除了  
  91.            var response =  
  92.                client.DeleteIndex(  
  93.                    new DeleteIndexRequest(new IndexNameMarker()  
  94.                    {  
  95.                        Name = "elastic-search-app",  
  96.                        Type = typeof(PersonDetail)  
  97.                    }));  
  98.   
  99.            //然后重新创建索引  
  100.            var indexResult = client.CreateIndex("PD-application");  
  101.            var response1 = client.Map<PersonDetail>(m => m.MapFromAttributes());  
  102.            IEnumerable<PersonDetail> persons = new List<PersonDetail>  
  103.            {  
  104.                new PersonDetail()  
  105.                {  
  106.                    Id = 4,  
  107.                    FirstName = "Boterhuis-040",  
  108.                    LastName = "Gusto-040",  
  109.                },  
  110.                new PersonDetail()  
  111.                {  
  112.                    Id = 5,  
  113.                    FirstName = "sales@historichousehotels.com",  
  114.                    LastName = "t Boterhuis 1",  
  115.                },  
  116.                new PersonDetail()  
  117.                {  
  118.                    Id = 6,  
  119.                    FirstName = "Aberdeen #110",  
  120.                    LastName = "sales@historichousehotels.com",  
  121.                },  
  122.                new PersonDetail()  
  123.                {  
  124.                    Id = 7,  
  125.                    FirstName = "Aberdeen #110",  
  126.                    LastName = "t Boterhuis 2",  
  127.                },  
  128.            };  
  129.            foreach (var person in persons)  
  130.            {  
  131.                client.Index(person);  
  132.            }  
  133.            var searchResults = client.Search<PersonDetail>(s => s  
  134.                .Index("PD-application")  
  135.                .Sort(sort => sort.OnField(f => f.Id).Order(SortOrder.Ascending))  
  136.   
  137.            );  
  138.            return searchResults.Documents.ToList();  
  139.        }  
  140.    }  
[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public static class Util  
  2.    {  
  3.   
  4.        //生成10000条sqlserver测试数据  
  5.        public static List<PersonDetail> Get10000PersonDetails()  
  6.        {  
  7.            var personDetailsList = new List<PersonDetail>();  
  8.              
  9.            for (int i = 0; i < 10000; i++)  
  10.            {  
  11.                personDetailsList.Add(new PersonDetail()  
  12.                {  
  13.                    FirstName = "FN" + new Random().Next(int.MaxValue),  
  14.                    LastName = "LN"  + new Random().Next(int.MaxValue)  
  15.                });  
  16.            }  
  17.            return personDetailsList;  
  18.        }  
  19.   
  20.        //生成10000条ElasticSearch测试数据  
  21.        public static List<PersonDetail> Get10000PersonDetailsWithID()  
  22.        {  
  23.            var personDetailsList = new List<PersonDetail>();  
  24.              
  25.            for (int i = 0; i < 10000; i++)  
  26.            {  
  27.                personDetailsList.Add(new PersonDetail()  
  28.                {  
  29.                    Id = i * new Random().Next(99),  
  30.                    FirstName = "FN" + new Random().Next(int.MaxValue),  
  31.                    LastName = "LN" + new Random().Next(int.MaxValue)  
  32.                });  
  33.            }  
  34.            return personDetailsList;  
  35.        }  
  36.   
  37.    }  
[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public static class Setting  
  2.    {  
  3.        public static Uri Node  
  4.        {  
  5.            get  
  6.            {  
  7.                return new Uri("http://localhost:9200");  
  8.            }  
  9.        }  
  10.        //连接配置  
  11.        public static ConnectionSettings ConnectionSettings  
  12.        {  
  13.            get  
  14.            {  
  15.                return new ConnectionSettings(Node, defaultIndex: "es-index-app");  
  16.            }  
  17.        }  
  18.   
  19.    }  

Model层代码:

 

 

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public partial class PersonDetail  
  2.   {  
  3.       public long Id { get; set; }  
  4.       public string FirstName { get; set; }  
  5.       public string LastName { get; set; }  
  6.   }  

 

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public partial class PersonContext : DbContext  
  2.    {  
  3.        static PersonContext()  
  4.        {  
  5.            Database.SetInitializer<PersonContext>(null);  
  6.        }  
  7.   
  8.        public PersonContext()  
  9.            : base("Name=PersonContext")  
  10.        {  
  11.        }  
  12.   
  13.        public DbSet<PersonDetail> PersonDetails { get; set; }  
  14.   
  15.        protected override void OnModelCreating(DbModelBuilder modelBuilder)  
  16.        {  
  17.            //在重写OnModelCreating方法中则可以直接调用映射类,从而减少了OnModelCreating方法的复杂度,同时也增强了代码维护的可读性  
  18.            modelBuilder.Configurations.Add(new PersonDetailMap());  //属性映射约定  
  19.        }  
  20.    }  
[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. //Fluent API配置Configuration映射类  
  2.    public class PersonDetailMap : EntityTypeConfiguration<PersonDetail>  
  3.    {  
  4.        public PersonDetailMap()  
  5.        {  
  6.            // 主键  
  7.            this.HasKey(t => new { t.Id, t.FirstName, t.LastName });  
  8.   
  9.            // 属性  
  10.            this.Property(t => t.Id)  
  11.                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);  
  12.   
  13.            this.Property(t => t.FirstName)  
  14.                .IsRequired();  
  15.   
  16.            this.Property(t => t.LastName)  
  17.                .IsRequired();  
  18.   
  19.            // 表 & 列 映射  
  20.            this.ToTable("PersonDetails");  
  21.            this.Property(t => t.Id).HasColumnName("Id");  
  22.            this.Property(t => t.FirstName).HasColumnName("FirstName");  
  23.            this.Property(t => t.LastName).HasColumnName("LastName");  
  24.        }  
  25.    }  

sqlserver脚本:

 

 

[sql] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. USE [Person]  
  2. GO  
  3.   
  4. SET ANSI_NULLS ON  
  5. GO  
  6.   
  7. SET QUOTED_IDENTIFIER ON  
  8. GO  
  9.   
  10. CREATE TABLE [dbo].[PersonDetails](  
  11.     [Id] [bigint] IDENTITY(1,1) NOT NULL,  
  12.     [FirstName] [nvarchar](max) NOT NULL,  
  13.     [LastName] [nvarchar](max) NOT NULL  
  14. ON [PRIMARY]  
  15.   
  16. GO  

结果图:

 




 

posted @ 2017-04-01 11:21  paymob  阅读(1039)  评论(0编辑  收藏  举报