elasticsearch学习二:导入数据

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: elasticsearch学习二:导入数据

安装go-elasticsearch,gorm

go get -u github.com/jinzhu/gorm
go get github.com/elastic/go-elasticsearch/v7

我的是v7版本,所以elasticsearch使用v7,如果是v8则改成v8

go-elasticsearch和gorm操作

func EsClient() *elasticsearch.Client {
   cfg := elasticsearch.Config{
      Addresses: \[\]string{
         "http://127.0.0.1:9200",
      },
   }
   es, err := elasticsearch.NewClient(cfg)
   if err != nil {
      log.Fatalf("Error creating the client: %s", err)
   }
   // Get cluster info
   //
   var r map\[string\]interface{}
   res, err := es.Info()
   if err != nil {
      log.Fatalf("Error getting response: %s", err)
   }
   // Check response status
   if res.IsError() {
      log.Fatalf("Error: %s", res.String())
   }
   // Deserialize the response into a map.
   if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
      log.Fatalf("Error parsing the response body: %s", err)
   }
   // Print client and server version numbers.
   log.Printf("Client: %s", elasticsearch.Version)
   log.Printf("Server: %s", r\["version"\].(map\[string\]interface{})\["number"\])
   log.Println(strings.Repeat("~", 37))
   return es
}
func Db() *gorm.DB {
   db, err := gorm.Open("mysql", "robot:bK8D6pAx82iTSWrK@(admin.easyswoole.cn:3306)/robot?charset=utf8mb4&parseTime=True&loc=Local")
   if err != nil {
      panic(err)
   }
   return db
}

elasticsearch导入

在7.0之后的版本,一个index只允许一个type,所以不需要额外定义type

func AddEsData(es *elasticsearch.Client, info LogInfo) {
   id := info.Id
   // Build the request body.
   data, err := json.Marshal(info)
   if err != nil {
      log.Fatalf("Error marshaling document: %s", err)
   }
   // Set up the request object.
   req := esapi.IndexRequest{
      Index:      "test",
      DocumentID: strconv.Itoa(id),
      Body:       bytes.NewReader(data),
      Refresh:    "true",
   }
   // Perform the request with the client.
   res, err := req.Do(context.Background(), es)
   if err != nil {
      log.Fatalf("Error getting response: %s", err)
   }
   defer res.Body.Close()
   if res.IsError() {
      fmt.Println(res)
      log.Printf("\[%s\] Error indexing document ID=%d", res.Status(), info.Id)
   } else {
      // Deserialize the response into a map.
      var r map\[string\]interface{}
      if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
         log.Printf("Error parsing the response body: %s", err)
      } else {
         // Print the response status and indexed document version.
         //log.Printf("\[%s\] %s; version=%d", res.Status(), r\["result"\], int(r\["_version"\].(float64)))
      }
   }
}

总的代码:

