ElasticsearchCRUD使用(四)【使用EF从SQLServer到Elasticsearch的数据传输】

大数据测试-hive、doris、clickhouse、mysql、elasticsearch、kudu、postgresql、sqlserver 大数据工作要接触很多的数据库和查询引擎 数据库: 1、hive:用于跑批,大批量,稳定,缺点:无update。用于数仓 2、doris:已更名starrocks。即时查询 可达千亿级别 3、clickhouse:亿级别 局限性:主表,单表支持能力强,join能力弱 4、mysql:开源免费,十万级别查询 5、elasticsearch:不支持join,有些函数不支持 优点是检索快 6、kudu:能支持update、千万级别。数据量大(百亿级别)性能问题明显 7、postgresql:关系型数据库,支持很多 阅读详情

AdventureWorks2012用作数据库,可以在这里下载。 您需要在代码工作之前安装数据库。

应用程序

创建一个新的控制台应用程序,并从NuGet下载ElasticsearchCRUD和Entity Framework。
这里写图片描述

从AdventureWorks数据库创建代码第一个数据库。

向项目添加一个新项,选择ADO.NET实体数据模型:
这里写图片描述
现在从数据库选项首先选择代码。 数据库已经存在。
这里写图片描述
从Person架构添加所有表。 Address表和Person表将用作文档根。
这里写图片描述

创建的Address类需要更改。 必须删除DbGeography SpatialLocation,因为这不是支持的类型。 在ElasticsearchCRUD V1.0.8或更高版本中,可以使用JsonIgnore属性忽略这一点。

namespace DataTransferSQLToEl.SQLDomainModel
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    [Table("Person.Address")]
    public partial class Address
    {
        public int AddressID { get; set; }

        [Required]
        [StringLength(60)]
        public string AddressLine1 { get; set; }

        [StringLength(60)]
        public string AddressLine2 { get; set; }

        [Required]
        [StringLength(30)]
        public string City { get; set; }

        public int StateProvinceID { get; set; }

        [Required]
        [StringLength(15)]
        public string PostalCode { get; set; }

        // This type is not supported yet...
        //public DbGeography SpatialLocation { get; set; }

        public Guid rowguid { get; set; }

        public DateTime ModifiedDate { get; set; }

        public virtual StateProvince StateProvince { get; set; }
    }
}

选择实体并将文档添加到Elasticsearch。 Address 传输实现如下:

public void SaveToElasticsearchAddress()
{
    IElasticsearchMappingResolver elasticsearchMappingResolver = new ElasticsearchMappingResolver();
    using (var elasticsearchContext = new ElasticsearchContext("http://localhost:9200/", elasticsearchMappingResolver))
    {
        //elasticsearchContext.TraceProvider = new ConsoleTraceProvider();
        using (var modelPerson = new ModelPerson())
        {
            int pointer = 0;
            const int interval = 100;
            int length = modelPerson.CountryRegion.Count();

            while (pointer < length)
            {
                stopwatch.Start();
                var collection = modelPerson.Address.OrderBy(t => t.AddressID).Skip(pointer).Take(interval).ToList<Address>();
                stopwatch.Stop();
                Console.WriteLine("Time taken for select {0} AddressID: {1}", interval, stopwatch.Elapsed);
                stopwatch.Reset();

                foreach (var item in collection)
                {
                    elasticsearchContext.AddUpdateDocument(item, item.AddressID);
                    string t = "yes";
                }

                stopwatch.Start();
                elasticsearchContext.SaveChanges();
                stopwatch.Stop();
                Console.WriteLine("Time taken to insert {0} AddressID documents: {1}", interval, stopwatch.Elapsed);
                stopwatch.Reset();
                pointer = pointer + interval;
                Console.WriteLine("Transferred: {0} items", pointer);
            }
        }
    }
}

一次选择了一百个实体,并将其添加到ElasticsearchCRUD上下文中。 这只是将对象添加到内存集合中。 调用SaveChanges方法时,将每个实体序列化为JSON对象。 当所有项目都被序列化时,HttpClient实例将HTTP批量POST请求中的所有对象发送到Elasticsearch。 直到所有项都被传输为止。 ElasticsearchCRUD将所有子元素序列化为1-N。 对已经转换的父对象的任何引用都将被忽略并保存为空属性。

