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框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
随机推荐
- 笔记:Python 字符串小记
1. 字符串是以''或""括起来的任意文本,如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK" >>> p ...
- C++编译变更stlport到使用g++的stl经验总结
. 花了几天时间,需要把经验给记下来. 1. 需要支持C++11的编译器,最方便的方式就是 yum -y install devtoolset-6 在/usr/local/bin中增加gcc6.sh ...
- MD5、SHA1加密java 16位32位
MD5.SHA1加密java 16位32位 import java.math.BigInteger; import java.security.MessageDigest; public class ...
- 获取 Google USB 驱动程序
获取 Google USB 驱动程序 另请参阅 安装 USB 驱动程序 使用硬件设备 使用任何 Google Nexus 设备进行 ADB 调试时,只有 Windows 需要 Google ...
- vue2.0项目中 localhost改成ip地址访问
这里 你可以写成你的ip 那你的项目只能ip访问了,但是写成0.0.0.0的话 你既可已localhost 访问也可以ip访问 也可以写成 127.0.0.1也可以,也能local访问了和ip访问( ...
- vue中兄弟组件间 的传值 bus(可以理解为公共交通)
点击大儿子(头部组件的年月日,下面的都要变化) 就相当于点击了年月日之后,下面的组件重新调接口,参数变化 1.首先随便哪儿写个bus.js 内容如下: import Vue from 'v ...
- UGUI之Slider使用,制作血条
用Slider来控制Cube旋转 Slider是滑动条.
- Visual Studio 2015 开发Android Cordova出现unsupported major minor version 52.0错误的解决方法
JDK版本的问题,需要JDK1.8版本,安装!VS2015做如下设置, 工具->选项->用于Apache Cordoba的工具->环境变量替代->JAVA_HOME设为1.8:
- kafka 单机配置
http://blog.csdn.net/jingshuigg/article/details/24439637 . su root : chown -R hadoop:hadoop version- ...
- 图片和base64互转
最近项目需要将图片以base64编码,这里记录下相关的一些东西. 需要导入两个类:sun.misc.BASE64Encoder sun.misc.BASE64Decoder 下面是相关java代码: ...