package main
import (
   "bytes"
   "context"
   "encoding/json"
   "fmt"
   "github.com/elastic/go-elasticsearch/v7"
   "github.com/elastic/go-elasticsearch/v7/esapi"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
   "log"
   "strconv"
   "strings"
   "sync"
)
type LogInfo struct {
   Id               int    \`gorm:"primary_key"\`
   Type_name        string \`gorm:""\`
   Type             string \`gorm:""\`
   Sub_type         string \`gorm:""\`
   Sub\_type\_name    string \`gorm:""\`
   Time             string \`gorm:""\`
   Login_qq         string \`gorm:""\`
   Send_qq          string \`gorm:""\`
   Group            string \`gorm:""\`
   Content          string \`gorm:""\`
   Font_id          string \`gorm:""\`
   File             string \`gorm:""\`
   Being\_operate\_qq string \`gorm:""\`
   Add_time         string \`gorm:""\`
}
func EsClient() *elasticsearch.Client {
   cfg := elasticsearch.Config{
      Addresses: \[\]string{
         "http://127.0.0.1:9200",
      },
   }
   es, err := elasticsearch.NewClient(cfg)
   if err != nil {
      log.Fatalf("Error creating the client: %s", err)
   }
   // Get cluster info
   //
   var r map\[string\]interface{}
   res, err := es.Info()
   if err != nil {
      log.Fatalf("Error getting response: %s", err)
   }
   // Check response status
   if res.IsError() {
      log.Fatalf("Error: %s", res.String())
   }
   // Deserialize the response into a map.
   if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
      log.Fatalf("Error parsing the response body: %s", err)
   }
   // Print client and server version numbers.
   log.Printf("Client: %s", elasticsearch.Version)
   log.Printf("Server: %s", r\["version"\].(map\[string\]interface{})\["number"\])
   log.Println(strings.Repeat("~", 37))
   return es
}
func Db() *gorm.DB {
   db, err := gorm.Open("mysql", "robot:bK8D6pAx82iTSWrK@(admin.easyswoole.cn:3306)/robot?charset=utf8mb4&parseTime=True&loc=Local")
   if err != nil {
      panic(err)
   }
   return db
}
func main() {
   es := EsClient()
   res, err := es.Info()
   if err != nil {
      log.Fatalf("Error getting response: %s", err)
   }
   defer res.Body.Close()
   db := Db()
   defer db.Close()
   db.AutoMigrate(&LogInfo{})
   var list = &\[\]LogInfo{}
   lastId := 30308
start:
   db.Table("log").Limit(100).Order("id ASC").Where("id > ?", lastId).Find(list)
   var wg sync.WaitGroup
   for _, logInfo := range *list {
      wg.Add(1)
      go func(info LogInfo) {
         defer wg.Done()
         AddEsData(es, info)
      }(logInfo)
      lastId = logInfo.Id
   }
   wg.Wait()
   goto start
   //fmt.Println(list)
   //log.Println(res)
}
func AddEsData(es *elasticsearch.Client, info LogInfo) {
   id := info.Id
   // Build the request body.
   data, err := json.Marshal(info)
   if err != nil {
      log.Fatalf("Error marshaling document: %s", err)
   }
   // Set up the request object.
   req := esapi.IndexRequest{
      Index:      "test",
      DocumentID: strconv.Itoa(id),
      Body:       bytes.NewReader(data),
      Refresh:    "true",
   }
   // Perform the request with the client.
   res, err := req.Do(context.Background(), es)
   if err != nil {
      log.Fatalf("Error getting response: %s", err)
   }
   defer res.Body.Close()
   if res.IsError() {
      fmt.Println(res)
      log.Printf("\[%s\] Error indexing document ID=%d", res.Status(), info.Id)
   } else {
      // Deserialize the response into a map.
      var r map\[string\]interface{}
      if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
         log.Printf("Error parsing the response body: %s", err)
      } else {
         // Print the response status and indexed document version.
         //log.Printf("\[%s\] %s; version=%d", res.Status(), r\["result"\], int(r\["_version"\].(float64)))
      }
   }
}
相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
JSON Ubuntu Java
Elasticsearch聚合学习之四:结果排序
在前面的实战中,聚合的结果以桶(bucket)为单位,放在JSON数组中返回,这些数据是没有排序的,今天来学习如何给这些数据进行排序
363 0
Elasticsearch聚合学习之四:结果排序
|
2月前
|
存储 缓存 自然语言处理
Elasticsearch框架学习的难点和重点有哪些
Elasticsearch是基于Lucene的开源搜索引擎,广泛应用于全文检索和日志分析。学习重点包括理解节点、集群、索引、分片和副本等基本概念,掌握数据索引、查询DSL、聚合和性能优化。倒排索引和分词器是全文搜索的核心,集群管理和监控对于稳定性至关重要。实践中需根据数据量和查询模式优化分片策略,利用缓存提升搜索性能。学习Elasticsearch要结合实际项目,关注官方文档和社区资源。【5月更文挑战第6天】
|
2月前
|
人工智能 架构师 开发者
大模型时代,该如何更好的学习 Elasticsearch?
大模型时代,该如何更好的学习 Elasticsearch?
33 0
|
11月前
|
SQL JSON 自然语言处理
Elasticsearch学习随笔与Scrapy中Elasticsearch的应用
Elasticsearch学习随笔与Scrapy中Elasticsearch的应用
|
Java API Maven
ElasticSearch学习(三):Java API操作ElasticSearch
ElasticSearch学习(三):Java API操作ElasticSearch
201 0
ElasticSearch学习(三):Java API操作ElasticSearch
|
关系型数据库 数据库 索引
ElasticSearch学习(一):HTTP操作ElasticSearch
为了操作方便,我直接使用了Windows下的ElasticSearch。需要注意的一点是,ElasticSearch8以上的版本是基于java17的。 我使用的是7.6.2的版本。下载好压缩包之后,解压,进入bin目录,双击elasticsearch.bat文件即可启动。
254 0
ElasticSearch学习(一):HTTP操作ElasticSearch
|
安全 Linux 网络安全
ElasticSearch学习(四)——Linux 单节点部署
ElasticSearch学习(四)——Linux 单节点部署
305 0
ElasticSearch学习(四)——Linux 单节点部署
|
缓存 Windows
ElasticSearch学习(三)——Windows集群部署
ElasticSearch学习(三)——Windows集群部署
251 0
ElasticSearch学习(三)——Windows集群部署
|
索引
ElasticSearch学习(二)——索引、文档简单操作 下
ElasticSearch学习(二)——索引、文档简单操作 下
93 0
ElasticSearch学习(二)——索引、文档简单操作 下
|
JSON 自然语言处理 关系型数据库
ElasticSearch学习(二)——索引、文档简单操作 上
ElasticSearch学习(二)——索引、文档简单操作 上
125 0
ElasticSearch学习(二)——索引、文档简单操作    上