创建的Elasticsearch 映射如下(对于Person和Address文档):

{
    "addresss": {
        "mappings": {
            "address": {
                "properties": {
                    "addressid": { "type": "long" },
                    "addressline1": { "type": "string" },
                    "addressline2": { "type": "string" },
                    "city": { "type": "string" },
                    "modifieddate": { "type": "date", "format": "dateOptionalTime" },
                    "postalcode": { "type": "string" },
                    "rowguid": { "type": "string" },
                    "stateprovince": { "properties": { "countryregion": { "properties": { "countryregioncode": { "type": "string" }, "modifieddate": { "type": "date", "format": "dateOptionalTime" }, "name": { "type": "string" } } }, "countryregioncode": { "type": "string" }, "isonlystateprovinceflag": { "type": "boolean" }, "modifieddate": { "type": "date", "format": "dateOptionalTime" }, "name": { "type": "string" }, "rowguid": { "type": "string" }, "stateprovincecode": { "type": "string" }, "stateprovinceid": { "type": "long" }, "territoryid": { "type": "long" } } },
                    "stateprovinceid": { "type": "long" } }
            }
        }
    },
    "persons": {
        "mappings": {
            "person": {
                "properties": {
                    "additionalcontactinfo": { "type": "string" },
                    "businessentityid": { "type": "long" },
                    "demographics": { "type": "string" },
                    "emailaddress": { "properties": { "businessentityid": { "type": "long" }, "emailaddress1": { "type": "string" }, "emailaddressid": { "type": "long" }, "modifieddate": { "type": "date", "format": "dateOptionalTime" }, "rowguid": { "type": "string" } } },
                    "emailpromotion": { "type": "long" },
                    "firstname": { "type": "string" },
                    "lastname": { "type": "string" },
                    "middlename": { "type": "string" },
                    "modifieddate": { "type": "date", "format": "dateOptionalTime" },
                    "namestyle": { "type": "boolean" },
                    "personphone": { "properties": { "businessentityid": { "type": "long" }, "modifieddate": { "type": "date", "format": "dateOptionalTime" }, "phonenumber": { "type": "string" }, "phonenumbertype": { "properties": { "modifieddate": { "type": "date", "format": "dateOptionalTime" }, "name": { "type": "string" }, "phonenumbertypeid": { "type": "long" } } }, "phonenumbertypeid": { "type": "long" } } },
                    "persontype": { "type": "string" },
                    "rowguid": { "type": "string" },
                    "suffix": { "type": "string" },
                    "title": { "type": "string" } }
            }
        }
    }

}

可以使用ElasticsearchCRUD如下读取保存的对象。

ublic Address GetAddressFromElasticsearch(int id)
{
    Address address;
    IElasticsearchMappingResolver elasticsearchMappingResolver = new ElasticsearchMappingResolver();
    using (var elasticsearchContext = new ElasticsearchContext("http://localhost:9200/", elasticsearchMappingResolver))
    {
        address = elasticsearchContext.GetDocument<Address>(id);
    }

    return address;
}

然后可以在控制台应用程序中使用。 完成后,具有嵌套子对象的所有对象将作为文档保存在Elasticsearch中。

using System;

namespace DataTransferSQLToEl
{
    class Program
    {
        static void Main(string[] args)
        {
            var repo = new Repo();
            repo.SaveToElasticsearchPerson();
            repo.SaveToElasticsearchAddress();

            var personX = repo.GetPersonFromElasticsearch(345);
            var addressX = repo.GetAddressFromElasticsearch(22);
            Console.WriteLine(addressX);
            Console.WriteLine(personX);
        }
    }
}

如果您只希望保存父实体,并且不包含子实体(Elasticsearch中的NESTED对象),则可以在ElasticsearchCRUD上下文构造函数中设置此选项:

bool saveChildEntitiesAsNestedObjects = false;

