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框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
随机推荐
- [LeetCode] 405. Convert a Number to Hexadecimal_Easy tag: Bit Manipulation
Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s compl ...
- [LeetCode] 414. Third Maximum Number_Easy
Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...
- .NET拾忆:FileSystemWatcher 文件监控
资源: https://msdn.microsoft.com/zh-cn/library/system.io.filesystemwatcher_properties(v=vs.110).aspx F ...
- cocos2d-X JS 获取cocostudio中的UI组件
1.先加载cocostudio导出的json文件,代码如下所示: var dong = ccs.load("res/Login.json"); //_login.setPositi ...
- cocos2dx 3.13 在Mac平台下配置安卓环境变量
终端下输入:vi .bash_profile 编辑环境变量: export COCOS_CONSOLE_ROOT=/Users/jiazedong/Cocos2d-x/cocos2d-x-3.2/co ...
- Beta冲刺阶段5.0
1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 成员 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难 具体贡献 郑晓丽 首页活动详情界面的美化 实现首页 ...
- Swift之关键字使用(I)
static和class的使用 static 使用 在非class的类型(包括enum和struct)中,一般使用static来描述类型作用域.在这个类型中,我们可以在类型范围中声明并使用存储属性,计 ...
- 大数据处理框架之Strom:认识storm
Storm是分布式实时计算系统,用于数据的实时分析.持续计算,分布式RPC等. (备注:5种常见的大数据处理框架:· 仅批处理框架:Apache Hadoop:· 仅流处理框架:Apache Stor ...
- LDA的Gibbs Sampling求解
<LDA数学八卦>对于LDA的Gibbs Sampling求解讲得很详细,在此不在重复在轮子,直接贴上该文这部分内容. Gibbs Sampling 批注: 1. ...
- 设计模式之Observer(观察者)(转)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...