Elasticsearch.net项目

Elasticsearch.net项目实战

https://www.cnblogs.com/lucky_hu/p/9746736.html

elasticsearch.net项目实战

@智客幸达

目录
Elasticsearch+kibana
环境搭建
windows 10环境配置
安装Elasticsearch
head安装(非必需)
安装kibana
DSL的基本使用
增加
修改
查询
删除
Elasticsearch .Net
Low level client基本使用
项目实战
总结
参考
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最
先进、性能最好的、功能最全的搜索引擎库。

 一说到全文搜索,lucene久负盛名。早年间,因为项目需要,接触过一个叫盘古分词的开源项目,借助其中的分词实现了分词搜索的功能。而盘古分词就是lucence的.NET版本。据说这个开源项目已经恢复更新并支持. NET Core,有兴趣的童鞋可以去围观一下(https://github.com/LonghronShen/Lucene.Net.Analysis.PanGu/tree/netcore2.0)。

  我想很多童鞋都听过ELK,ELK是Elasticsearch、Logstash、Kibana。正好公司运维同事引入了这样一套体系,用于建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。虽然能够从一定程度上解决基本的问题,但是原生的kibana界面和查询方式都不够友好,很难推向广大的开发人员。于是我在想,我们是否可以利用这个开源的库集成到运维自动化平台当中,让这把利剑发挥出更大的价值。

一、环境搭建
 

本文是基于windows 10操作系统的es环境的搭建。

java环境安装
由于es是java语言开发的,所以这里要安装java环境。

 jdk下载:

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 安装完成之后就是配置环境变量:

 查看是否安装成功:

2.安装Elasticsearch

Elasticsearch版本已经比较多,初学者可能比较懵。特别是在安装head和Kibana的时候,如果版本不匹配,往往会导致无法使用。这里使用的是elasticsearch-5.6.11版本。

 elasticsearch-5.6.11下载:

https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-11

解压到C:\ELk 备用。

3.head安装(非必需)

es 4.x 版本安装head很简单,只需下载head插件解压到指定目录即可。es 5.x+需要借助node安装。

 head下载:

https://github.com/mobz/elasticsearch-head

解压到C:\ELk\elasticsearch-5.6.11

 node下载:

https://nodejs.org/dist/v8.12.0/node-v8.12.0-win-x64.zip

安装node

检查node和npm是否安装成功

path环境变量末尾 会自动增加 C:\Program Files\nodejs
安装 phantomjs
官网:http://phantomjs.org/下载【配置环境变量】

安装grunt
npm install -g grunt-cli

执行C:\ELk\elasticsearch-5.6.11\bin\elasticsearch.bat

执行命令启动 head

浏览器访问:http://localhost:9100/

4.安装kibana

导致为止,其实elasticsearch自身已经安装完成。通过Head就能很方便的操作es,但是kibana集成了head类似功能,并提供了更加友好的访问界面。

 kibana-5.6.9-windows-x86下载:

https://www.elastic.co/downloads/past-releases/kibana-5-6-9

下载之后,解压到C:\ELk\kibana-5.6.9-windows-x86

执行C:\ELk\kibana-5.6.9-windows-x86\bin\kibana.bat

浏览器访问:http://localhost:5601

二、DSL的基本使用

elasticsearch也像mysql一样提供了专门的语法来操作数据。Elasticsearch provides a full Query DSL (Domain Specific Language) based on JSON to define queries.

创建文档
PUT people/person/1?op_type=create
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
修改
POST /user/guest/20/_update
{
"doc": {
"RealName":"LukyHuu20"
}
}
查询
GET /user/guest/_search
{
"query": {
"match": {
"Id":22
}
}
}
删除
DELETE /user/guest/15
{

}
三、Elasticsearch .Net

 elasticsearch是以restfulAPI方式对外提供接口,并提供客户端给多种语言使用。Elasticsearch uses standard RESTful APIs and JSON. We also build and maintain clients in many languages such as Java, Python, .NET, SQL, and PHP. Plus, our community has contributed many more. They’re easy to work with, feel natural to use, and, just like Elasticsearch, don't limit what you might want to do with them.

参考(https://www.elastic.co/products/elasticsearch)

1.Low level client基本使用

 本文是介绍ES的.NET客户端,Elasticsearch .Net - Low level client[5.x]

通过引入对应的版本的客户端,便可通过C#操作ES。参考(https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/elasticsearch-net.html)

连接

var settings = new ConnectionConfiguration(new Uri("http://example.com:9200"))
.RequestTimeout(TimeSpan.FromMinutes(2));

var lowlevelClient = new ElasticLowLevelClient(settings);
插入文档

var indexResponse = lowlevelClient.Index<byte[]>("user", "guest", user.Id.ToString(), user);
byte[] responseBytes = indexResponse.Body;
更新文档

var searchResponse = lowlevelClient.Update("user", "guest", id.ToString(), new
{
doc = new
{
RealName = realname,
Description = description
}
});

bool successful = searchResponse.Success;
查询

var searchResponse = lowlevelClient.Search("user", "guest", new
{
query = new
{
match = new
{
Id = id
}
}
});

bool successful = searchResponse.Success;
删除

var searchResponse = lowlevelClient.Delete("user", "guest", id.ToString());

            bool successful = searchResponse.Success;

2.项目实战

 前面大致介绍了ES的安装和基本使用。那么,如何在项目中落地呢?

使用nuget安装Elasticsearch.Net 5.6.4

Install-Package Elasticsearch.Net -Version 5.6.4

安装完后,

基本的增删该查在项目中的实现上面已经有所介绍,这里重点讲一下查询:

笔者使用的.NET MVC5 Web框架,对于返回的结果笔者做了一个简单封装:

public class ESearchRoot
{
///

///
///

public int took { get; set; }
///

///
///

public string timed_out { get; set; }
///

///
///

public _shards _shards { get; set; }
///

///
///

public Hits hits { get; set; }
}

public class _shards
{
    /// <summary>
    ///
    /// </summary>
    public int total { get; set; }
    /// <summary>
    ///
    /// </summary>
    public int successful { get; set; }
    /// <summary>
    ///
    /// </summary>
    public int skipped { get; set; }
    /// <summary>
    ///
    /// </summary>
    public int failed { get; set; }
}

public class HitsItem<T>
{
    /// <summary>
    ///
    /// </summary>
    public string _index { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string _type { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string _id { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string _score { get; set; }
    /// <summary>
    ///
    /// </summary>
    public T _source { get; set; }
    /// <summary>
    ///
    /// </summary>
    public List<int> sort { get; set; }
    /// <summary>
    ///
    /// </summary>
    public Highlight highlight { get; set; }
}

public class Hits<T>
{
    /// <summary>
    ///
    /// </summary>
    public int total { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string max_score { get; set; }
    /// <summary>
    ///
    /// </summary>
    public List<HitsItem<T>> hits { get; set; }
}

public class Highlight
{
    /// <summary>
    ///
    /// </summary>
    public List<string> Description { get; set; }
}

因为soure返回的对象是不定的,所以使用了泛型。
本项目soure对应的类,user:

///

///
///

public class User
{
///

///
///

public string Account { get; set; }
///

///
///

public string Phone { get; set; }
///

///
///

public string Email { get; set; }
///

///
///

public string RealName { get; set; }
///

///
///

public string CanReview { get; set; }
///

///
///

public string CanExcute { get; set; }
///

///
///

public string Avatar { get; set; }
///

///
///

public string IsUse { get; set; }
///

///
///

public int Id { get; set; }
///

///
///

public string Name { get; set; }
///

///
///

public string Description { get; set; }
///

///
///

public DateTime CreateTime { get; set; }
///

///
///

public DateTime ModifyTime { get; set; }
}

项目使用了带条件的分页查询:

public List GetBySomeWhere(string keyword, int limit, int pageSize, out int total)
{
List users = new List();

        total = 0;
        try
        {
            var settings = new ConnectionConfiguration(new Uri("http://localhost:9200/"))

.RequestTimeout(TimeSpan.FromMinutes(2));

            var lowlevelClient = new ElasticLowLevelClient(settings);

            //根据不同的参数 来构建不同的查询条件
            var request = new object();
            if (!String.IsNullOrEmpty(keyword))
            {
                request = new
                {
                    from = limit,
                    size = pageSize,
                    query = new
                    {
                        match = new
                        {
                            Description = keyword
                        }
                    },
                    highlight = new
                    {
                        fields = new
                        {
                            Description = new { }
                        }
                    },
                    sort = new
                    {
                        Id = new
                        {
                            order = "desc"
                        }
                    }
                };
            }
            else
            {
                request = new
                {
                    from = limit,
                    size = pageSize,
                    query = new
                    {
                        match_all = new
                        {

                        }
                    },
                    highlight = new
                    {
                        fields = new
                        {
                            Description = new { }
                        }
                    },
                    sort = new
                    {
                        Id = new
                        {
                            order = "desc"
                        }
                    }
                };
            }

            var searchResponse = lowlevelClient.Search<string>("user", "guest", request);

            bool successful = searchResponse.Success;
            var responseJson = searchResponse.Body;

            if (!successful)
            {
                return users;
            }

            ESearchRoot<User> root = JsonHelper.JSONStringObject<ESearchRoot<User>>(responseJson);
            if (root != null)
            {
                total = root.hits.total;
                foreach (HitsItem<User> item in root.hits.hits)
                {
                    if (item._source != null)
                    {
                        string highlightDescription = String.Empty;
                        StringBuilder sbDs = new StringBuilder();
                        if (item.highlight != null && item.highlight.Description.Count > 0)
                        {
                            //ighlightDescription = item.highlight.Description[0];
                            foreach (var d in item.highlight.Description)
                            {
                                sbDs.Append(d);
                            }
                            highlightDescription = sbDs.ToString();
                        }

                        AdminUser user = new AdminUser
                        {
                            Id = item._source.Id,
                            RealName = item._source.RealName,
                            Account = item._source.Account,
                            Email = item._source.Email,
                            Phone = item._source.Phone,
                            //IsUse=item._source.IsUse,
                            Avatar = item._source.Avatar,
                            Description = item._source.Description,
                            HighlightDescription = highlightDescription,
                            CreateTime = item._source.CreateTime,
                            ModifyTime = item._source.ModifyTime
                        };
                        users.Add(user);
                    }
                }
            }

            return users;
        }
        catch (ElasticsearchClientException ex)
        {
            //Log4Helper.Error
        }
        return users;
    }

项目最终的效果如下:

四、总结

 elasticsearch是很强大的开源工具,在实现全文搜索上有其独到之处,也是大数据的分析方面利器,值得大家深入去研究和实践。

五、参考

??Elasticsearch权威指南
??Elasticsearch.Net 5.x
??Elasticsearch Reference [5.6] ? Document APIs
??elasticsearch-net-example
??ElasticSearch安装及HEAD插件配置

原文地址:https://www.cnblogs.com/Leo_wl/p/9756323.html

时间: 2024-11-06 09:49:17

Elasticsearch.net项目的相关文章

Elasticsearch.net项目实战

elasticsearch.net项目实战 @智客幸达 目录 Elasticsearch+kibana 环境搭建 windows 10环境配置 安装Elasticsearch head安装(非必需) 安装kibana DSL的基本使用 增加 修改 查询 删除 Elasticsearch .Net Low level client基本使用 项目实战 总结 参考 ? ???Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被

elasticsearch搜索项目重构

这段时间一直在忙着重构公司之前的搜索业务这块,由于公司之前的搜索使用的是基于mysql的方案,因为里面涉及到一些主从搜索,分表搜索,索引整体上比较复杂,重构期间要花很多时间理解业务跟数据表之间的关系,理清之后呢,还要结合elasticsearch的特性开始重构整个搜索平台. 由于公司是使用Hessian搭建的RPC服务,拿到服务包之后便开始基于elasticsearch的API实现搜索方案了,下面主要列一下重构的主要步骤,然后在依次做介绍: 搭建elasticsearch集群服务,这个比较简单.

(19)ElasticSearch java项目中的批量操作mget和bulk

1.查询索引是index1,类型是blog,id是8.10和索引是lib3,类型是user,id是1.2.3的文档 @Test public void testMultiGet() throws IOException, InterruptedException, ExecutionException { //指定集群 Settings settings = Settings.builder().put("cluster.name","my-application"

(21)ElasticSearch java项目中match、multimath、term、terms以及范围、前缀、通配符、模糊、类型、ids等查询示例

1.查询index1中content字段包含工厂的文档 @Test public void testMatch() throws IOException, InterruptedException, ExecutionException { //指定集群 Settings settings = Settings.builder().put("cluster.name","my-application").build(); //创建客户端 TransportClien

(20)ElasticSearch java项目中的根据指定条件删除文档和查询所有文档

1.删除index1中,title包含工厂的文档 @Test public void testQueryDelete() throws IOException, InterruptedException, ExecutionException { //指定集群 Settings settings = Settings.builder().put("cluster.name","my-application").build(); //创建客户端 TransportCl

开源搜索引擎评估:lucene sphinx elasticsearch

目录(?)[+] 开源搜索引擎评估:lucene sphinx elasticsearch 开源搜索引擎程序有3大类 lucene系,java开发,包括solr和elasticsearch sphinx,c++开发,简单高性能 Xapian,c++开发 搜索引擎程序这个名称不妥当,严格说来应该叫做索引程序(indexing program),早期主要用来做中文全文搜索,但是随着互联网的深入普及,各家网站规模越来越大,索引程序在 优化网站架构上发挥了更大的作用:替代mysql数据库内置的索引 让m

ELK笔记(一)elasticsearch安装

未来一段时间,可能会学习ELK日志处理的框架.在学习的过程中,会通过<实战ELK--分布式大数据搜索与日志挖掘及可视化解决方案>.<Elasticsearch中文指南>及各大论坛相关技术贴完成自己的学习过程.在学习的过程中,我会通过笔记的形式将一些技术点或知识记录在此,不仅希望以后自己需要的时候直接来查阅,更是希望能够帮助更多的人.该系列笔记仅仅是个人学习中的点滴记录,如果存在什么知识点错误等,欢迎广大同仁批评指导. 一.Elasticsearch安装 项目网站:https://w

电商订单ElasticSearch同步解决方案--使用logstash

一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logstash 2.安装logstash前,确保需要先安装java的jdk环境 3.下载后,解压:之后千万别到bin环境点击logstash.bat这个命令启动,这样会报错的 4.接下来,在logstash安装目录找到config文件夹,在那里新增一个文件夹,我新建的为shop文件夹,然后在里面添加如下文

ES 常用java api

java rest client 有两种: 1.Java Low Level REST Client :用于Elasticsearch的官方低层客户端.它允许通过http与Elasticsearch集群通信.叶子请求编组,响应反编组给用户.它兼容所有的Elasticsearch版本. 2.Java High Level REST Client :Elasticsearch的官方高级客户端.它基于底层客户端,公开API特定的方法,处理请求编组和响应反编组. 一.Java Low Level RES