全文检索-Elasticsearch (四) elasticsearch.net 客户端
本篇摘自elasticsearch.net search入门使用指南中文版(翻译)
原文:http://edu.dmeiyang.com/book/nestusing.html
elasticsearch.net为什么会有两个客户端?
- Elasticsearch.Net是一个非常底层且灵活的客户端,它不在意你如何的构建自己的请求和响应。它非常抽象,因此所有的Elasticsearch API被表示为方法,没有太多关于你想如何构建json/request/response对象的东东,并且它还内置了可配置、可重写的集群故障转移机制。
- Elasticsearch.Net有非常大的弹性,如果你想更好的提升你的搜索服务,你完全可以使用它来做为你的客户端。
- NEST是一个高层的客户端,可以映射所有请求和响应对象,拥有一个强类型查询DSL(领域特定语言),并且可以使用.net的特性比如协变、Auto Mapping Of POCOs,NEST内部使用的依然是Elasticsearch.Net客户端。
NEST Client
一、如何安装NEST
打开VS的工具菜单,通过NuGet包管理器控制台,输入以下命令安装NEST
Install-Package NEST
安装后引用了以下三个DLL
Elasticsearch.Net.dll(2.4.)
Nest.dll(2.4.)
Newtonsoft.Json.dll(.0版本)
二、链接elasticsearch
你可以通过单个节点或者指定多个节点使用连接池链接到Elasticsearch集群,使用连接池要比单个节点链接到Elasticsearch更有优势,比如支持负载均衡、故障转移等。
通过单点链接:
var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
通过连接池链接:
var nodes = new Uri[]
{
new Uri("http://myserver1:9200"),
new Uri("http://myserver2:9200"),
new Uri("http://myserver3:9200")
}; var pool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(pool);
var client = new ElasticClient(settings);
NEST Index
为了知道请求需要操作哪个索引,Elasticsearch API期望收到一个或多个索引名称作为请求的一部分
一、指定索引
1、可以通过ConnectionSettings使用.DefaultIndex(),来指定默认索引。当一个请求里没有指定具体索引时,NEST将请求默认索引。
var settings = new ConnectionSettings().DefaultIndex("defaultindex");
2、可以通过ConnectionSettings使用.MapDefaultTypeIndices(),来指定被映射为CLR类型的索引。
var settings = new ConnectionSettings()
.MapDefaultTypeIndices(m => m
.Add(typeof(Project), "projects")
);
注意:通过.MapDefaultTypeIndices()指定索引的优先级要高于通过.DefaultIndex()指定索引,并且更适合简单对象(POCO)
3、另外还可以显示的为请求指定索引名称,例如:
var response = client.Index(student, s=>s.Index("db_test"));
var result = client.Search<Student>(s => s.Index("db_test"));
var result = client.Delete<Student>(null, s => s.Index("db_test"));
……
注意:当现实的为请求指定索引名称时,这个优先级是最高的,高于以上两种方式指定的索引。
4、一些Elasticsearch API(比如query)可以采用一个、多个索引名称或者使用_all特殊标志发送请求,请求NEST上的多个或者所有节点
//请求单一节点
var singleString = Nest.Indices.Index("db_studnet");
var singleTyped = Nest.Indices.Index<Student>(); ISearchRequest singleStringRequest = new SearchDescriptor<Student>().Index(singleString);
ISearchRequest singleTypedRequest = new SearchDescriptor<Student>().Index(singleTyped); //请求多个节点
var manyStrings = Nest.Indices.Index("db_studnet", "db_other_student");
var manyTypes = Nest.Indices.Index<Student>().And<OtherStudent>(); ISearchRequest manyStringRequest = new SearchDescriptor<Student>().Index(manyStrings);
ISearchRequest manyTypedRequest = new SearchDescriptor<Student>().Index(manyTypes); //请求所有节点
var indicesAll = Nest.Indices.All;
var allIndices = Nest.Indices.AllIndices; ISearchRequest indicesAllRequest = new SearchDescriptor<Student>().Index(indicesAll);
ISearchRequest allIndicesRequest = new SearchDescriptor<Student>().Index(allIndices);
二、创建索引
Elasticsearch API允许你创建索引的同时对索引进行配置,例如:
var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards().NumberOfReplicas()); client.CreateIndex(descriptor);
这里制定了要删除的索引名称“db_student”,以下为更多删除用例:
//删除指定索引所在节点下的所有索引
var descriptor = new DeleteIndexDescriptor("db_student").AllIndices();
NEST Mapping
一、简单实现
1、定义业务需要的POCO,并指定需要的Attribute
[ElasticsearchType(Name = "student")]
public class Student
{
[Nest.String(Index = FieldIndexOption.NotAnalyzed)]
public string Id { get; set; } [Nest.String(Analyzer = "standard")]
public string Name { get; set; } [Nest.String(Analyzer = "standard")]
public string Description { get; set; } public DateTime DateTime { get; set; }
}
2、接着我们通过.AutoMap()来实现映射
var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards().NumberOfReplicas())
.Mappings(ms => ms
.Map<Student>(m => m.AutoMap())
); client.CreateIndex(descriptor);
注意:通过.Properties()可以重写通过Attribute定义的映射
二、Attribute介绍
1、StringAttribute
属性名 | 值类型 | 描述 |
---|---|---|
Analyzer | string | 分析器名称,值包含standard、simple、whitespace、stop、keyward、pattern、language、snowball、custom等,查看分析器更多信息请点击Elasticsearch Analyzers |
Boost | double | 加权值,值越大得分越高 |
NullValue | string | 插入文档时,如果数据为NULL时的默认值 |
Index | FieldIndexOption | 是否使用分析器,默认使用FieldIndexOption.Analyzed,禁止使用分析器FieldIndexOption.NotAnalyzed |
2、NumberAttribute
属性名 | 值类型 | 描述 |
---|---|---|
type | NumberType | 构造函数参数,指定当前属性的类型,NumberType.Default、Float、Double、Integer、Long、Short、Byte |
Boost | double | 加权值,值越大得分越高 |
NullValue | double | 插入文档时,如果数据为NULL时的默认值 |
3、BooleanAttribute
属性名 | 值类型 | 描述 |
---|---|---|
Boost | double | 加权值,值越大得分越高 |
NullValue | double | 插入文档时,如果数据为NULL时的默认值 |
4、DateAttribute
属性名 | 值类型 | 描述 |
---|---|---|
Boost | double | 加权值,值越大得分越高 |
NullValue | string | 插入文档时,如果数据为NULL时的默认值 |
Format | string |
5、ObjectAttribute
属性名 | 值类型 | 描述 |
---|---|---|
type | string/Type | 构造函数参数,指定当前属性的类型T |
Dynamic | DynamicMapping |
NEST Search
NEST提供了支持Lambda链式query DLS(领域特定语言)方式,以下是简单实现及各个query的简述。
一、简单实现
1、定义SearchDescriptor,方便项目中复杂业务的实现
var query = new Nest.SearchDescriptor<Models.ESObject>(); var result = client.Search<Student>(x => query)
2、检索title和content中包含key,并且作者不等于“俏佳人”的文档
query.Query(q =>
q.Bool(b =>
b.Must(m =>
m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content)).Query(key))
)
.MustNot(m =>
m.QueryString(t => t.Fields(f => f.Field(obj => obj.Author)).Query("俏佳人"))
)
)
);
注意:
- 如果Elasticsearch使用默认分词,Title和Content的attribute为[Nest.String(Analyzer = "standard")]
- 如果Elasticsearch使用的是IK分词,Title和Content的attribute为[Nest.String(Analyzer = "ikmaxword")]或者[Nest.String(Analyzer = "ik_smart")]
- Author的attribute为[Nest.String(Index = FieldIndexOption.NotAnalyzed)],禁止使用分析器
3、过滤作者等于“历史小河”的文档
query.PostFilter(x => x.Term(t => t.Field(obj => obj.Author).Value("历史小河")));
4、过滤作者等于“历史小河”或者等于“友谊的小船”的文档,匹配多个作者中间用空格隔开
query.PostFilter(x => x.QueryString(t => t.Fields(f => f.Field(obj => obj.Author)).Query("历史小河 友谊的小船")));
5、过滤数量在1~100之间的文档
query.PostFilter(x => x.Range(t => t.Field(obj => obj.Number).GreaterThanOrEquals().LessThanOrEquals()));
6、排序,按照得分倒叙排列
query.Sort(x => x.Field("_score", Nest.SortOrder.Descending));
7、定义高亮样式及字段
query.Highlight(h => h
.PreTags("<b>")
.PostTags("</b>")
.Fields(
f => f.Field(obj => obj.Title),
f => f.Field(obj => obj.Content),
f => f.Field("_all")
)
);
8、拼装查询内容,整理数据,方便前段调用
var list = result.Hits.Select(c => new Models.ESObject()
{
Id = c.Source.Id,
Title = c.Highlights == null ? c.Source.Title : c.Highlights.Keys.Contains("title") ? string.Join("", c.Highlights["title"].Highlights) : c.Source.Title, //高亮显示的内容,一条记录中出现了几次
Content = c.Highlights == null ? c.Source.Content : c.Highlights.Keys.Contains("content") ? string.Join("", c.Highlights["content"].Highlights) : c.Source.Content, //高亮显示的内容,一条记录中出现了几次
Author = c.Source.Author,
Number = c.Source.Number,
IsDisplay = c.Source.IsDisplay,
Tags = c.Source.Tags,
Comments = c.Source.Comments,
DateTime = c.Source.DateTime,
})
elasticsearch.net Document
文档操作包含添加/更新文档、局部更新文档、删除文档及对应的批量操作文档方法。
一、添加/更新文档及批量操作
添加/更新单一文档
Client.Index(student);
批量添加/更新文档
var list = new List<Student>(); client.IndexMany<Student>(list);
二、局部更新单一文档及批量操作
局部更新单一文档
client.Update<Student, object>("", upt => upt.Doc(new { Name = "江山美人" }));
局部更新批量文档
var ids = new List<string>() { "" }; var bulkQuest = new BulkRequest() { Operations = new List<IBulkOperation>() }; foreach (var v in ids)
{
var operation = new BulkUpdateOperation<Student, object>(v); operation.Doc = new { Name = "胡一刀" }; bulkQuest.Operations.Add(operation);
} var result = client.Bulk(bulkQuest);
三、删除文档及批量操作
删除单一文档
client.Delete<Student>("");
批量删除文档
var ids = new List<string>() { "", "" }; var bulkQuest = new BulkRequest() { Operations = new List<IBulkOperation>() }; foreach (var v in ids)
{
bulkQuest.Operations.Add(new BulkDeleteOperation<Student>(v));
} var result = client.Bulk(bulkQuest);
全文检索-Elasticsearch (四) elasticsearch.net 客户端的更多相关文章
- ElasticSearch(四) ElasticSearch中文分词插件IK的简单测试
先来一个简单的测试 # curl -XPOST "http://192.168.9.155:9200/_analyze?analyzer=standard&pretty" ...
- Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解
Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...
- 分布式全文检索引擎之ElasticSearch
一 什么是 ElasticSearch Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elas ...
- Elasticsearch 9300无法访问,客户端出现NoNodeAvailableException[None of the configured nodes are available: [{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}
1. 进入容器 docker exec ‐it ID /bin/bash 2. 拷贝配置文件到宿主机 docker cp ID:/usr/share/elasticsearch/config/el ...
- 3.使用Spring Data ElasticSearch操作ElasticSearch(5.6.8版本)
1.引入maven坐标 <!--spring-data-elasticsearch--><dependency> <groupId>org.springframew ...
- ElasticSearch和ElasticSearch Head环境搭建和数据模拟
首先elasticsearch-6.0.0\bin目录下运行elasticsearch服务 修改elasticsearch-6.0.0\elasticsearch.yml文件 在文件最后加入下面代码, ...
- 四次元新浪微博客户端Android源码
四次元新浪微博客户端Android源码 源码下载:http://code.662p.com/list/11_1.html [/td][td] [/td][td] [/td][td] 详细说明:http ...
- 启动elasticsearch的时候报出Exception in thread "main" SettingsException[Failed to load settings from /usr/local/elasticsearch/config/elasticsearch.yml]; nested: MarkedYAMLException[while scanning a simple ke
故障现象: [elasticsearch@tiantianml- ~]$ /usr/local/elasticsearch/bin/elasticsearch Exception in thread ...
- elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样
elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...
- ElasticSearch实战系列四: ElasticSearch理论知识介绍
前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...
随机推荐
- Tensorflow学习-数据读取
Tensorflow数据读取方式主要包括以下三种 Preloaded data:预加载数据 Feeding: 通过Python代码读取或者产生数据,然后给后端 Reading from file: 通 ...
- 关于linux下部署JavaWeb项目,nginx负责静态资源访问,tomcat负责处理动态请求的nginx配置
1.项目的运行环境 linux版本 [root@localhost ~]# cat /proc/version Linux version -.el6.x86_64 (mockbuild@x86-.b ...
- 深入css布局篇(3)完结 — margin问题与格式化上下文
深入css布局(3) - margin问题与格式化上下文 在css知识体系中,除了css选择器,样式属性等基础知识外,css布局相关的知识才是css比较核心和重要的点.今天我们来深入学习一下 ...
- h5区块链项目实战
近来区块链一词很热门,网络上关乎其讨论也很多,这里就不解释了,毕竟几句话也是说不清楚的. 最近得空利用HTML5+css3+jQ开发了一个移动端的区块链项目,感觉界面.布局.效果还是ok的. 项目效果 ...
- 判断decimal 是否为整数
用了半个小时搞懂了这个问题,基础愁死我了! private static boolean isIntegerValue(BigDecimal decimalVal) { return decimalV ...
- JS 图片放大镜
今天练习一个小demo, 从本地读取图片, 然后实现类似淘宝放大镜的效果, 再加两个需求 1 .可以调节缩放比例,默认放大两倍 2 . 图片宽高自适应, 不固定宽高 话不多说先看效果: 原理:1, 右 ...
- 国际知名CSS Reset 总结
NO.01 CSS Tools: Reset CSS 网站:https://meyerweb.com/eric/tools/css/reset/ 优点:老牌,用的人多. /* http://mey ...
- 目前比较流行的Python量化开源框架汇总(交易+风险分析工具)
注:点击框架名称通往Github talib talib的简称是Technical Analysis Library,主要功能是计算行情数据的技术分析指标 numpy 介绍:一个用python实现的 ...
- 用Docker解决坑爹的环境搭建系列——PHP+Apache2
sudo docker pull eboraas/apache-php sudo docker run -p 9991:80 --name php -v /data/docker/php/www:/v ...
- 给女朋友讲解什么是Optional【JDK 8特性】
前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本<与孩子一起学编程>的书,于是今天就给女朋友讲解一下什么是Optional类. 至于她能不能看懂,那肯定是看不懂的.(学 ...