- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Elasticsearch.Net使用入门教程(1)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了Elasticsearch.Net使用教程,供大家参考,具体内容如下 。
首先去官网下载Elasticsearch 2.3.4安装包,解压后,在cmd命令行进入安装目录,再进入 bin目录,运行elasticsearch.bat命令.
elasticsearch插件elasticsearch-head安装:
bin目录下执行命令plugin -install mobz/elasticsearch-head 。
然后开始.net编程,构建控制台应用程序 。
Program.cs代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class
Program
{
static
void
Main(
string
[] args)
{
Console.WriteLine(
"*Program 开始运行 : "
+ DateTime.Now);
var business =
new
Business();
var swRead =
new
Stopwatch();
//swRead.Start();
//business.AddToDb();//sqlserver数据库增加数据
//swRead.Stop();
//Console.WriteLine("DB 写入时间 : " + swRead.ElapsedMilliseconds);
//swRead.Reset();
//swRead.Start();
//business.AddToElasticIndex();
//swRead.Stop();
//Console.WriteLine("ES 写入时间 : " + swRead.ElapsedMilliseconds);
var sw =
new
Stopwatch();
sw.Start();
var personsFromDB = business.GetFromDB();
sw.Stop();
Console.WriteLine(
"DB 读时间 : "
+ sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
var personsFromEs = business.GetFromES();
sw.Stop();
Console.WriteLine(
"ES 读时间 : "
+ sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
|
BLL层的Business.cs类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public
class
Business
{
private
List<PersonDetail> _personList =
new
List<PersonDetail>();
//SQLSERVER数据库
PersonDbProvider dbProvider =
new
PersonDbProvider();
//ElasticSearch
ESProvider esProvider =
new
ESProvider();
public
void
AddToDb()
{
_personList = Util.Get10000PersonDetails();
//辅助类,生成10000条数据
foreach
(var personDetail
in
_personList)
{
dbProvider.AddPerson(personDetail);
}
}
public
void
AddToElasticIndex()
{
_personList = Util.Get10000PersonDetailsWithID();
foreach
(var personDetail
in
_personList)
{
esProvider.Index(personDetail);
}
}
public
List<PersonDetail> GetFromDB()
{
return
dbProvider.GetAllPersonDetails();
}
public
List<PersonDetail> GetFromES()
{
return
esProvider.GetAll();
}
}
|
PersonDbProvider.cs和ElasticSearchProvider.cs以及Util.cs,Setting.cs类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public
class
PersonDbProvider
{
public
bool
AddPerson(PersonDetail personDetail)
{
try
{
//数据库上下文
using
(var db =
new
PersonContext())
{
db.PersonDetails.Add(personDetail);
db.SaveChanges();
return
true
;
}
}
catch
(Exception)
{
return
false
;
}
}
public
List<PersonDetail> GetAllPersonDetails()
{
try
{
using
(var db =
new
PersonContext())
{
return
db.PersonDetails.ToList();
}
}
catch
(Exception)
{
return
null
;
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
public
class
ESProvider
{
public
static
ElasticClient client =
new
ElasticClient(Setting.ConnectionSettings);
public
bool
Index(PersonDetail person)
{
var client =
new
ElasticClient(Setting.ConnectionSettings);
try
{
//添加数据
//在调用下面的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();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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层代码
1
2
3
4
5
6
|
public
partial
class
PersonDetail
{
public
long
Id {
get
;
set
; }
public
string
FirstName {
get
;
set
; }
public
string
LastName {
get
;
set
; }
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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());
//属性映射约定
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//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脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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使用入门教程(1)的文章就讲到这里了,如果你想了解更多关于Elasticsearch.Net使用入门教程(1)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在这里有一个问题,我不知道这是否正常。 但是我认为这里有些湖,安装插件elasticsearch-head之后,我在浏览器中启动url“http://localhost:9200/_plugin/h
我写了这个 flex 搜索查询: es.search(index=['ind1'],doc_type=['doc']) 我得到以下结果: {'_shards': {'failed': 0, 'skip
在ElasticSearch.Net v.5中,存在一个属性 Elasticsearch.Net.RequestData.Path ,该属性在ElasticSearch.Net v.6中已成为depr
如何让 elasticsearch 应用新配置?我更改了文件 ~ES_HOME/config/elasticsearch.yml 中的一个字符串: # Disable HTTP completely:
我正在尝试使用以下分析器在 elastic serach 7.1 中实现部分子字符串搜索 PUT my_index-001 { "settings": { "analysis": {
假设一个 elasticsearch 服务器在很短的时间内接收到 100 个任务。有些任务很短,有些任务很耗时,有些任务是删除任务,有些是插入和搜索查询。 elasticsearch 是如何决定先运行
我需要根据日期过滤一组值(在此处添加字段),然后按 device_id 对其进行分组。所以我正在使用以下东西: { "aggs":{ "dates_between":{ "fi
我在 Elasticsearch 中有一个企业索引。索引中的每个文档代表一个业务,每个业务都有business_hours。我试图允许使用星期几和时间过滤营业时间。例如,我们希望能够进行过滤,以显示我
我有一个这样的过滤查询 query: { filtered: { query: { bool: { should: [{multi_match: {
Elasticsearch 相当新,所以可能不得不忍受我,我遇到了一个问题,如果我使用 20 个字符或更少的字符搜索文档,文档会出现,但是查询中同一个单词中的任何更多字符,我没有结果: 使用“苯氧甲基
我试图更好地理解 ElasticSearch 的内部结构,所以我想知道 ElasticSearch 在内部计算以下两种情况的术语统计信息的方式是否存在任何差异。 第一种情况是当我有这样的文件时: {
在我的 elasticsearch 索引中,我索引了一堆工作。为简单起见,我们只说它们是一堆职位。当人们在我的搜索引擎中输入职位时,我想“自动完成”可能的匹配。 我在这里调查了完成建议:http://
我在很多映射中使用多字段。在 Elastic Search 的文档中,指示应将多字段替换为“fields”参数。参见 http://www.elasticsearch.org/guide/en/ela
我有如下查询, query = { "query": {"query_string": {"query": "%s" % q}}, "filter":{"ids
我有一个Json数据 "hits": [ { "_index": "outboxprov1", "_type": "deleted-c
这可能是一个初学者的问题,但我对大小有一些疑问。 根据 Elasticsearch 规范,大小的最大值可以是 10000,我想在下面验证我的理解: 示例查询: GET testindex-2016.0
我在 Elastic Search 中发现了滚动功能,这看起来非常有趣。看了那么多文档,下面的问题我还是不清楚。 如果偏移量已经存在那么为什么要使用滚动? 即将到来的记录呢?假设它完成了所有数据的滚动
我有以下基于注释的 Elasticsearch 配置,我已将索引设置为不被分析,因为我不希望这些字段被标记化: @Document(indexName = "abc", type = "efg
我正在尝试在单个索引中创建多个类型。例如,我试图在host索引中创建两种类型(post,ytb),以便在它们之间创建父子关系。 PUT /ytb { "mappings": { "po
我尝试创建一个简单的模板,包括一些动态模板,但我似乎无法为文档编制索引。 我得到错误: 400 {"error":"MapperParsingException[mapping [_default_]
我是一名优秀的程序员,十分优秀!