a command line interface for elastic (work in progress)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.6 KiB

  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "os"
  8. elastic "github.com/olivere/elastic/v7"
  9. )
  10. func handleSearchCommand() {
  11. cmd := flag.NewFlagSet("search", flag.ExitOnError)
  12. cmd.SetOutput(os.Stdout)
  13. cmd.Usage = func() {
  14. fmt.Printf("Usage: %s search <index> <search term(s)>\n", os.Args[0])
  15. cmd.PrintDefaults()
  16. }
  17. cfgpath := cmd.String("config", "", "path to configuration")
  18. server := cmd.String("server", "", "server name to use")
  19. fields := cmd.String("fields", "*", "fields to include in search")
  20. size := cmd.Int("size", 10, "maximum number of results returned")
  21. from := cmd.Int("from", 0, "count to start search results from")
  22. defop := cmd.String("defop", "AND", "default search operator")
  23. cmd.Parse(os.Args[2:])
  24. if *defop != "AND" && *defop != "OR" {
  25. fmt.Fprintf(os.Stderr, "default operator must be AND or OR\n")
  26. cmd.Usage()
  27. os.Exit(1)
  28. }
  29. if len(cmd.Args()) < 2 {
  30. fmt.Fprintf(os.Stderr, "index name and query required for search\n")
  31. cmd.Usage()
  32. os.Exit(1)
  33. }
  34. cfg := LoadConfig(*cfgpath)
  35. es := cfg.GetClient(*server)
  36. res, err := es.Search().
  37. Index(cmd.Arg(0)).
  38. StoredField(*fields).
  39. Size(*size).
  40. From(*from).
  41. Query(elastic.NewQueryStringQuery(cmd.Arg(1)).DefaultOperator(*defop)).
  42. Do(context.Background())
  43. if err != nil {
  44. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  45. os.Exit(1)
  46. }
  47. for _, r := range res.Hits.Hits {
  48. b, err := json.Marshal(r.Fields)
  49. if err != nil {
  50. fmt.Fprintf(os.Stderr, "marshal error: %s\n", err.Error())
  51. os.Exit(1)
  52. }
  53. fmt.Fprintf(os.Stdout, "%s: %s\n", r.Id, string(b))
  54. }
  55. fmt.Fprintf(os.Stdout, "Total: %d\n", res.Hits.TotalHits.Value)
  56. }