// NewDocIDQuery creates a new Query object returning indexed documents among // the specified set. Combine it with ConjunctionQuery to restrict the scope of // other queries output. func NewDocIDQuery(ids []string) *query.DocIDQuery { return query.NewDocIDQuery(ids) }
func makeSearchQuery(queryString string, ids []string) (query.Query, error) { nodes, err := blevext.Parse(queryString) if err != nil { return nil, err } addIdsFilter := func(q query.Query) query.Query { if len(ids) == 0 { return q } return bleve.NewConjunctionQuery( query.NewDocIDQuery(ids), q, ) } var makeQuery func(*blevext.Node) (query.Query, error) makeQuery = func(n *blevext.Node) (query.Query, error) { if n == nil { return bleve.NewMatchAllQuery(), nil } switch n.Kind { case blevext.NodeAnd, blevext.NodeOr: left, err := makeQuery(n.Children[0]) if err != nil { return nil, err } right, err := makeQuery(n.Children[1]) if err != nil { return nil, err } if n.Kind == blevext.NodeOr { q := query.NewDisjunctionQuery([]query.Query{left, right}) q.Min = 1 return q, nil } return query.NewConjunctionQuery([]query.Query{left, right}), nil case blevext.NodeString, blevext.NodePhrase: fn := func(s string) query.FieldableQuery { return bleve.NewMatchQuery(s) } if n.Kind == blevext.NodePhrase { fn = func(s string) query.FieldableQuery { return blevext.NewAllMatchQuery(s) } } htmlQuery := fn(n.Value) htmlQuery.SetField("html") titleQuery := fn(n.Value) titleQuery.SetField("title") q := query.NewDisjunctionQuery([]query.Query{ addIdsFilter(htmlQuery), addIdsFilter(titleQuery), }) q.Min = 1 return q, nil } return nil, fmt.Errorf("unknown query node type: %d", n.Kind) } return makeQuery(nodes) }