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.
61 lines
1.5 KiB
61 lines
1.5 KiB
package main
|
|
|
|
import (
|
|
"context"
|
|
"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 <index> <search term(s)>\n", os.Args[0])
|
|
cmd.PrintDefaults()
|
|
}
|
|
cfgpath := cmd.String("config", "", "path to configuration")
|
|
server := cmd.String("server", "", "server name to use")
|
|
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)).
|
|
Size(*size).
|
|
From(*from).
|
|
NoStoredFields().
|
|
FetchSourceContext(
|
|
elastic.NewFetchSourceContext(true).Include("*"),
|
|
).
|
|
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 {
|
|
fmt.Fprintf(os.Stdout, "%s: %s\n", r.Id, string(r.Source))
|
|
}
|
|
fmt.Fprintf(os.Stdout, "Total: %d\n", res.Hits.TotalHits.Value)
|
|
}
|