package main import ( "context" "encoding/json" "flag" "fmt" "os" elastic "github.com/olivere/elastic/v7" ) func handleSearchCommand() { cmd := flag.NewFlagSet("search", flag.ExitOnError) cmd.SetOutput(os.Stdout) cmd.Usage = func() { fmt.Printf("Usage: %s search \n", os.Args[0]) cmd.PrintDefaults() } cfgpath := cmd.String("config", "", "path to configuration") server := cmd.String("server", "", "server name to use") fields := cmd.String("fields", "*", "fields to include in search") size := cmd.Int("size", 10, "maximum number of results returned") from := cmd.Int("from", 0, "count to start search results from") defop := cmd.String("defop", "AND", "default search operator") cmd.Parse(os.Args[2:]) if *defop != "AND" && *defop != "OR" { fmt.Fprintf(os.Stderr, "default operator must be AND or OR\n") cmd.Usage() os.Exit(1) } if len(cmd.Args()) < 2 { fmt.Fprintf(os.Stderr, "index name and query required for search\n") cmd.Usage() os.Exit(1) } cfg := LoadConfig(*cfgpath) es := cfg.GetClient(*server) res, err := es.Search(). Index(cmd.Arg(0)). StoredField(*fields). Size(*size). From(*from). Query(elastic.NewQueryStringQuery(cmd.Arg(1)).DefaultOperator(*defop)). Do(context.Background()) if err != nil { fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error()) os.Exit(1) } for _, r := range res.Hits.Hits { b, err := json.Marshal(r.Fields) if err != nil { fmt.Fprintf(os.Stderr, "marshal error: %s\n", err.Error()) os.Exit(1) } fmt.Fprintf(os.Stdout, "%s: %s\n", r.Id, string(b)) } fmt.Fprintf(os.Stdout, "Total: %d\n", res.Hits.TotalHits.Value) }