using (var elasticSearchContext = 
              new ElasticsearchContext(
                 "http://localhost:9200/", 
                  elasticsearchMappingResolver, 
                  saveChildEntitiesAsNestedObjects 
              )
      )
{
  // Do you coding here...
}
SQL Server 2022 数据同步到 Elasticsearch 思考 公司的老项目了,采用的是sqlserver 2022作为数据卡做的,但是产品对接客户,发现对搜索的要求很高,尤其是全文检索,考虑到ES采用倒排所以效率上的优势和整体开发的成本,大佬们商量之后,果断的采用了Elasticsearch作为搜索引擎的策略,那么剩下的就是如何将数据同步到ES的问题了,这个的一部分也就是我的工作了,所以分享一下自己工作过程当中的思路和遇到的问题。 阅读详情

相关推荐

ElasticSearch架构介绍及原理解析

Elasticsearch 是一个强大的全文搜索和分析引擎,它基于 Lucene 搜索引擎,并提供了丰富的功能和特性。Elasticsearch 的架构设计是为了满足现代应用程序的高性能、高可用性和高可扩展性需求。它的核心原理包括文档索引、倒排索引、分片和副本、搜索和查询、高可用性和负载均衡、数据同步和更新以及分布式搜索。

u013558123的博客 1804

Elasticsearch 结合 SQL Server

原文链接https://www.pluralsight.com/blog/it-ops/elasticsearch-and-sql-server How to use Elasticsearch with SQL Server怎样将ElasticSearch与SQLServer结合使用如果你是一个SQLServer管理员,需要把你的全部数据以更加有趣和有效的方式展示出来,那...

weixin_34151004的博客 1330

基于Logstash由SQLServer向Elasticsearch同步数据:环境准备【SQL Server data to Elasticsearch using LogStash】

整体介绍文档:https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-tracking-sql-server?elasticsearch-head 则是一款开源的ElasticSearch管理界面,它的项目主页为:https://github.com/mobz/elasticsearch-head。英文差的朋友可以把URL中的en-us改成zh-cn来看中文的文档。

专注于计算机研发知识和资讯分享 1571

Elasticsearch与SQL Server对比

1.背景介绍 Elasticsearch和SQL Server都是现代数据库系统,它们各自具有不同的特点和优势。Elasticsearch是一个分布式搜索和分析引擎,基于Lucene库,主要用于全文搜索和实时数据分析。SQL Server是微软的关系型数据库管理系统,支持ACID事务和SQL查询语言。在本文中,我们将对比这两个数据库系统的特点、优势和适用场景,以帮助读者更好地了解它们之间的差异。...

AI天才研究院 1617

基于Logstash由SQLServer向Elasticsearch同步数据: logstash配置文件

官方文档:https://www.elastic.co/guide/en/logstash/current/pipeline.html。statement : sql 里面的字段首字母必须as 成小写,或者你直接小写也行,但是必须的小写。依赖DB中的特定字段,可能会涉及到原有表结构的修改。在删除数据时无法通过这种方式获得数据的变更。x_Loan_PreservationAdvanceList.sql 需要同步数据执行的Sql。解压完成后,进入解压后的logstash-7.2.0文件夹。

专注于计算机研发知识和资讯分享 1040

elasticsearch进行mysql同步的安装工具

elasticsearch-2.3.2.tar.gz和elasticsearch-jdbc-2.3.2.0-dist.zip,可以进行mysql数据库数据同步到es中,亲测有效。详见博客http://www.cnblogs.com/zhongshengzhen/

es 链接mysql_开始使用ElasticSearch(四)之将SqlServer数据库数据导入ES

开始导数据之前考虑必须考虑清楚需要什么。1.导入数据需要读数据库 JDBC Connector(因为这个是基于JAVA的)2.中间件工具Logstash (这个ES官网提供的)那么开始咯。试试看呀伐!把**JDBC for SQL**解压到D盘(我只是做个示范噢。)把Logstash解压到D盘。注意看下我的两个版本,我把我的数据库版本也贴出来,这样更直观。思路:Logstash 来使用 JDBC ...

weixin_40007189的博客 947

用于SqlServer 同步数据到ElasticSearch的logstash测试

使用logstash,解耦sqlserver数据同步到elasticsearch,.net平台下,异步查询优化

