package main import ( "encoding/json" "fmt" "os" "path/filepath" "syscall" "unsafe" ) // EsDLL Elasticsearch工具DLL结构 type esDLL struct { dll *syscall.DLL listAllIndices *syscall.Proc // 查询所有索引 getIndicesInfo *syscall.Proc // 获取所有索引的详细信息 getIndexDetail *syscall.Proc // 获取单个索引的详细信息 createIndex *syscall.Proc // 创建索引 deleteIndex *syscall.Proc // 删除索引 getDocumentCount *syscall.Proc // 获取索引文档数量 createDocument *syscall.Proc // 创建文档 getDocument *syscall.Proc // 根据ID获取文档 updateDocument *syscall.Proc // 更新文档 deleteDocument *syscall.Proc // 删除文档 searchDocuments *syscall.Proc // 搜索文档 freeCString *syscall.Proc // 释放C字符串 } // 初始化esDLL func InitEsDLL() (*esDLL, error) { dllPath := filepath.Join("es", "dll", "es.dll") if _, err := os.Stat(dllPath); os.IsNotExist(err) { return nil, fmt.Errorf("es DLL 不存在: %s", dllPath) } if dll, err := syscall.LoadDLL(dllPath); err != nil { return nil, fmt.Errorf("加载es DLL 失败: %s", err) } else { return &esDLL{ dll: dll, listAllIndices: dll.MustFindProc("ListAllIndices"), getIndicesInfo: dll.MustFindProc("GetIndicesInfo"), getIndexDetail: dll.MustFindProc("GetIndexDetail"), createIndex: dll.MustFindProc("CreateIndex"), deleteIndex: dll.MustFindProc("DeleteIndex"), getDocumentCount: dll.MustFindProc("GetDocumentCount"), createDocument: dll.MustFindProc("CreateDocument"), getDocument: dll.MustFindProc("GetDocument"), updateDocument: dll.MustFindProc("UpdateDocument"), deleteDocument: dll.MustFindProc("DeleteDocument"), searchDocuments: dll.MustFindProc("SearchDocuments"), freeCString: dll.MustFindProc("FreeCString"), }, nil } } // cStr 获取C字符串 func (m *esDLL) cStr(p uintptr) string { if p == 0 { return "" } b := []byte{} for i := uintptr(0); ; i++ { c := *(*byte)(unsafe.Pointer(p + i)) if c == 0 { break } b = append(b, c) } s := string(b) if m.freeCString != nil { m.freeCString.Call(p) } return s } // 查询所有索引 func (m *esDLL) ListAllIndices() (string, error) { proc, err := m.dll.FindProc("ListAllIndices") if err != nil { return "", fmt.Errorf("找不到函数 ListAllIndices: %v", err) } resultPtr, _, _ := proc.Call() result := m.cStr(resultPtr) return result, nil } func (m *esDLL) CreateDocument(indexName string, id string, doc interface{}) (string, error) { proc, err := m.dll.FindProc("CreateDocument") if err != nil { return "", fmt.Errorf("找不到函数 CreateDocument: %v", err) } docJson, err := json.Marshal(doc) if err != nil { return "", err } indexNamePtr, _ := syscall.BytePtrFromString(indexName) idPtr, _ := syscall.BytePtrFromString(id) docJsonPtr, _ := syscall.BytePtrFromString(string(docJson)) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(indexNamePtr)), uintptr(unsafe.Pointer(idPtr)), uintptr(unsafe.Pointer(docJsonPtr)), ) result := m.cStr(resultPtr) return result, nil } //func main() { // dll, err := InitEsDLL() // if err != nil { // fmt.Println(err) // } // //indices, err := dll.ListAllIndices() // //if err != nil { // // fmt.Println(err) // //} // //fmt.Println(string(indices)) // // doc := Document{ // ID: "10003", // Title: "测试文档3", // Content: "这是一个测试文档3", // Author: "测试员3", // CreatedAt: time.Now(), // Tags: []string{"测试3", "文档3"}, // } // document, err := dll.CreateDocument("test-cc", doc.ID, doc) // if err != nil { // fmt.Println(err) // } // fmt.Println(document) //}