ElasticSearch 6.2.4实践
参考资料
ElasticSearch 官网
ElasticSearch,Kibana,Asp.net Core with docker 示例
阮一峰 ElasticSearch
ElasticSearch Nest
生产环境elasticsearch的配置建议
基础概念
索引(index)是ElasticSearch存放数据的地方。对应关系型数据库中的一张表。索引名称需小写。
文档(document)是ElasticSearch中存储的主要实体。对应关系型数据库中的数据表的一行数据。文档由字段(行数据的列)组成,一个字段可以出现多次,该字段被称为多值字段。每个字段对应一种类型。
文档类型,在ElasticSearch中一个索引可以存储许多不同用途的对象。
节点和集群,ElasticSearch可以作为一个独立的搜索服务器工作,也支持在在多台协同工作的服务器上运行。这些服务器被统称为一个集群(cluster)。集群的每个服务器则被称为一个节点(node)。
分片:将数据切分,每部分是一个单独的Apache Lucene索引。每个分片可以存储在集群的不同节点上。
副本分片:副本分片是对原始分片的一个精确拷贝,原始分片被称为主分片。对索引的所有修改操作都直接作用在主分片上,每个主分片可以有零个或多个副本分片。
安装
Windows
-
(安装Java)ElasticSearch(ES) 是基于 Lucene 的封装。所以想要运行ES 需要安装Java的JDK。这里推荐安装Java8,171的版本,安装完成后可在cmd下查看 java 和 javac 的版本信息,java -version javac -version ,能正常返回版本信息即是安装成功。Tips:这里需要提前配置好Java的环境变量。可参考 百度经验-Windows 10 配置Java环境变量
-
(安装ES)接下来去官网下载ES的安装包即可,官网提供zip,msi 两种安装方式。zip 方式相对较简洁。msi 操作简单。
-
(安装常用插件)ES常用的插件有ik分词器,在官网下载好zip包,直接解压缩到ES的安装目录下的plugins文件夹下即可,我的安装路径如下:E:\elasticsearch-6.2.4\plugins。安装完成后需要重启ES。
-
(安装可视化工具)这里推荐安装Kibana,安装和ES对应的版本即可。还有一种是ES的Head插件。
.NET Core 实现
ElasticSearch官方提供两个nuget包(**ElasticSearch.Net 和 NEST )实现ElasticSearch 的功能。都已支持.net core **项目。以下是关于这两个包的介绍:
-
Elasticsearch.Net provides a low-level API for connecting with Elasticsearch and leaves to you the work of building/processing the requests and responses. It is a very thin client for consuming the HTTP API from .Net
-
NEST sits on top of Elasticsearch.Net and provides a higher-level API. It can map your objects to/from Request/Responses, make assumptions about index names, document types, field types and provide a strongly typed language for building your queries that matches the one of the HTTP REST API
创建索引
默认索引:
var settings = new ConnectionSettings(new Uri("http://example.com:9200"))
.DefaultIndex("people");
var client = new ElasticClient(settings);
指定索引:这里的关键是需要Mapping
var settings = new ConnectionSettings(new Uri("http://example.com:9200"));
var client = new ElasticClient(settings);
client.CreateIndex(_indexName, i => i.Mappings(m => m.Map<T>(s => s.AutoMap())));
POCO
[ElasticsearchType(IdProperty = "ProductId",Name ="product")]
public class ProductDoc
{
public int ProductId { get; set; }
public int BrandId { get; set; }
public int? BrandCollectionId { get; set; }
[Text(Analyzer = "ik_smart", SearchAnalyzer = "ik_smart")]
public string PrimaryName { get; set; }
[Keyword(Index = true)]
public string BrandNameKeyword { get; set; }
[Text(Analyzer = "ik_smart", SearchAnalyzer = "ik_smart")]
public string BrandName { get; set; }
}
需要注意的是,在创建一个POCO 对象的时候,ElasticsearchType的Name是必须指定的。[Text],[Keyword]都是用来标注该属性需要以什么方式来搜索或者创建。
其中"ik_smart" 依赖于 ES 的 **ik **这个插件包,是一个中文分词插件。
查询
public SearchResponse<ProductDoc> SearchByKeyword(ProductRequest request)
{
var matchFields = new string[] { "primaryName^3", "brandName^2", "tagNames^1.5", "brandCollectionName^1.5" ,"details" };
var query = new QueryContainer(new BoolQuery
{
Must = new List<QueryContainer>
{
new MultiMatchQuery
{
Fields=matchFields,
Query=request.KeyWord,
Operator=0
}
}
});
var filters = new List<IQueryContainer>();
if (request.CategoryNames != null)
{
var filterBuilderCatgory= new QueryContainer();
List<string> cateterms = new List<string>();
foreach (var c in request.CategoryNames)
{
cateterms.Add(c);
}
filterBuilderCatgory = new QueryContainer(
new BoolQuery
{
Filter = new List<QueryContainer>
{
new TermsQuery
{
Field="topCategoryName",
Terms=cateterms
}
}
}
);
filters.Add(filterBuilderCatgory);
}
if (request.BrandNames != null)
{
var filterBuilderBrand = new QueryContainer();
List<string> brandterms = new List<string>();
foreach (var c in request.BrandNames)
{
brandterms.Add(c);
}
filterBuilderBrand = new QueryContainer(
new BoolQuery
{
Filter = new List<QueryContainer>
{
new TermsQuery
{
Field="brandNameKeyword",
Terms=brandterms
}
}
}
);
filters.Add(filterBuilderBrand);
}
AggregationContainerDescriptor<ProductDoc> aggregation = null;
aggregation = new AggregationContainerDescriptor<ProductDoc>()
.Terms("agg_brand", f => f.Field(t=>t.BrandNameKeyword))
.Terms("agg_topcategory", f => f.Field(t=>t.TopCategoryName));
var result = client.SetPageNum(request.PageNum).SetPageSize(request.PageSize).Search(query, filters, a=> aggregation);
return client.FormatResult(result);
}
设置访问密码
- 安装x-pack
生产环境部署
设置外网访问
关闭防火墙,设置出站端口(9200),修改配置文件项 network.host
设置为Windows服务
进入ElasticSearch 的bin 目录 执行 elasticsearch-service.bat install
按住windows+R 键 输入services.msc 进去服务面板设置自动启动项
更新license授权文件
Windows 下可使用postman进行提交
申请license
官网申请地址:license 申请地址,选择自己对应的版本就可以了,证书有效期为1年,下载下来是一个json文件。P.S:6.3版本以上的ES不需要更新证书。
提交license
1.postman 中输入URL:localhost:9200/_license,请求方式为“PUT”,如果有使用到密码登录的,在[Authorization]选项卡中“type”选择 “Basic Auth”,输入自己的用户名和密码。[Body] 选项卡中选择 "Raw"-"JSON"。提交即可。
2.第一步返回200的状态码代表成功,这时候会让你添加一个参数[acknowledge=true]再提交一次以便确认。URL为:localhost:9200/_license?acknowledge=true,其他不变。