Springboot整合单机版elasticsearch(windows)并与SqlServer同步数据

临时测试学习使用,所以就不搭建集群了,集群搭建配置要弄得比较多。 直接在es官网下载6.4.3这个版本的es,然后下载对应的logstash 直接打开这个bat就可以了 访问localhost:9200 有一堆json,说明成功启动了 然后来做logstash数据同步的配置 现在bin建个jdbcconfig目录,里面写同步相关的一些配置 input { jdbc { jdbc_driver_library => "D:\Program Files (x86)\apache-maven

841

基于Java的bboss-datatran数据采集与流批一体化处理工具设计源码

本bboss-datatran项目基于Java开发,包含591个文件,包括Java源代码、Markdown文档、GIT忽略文件、Gradle构建文件、Properties配置文件、Preferences配置文件、XML配置文件、GIT属性文件、LICENSE文件和PNG图片。系统实现了数据采集、数据清洗转换处理、数据入库以及数据指标统计计算的流批一体化处理功能,界面友好,功能完善,适合用于数据采集与处理。

从仿真到真机:如何将XTDrone的VINS-Fusion+RTABMap建图方案部署到真实无人机上?

本文详细介绍了如何将XTDrone的VINS-Fusion+RTABMap建图方案从仿真环境迁移到真实无人机上。内容涵盖硬件选型、传感器配置、VINS-Fusion调优、RTABMap性能优化以及系统集成等关键步骤,特别针对三维稠密重建在真实环境中的挑战提供了实用解决方案。

weixin_29056781的博客 241

ElasticsearchCRUD翻译系列之(一): ElasticsearchCRUD 介绍

ELASTICSEARCH CRUD .NETPROVIDER 翻译自(原文地址: https://damienbod.com/2014/09/22/elasticsearch-crud-net-provider/) 本文介绍了ElasticsearchCRUD NuGet包的使用。ElasticsearchCRUD便于你通过对实体的插入、删除、修改从Elasticsearch中查找单个记录...

weixin_30580943的博客 123

SpringBoot3项目实战:5分钟搞定Knife4j接口文档配置(含中文版设置)

本文详细介绍了在SpringBoot3项目中快速整合Knife4j接口文档工具的实战教程。内容涵盖核心依赖选择、基础配置、中文界面设置、API信息深度定制以及生产环境安全策略,帮助开发者高效构建专业、可交互的API文档门户,提升团队协作效率。

weixin_29204121的博客 256

logstash 8.1.0 读取sql server 2016的表数据到elasticsearch 8.1.0中

logstash 8.1.0 读取SQLserver数据,写入elasticsearch 8.1.0

festone000的专栏 3617

深入解析时钟同步技术:相位同步、频率同步与同源时钟的实战应用

本文深入解析时钟同步技术的三种核心方式:相位同步、频率同步与同源时钟,详细阐述其技术原理、实现方案及实战应用。通过对比分析不同同步方式的特点与适用场景,为电子系统设计提供选型指南,帮助工程师优化时钟网络设计,提升系统稳定性和性能。

weixin_29240711的博客 449

硬件级Dalvik字节码粒度无痕HOOK及VMP取址码定位分析

2.通过硬件读写断点的输出信息 可知pc寄存器就是art解释器的取码地址 直接硬件执行断点在这个pc 即可直接trace所有的smali执行流 通杀所有机型系统。本文即将探讨的是 如何在硬件级别实现dalvik bytecode粒度的无痕拦截技术 并实现鼠标点击一键hook 指哪儿打哪儿 感受 button power 的强大魅力!4.由于硬件断点是同步的 断下后可随时硬件dump下这一瞬间的app内存映像 写入unicorn的内存模拟执行。解释器在解释执行前必会读取内存中的bytecode。

2503_90751789的博客 1084

SQLServer同步数据到ElasticSearch

window10环境下 1.中间工具: JDK,JDBC,Logstash,ElasticSearch JDBC:https://download.microsoft.com/download/3/7/9/379E727A-58F5-45E6-9D45-95D593399F93/sqljdbc_6.2.2.1_chs.exe Logstash:https://artifacts.elastic.co/downloads/logstash/logstash-7.7.0.zip ElasticSear

atzqtzq的博客 3315

系统安装(kuntaiR522 kvm安装)

鲲泰R522服务器kvm安装rocky

weixin_46396917的博客 1818

在Shell里面logstash 将sqlserver的数据导入elasticsearch-5.6.0出现报错

ERROR: Unknown command ‘–f’ See: ‘bin/logstash --help’ [ERROR] 2021-12-07 15:56:11.092 [main] Logstash - java.lang.IllegalStateException: Logstash stopped processing because o f an error: (SystemExit) exit 按照提示 输入–help ,然后再重新-f 加地址。 提示端口报错,是地址填写不对 应该是:jdb

qq_42080753的博客 2184

吉林大学数据库期末考试试卷讲解

给出几套期末真题及解析,给出复习建议。

一杯水果茶!足矣~ 3138

《Android最全面试题-Offer直通车》目录

如今Android求职是僧多粥少,竞争非常激烈,企业招聘时要求很高,本专栏汇聚android面试各种考点,各大公司Android面试题,《Android 最全面试题》将助你全方位提升,助您脱颖而出,早日拿到满意Offer。本专栏汇聚了海量优质内容,文章数量超过100 篇。凭借过硬的质量,每月新增订阅用户数以百计,如今仅需特惠价 9.9 元,限时抢购,后续将逐步恢复原价,早订阅早开启逆袭之旅。精心筹备,整理出一系列超万字精华篇章,累计数十万的 Android 面试题深度剖析。

大模型大数据攻城狮的专栏 2860

ElasticSearch实战——.Net Core中的应用

dll引用:   NLog.Targets.ElasticSearch,版本:4.0.0-beta26   Nlog,版本:4.5.0-rc04   Microsoft.Extensions.Configuration,版本:2.0.0 appsettings.json(属性=》复制到输出目录:始终复制),ElasticSearch的url配置 { "ElasticSea...

weixin_30446197的博客 324

Mac安装Typescript报错

根本原因是系统级目录的权限限制。推荐通过修改目录权限或使用nvm彻底解决问题。

江拥羡橙的博客 210

Es库存管理系统使用方法(Excel+SQLSERVER)

出入库明细是保存出入库记录原始数据,如果需要修改,请根据条件查询要修改的记录(不要查询出所有数据),然后这里直接修改数据,修改完之后点击上面的【批量修改】按钮,可修改根据条件查询出的所有数据,因为进出明细数据量太多并且涉及各列关联,很容易修改错误,要特别小心。基础信息列表里的数据,会在以后的出入库操作中频繁调用,以减少手工输入的麻烦。(2)双击需要登记的物料,系统自动填写选择的这个物料的编码、名称、规格型号、单位、单价等信息,其中单价是调用物料信息表里的单价,可以使用默认单价,也可以在此处修改为其它单价。

M.Wang的博客 2357

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一个.Net Core开源监控解决方案,支持Redis、Elasticsearch、SqlServer

欢迎加入.Net编程学习小圈子,一起打卡交流学习。项目发布后,对于我们程序员来说,项目还不是真正的结束,保证项目的稳定运行也是非常重要的,而对于服务器的监控,就是保证稳定运行的手段之一。对数据库、Redis、ES等一些中间件的监控,也都是非常重要。所以,今天给大家推荐一个轻量级的开源监控解决方案。项目简介这是有 Stack Overflow 的开源监控产品,基于.Net Core开发的监控解决...

zls365365的博客 681

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Elasticsearch.Net使用(一)【入门篇】

首先去官网下载Elasticsearch 2.3.4安装包,解压后,在cmd命令行进入安装目录,再进入 bin目录,运行elasticsearch.bat命令 elasticsearch插件elasticsearch-head安装: bin目录下执行命令plugin -install mobz/elasticsearch-head 然后开始.net编程,构建控制台应用程序 Progra

极客神殿 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: ElasticsearchCRUD使用(三)【嵌套文档的MVC】
下一篇: ElasticsearchCRUD使用(五)【Elasticsearch中的子文档,父文档】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值