Elasticsearch.Net使用(一)【入门篇】
http://blog.csdn.net/wulex/article/details/52138564
- 加数据
- //在调用下面的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
结果图:
Elasticsearch.Net使用(一)【入门篇】的更多相关文章
- 最新版本elasticsearch本地搭建入门篇
最新版本elasticsearch本地搭建入门篇 项目介绍 最近工作用到elasticsearch,主要是用于网站搜索,和应用搜索. 工欲善其事,必先利其器. 自己开始关注elasticsearch, ...
- Elasticsearch学习记录(入门篇)
Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...
- 转载:elasticsearch入门篇
转自:https://www.cnblogs.com/hello-shf/p/11543408.html elasticsearch入门篇 elasticsearch专栏:https://www. ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- 一个App完成入门篇(七)- 完成发现页面
第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...
- [原创]Linq to xml增删改查Linq 入门篇:分分钟带你遨游Linq to xml的世界
本文原始作者博客 http://www.cnblogs.com/toutou Linq 入门篇(一):分分钟带你遨游linq to xml的世界 本文原创来自博客园 请叫我头头哥的博客, 请尊重版权, ...
- 转:OSGi 入门篇:模块层
OSGi 入门篇:模块层 1 什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现.但是这种实现与Java本身现有的一些模块化特性又有明显的不同. 本文 ...
- 转:OSGi 入门篇:生命周期层
OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
随机推荐
- cocos2d JS 使用代码判断对象类型
changeAtlasScoreString : function (score,tfScore) { if(tfScore.getDescription() == "LabelAtlas& ...
- 数据加密之DES加密
DES加密即使用DESCryptoServiceProvider加密.DESCryptoServiceProvider在命名空间下:System.Security.Cryptography; 对称加密 ...
- 记录一则expdp任务异常处理案例
环境:AIX 6.1 + Oracle 10.2.0.4 现象:在XTTS迁移测试阶段,遇到执行几个expdp的导出任务,迟迟没有返回任何信息,对应日志无任何输出,查看任务状态: SQL> se ...
- spring注解式开发之视图解析器
http://localhost:8089/springmvc-04-viewResovler/springmvc/hello
- 函数式编程语言(functional language)
内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...
- java微信小程序调用支付接口
简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...
- SSM框架-SpringMVC 实例文件上传下载
一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...
- C# Mongo Client 2.4.2创建索引
static async Task CreateIndex() { var client = new MongoClient(); var database = client.GetDatabase( ...
- N-城堡问题
1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | ...
- c++ 各种类型转换
1.int 2 string 法1:c++11里面的to_string #include <string> std::); //or auto s = std::to_string(); ...