• 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  

    结果图:




  • 相关阅读:
    mssql like的效率
    【编辑器开发】基本js指令
    QQ菜单OUTLOOK风格
    oracle exp/imp命令详解
    javascript读取xml
    在c#中调用windows脚本的方法
    oracle常用命令(转)
    有效创建Oracle dblink的两种方式
    oracle 绑定变量(bind variable)
    Oracle备份与恢复
  • 原文地址:https://www.cnblogs.com/duwamish/p/6655181.html
Copyright © 2020-2023  润新知