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

  1. (安装Java)ElasticSearch(ES) 是基于 Lucene  的封装。所以想要运行ES 需要安装Java的JDK。这里推荐安装Java8,171的版本,安装完成后可在cmd下查看 java 和 javac 的版本信息,java -version   javac -version  ,能正常返回版本信息即是安装成功。Tips:这里需要提前配置好Java的环境变量。可参考 百度经验-Windows 10 配置Java环境变量

  2. (安装ES)接下来去官网下载ES的安装包即可,官网提供zip,msi 两种安装方式。zip 方式相对较简洁。msi 操作简单。

  3. (安装常用插件)ES常用的插件有ik分词器,在官网下载好zip包,直接解压缩到ES的安装目录下的plugins文件夹下即可,我的安装路径如下:E:\elasticsearch-6.2.4\plugins。安装完成后需要重启ES。

  4. (安装可视化工具)这里推荐安装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);
        }

设置访问密码

  1. 安装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,其他不变。

posted @ 2020-10-22 11:05  HelloValue  阅读(303)  评论(0编辑  收藏  举报