func (q *TermQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.Field if q.Field == "" { field = m.DefaultSearchField() } return searcher.NewTermSearcher(i, q.Term, field, q.Boost.Value(), explain) }
func (q *NumericRangeQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.Field if q.Field == "" { field = m.DefaultSearchField() } return searcher.NewNumericRangeSearcher(i, q.Min, q.Max, q.InclusiveMin, q.InclusiveMax, field, q.Boost.Value(), explain) }
func (q *RegexpQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.Field if q.Field == "" { field = m.DefaultSearchField() } err := q.compile() if err != nil { return nil, err } return searcher.NewRegexpSearcher(i, q.compiled, field, q.Boost.Value(), explain) }
func (q *DateRangeQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { min, max, err := q.parseEndpoints() if err != nil { return nil, err } field := q.Field if q.Field == "" { field = m.DefaultSearchField() } return searcher.NewNumericRangeSearcher(i, min, max, q.InclusiveStart, q.InclusiveEnd, field, q.Boost.Value(), explain) }
func (q *WildcardQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.Field if q.Field == "" { field = m.DefaultSearchField() } if q.compiled == nil { var err error q.compiled, err = q.convertToRegexp() if err != nil { return nil, err } } return searcher.NewRegexpSearcher(i, q.compiled, field, q.Boost.Value(), explain) }
func (q *allMatchQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.FieldVal if q.FieldVal == "" { field = m.DefaultSearchField() } analyzerName := m.AnalyzerNameForPath(field) analyzer := m.AnalyzerNamed(analyzerName) tokens := analyzer.Analyze([]byte(q.Match)) if len(tokens) == 0 { noneQuery := bleve.NewMatchNoneQuery() return noneQuery.Searcher(i, m, explain) } tqs := make([]query.Query, len(tokens)) for i, token := range tokens { tq := bleve.NewTermQuery(string(token.Term)) tq.SetField(field) tq.SetBoost(q.BoostVal) tqs[i] = tq } allQuery := bleve.NewConjunctionQuery(tqs...) allQuery.SetBoost(q.BoostVal) return allQuery.Searcher(i, m, explain) }
func (q *MatchPhraseQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.Field if q.Field == "" { field = m.DefaultSearchField() } analyzerName := "" if q.Analyzer != "" { analyzerName = q.Analyzer } else { analyzerName = m.AnalyzerNameForPath(field) } analyzer := m.AnalyzerNamed(analyzerName) if analyzer == nil { return nil, fmt.Errorf("no analyzer named '%s' registered", q.Analyzer) } tokens := analyzer.Analyze([]byte(q.MatchPhrase)) if len(tokens) > 0 { phrase := tokenStreamToPhrase(tokens) phraseQuery := NewPhraseQuery(phrase, field) phraseQuery.SetBoost(q.Boost.Value()) return phraseQuery.Searcher(i, m, explain) } noneQuery := NewMatchNoneQuery() return noneQuery.Searcher(i, m, explain) }
func (q *MatchQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, explain bool) (search.Searcher, error) { field := q.Field if q.Field == "" { field = m.DefaultSearchField() } analyzerName := "" if q.Analyzer != "" { analyzerName = q.Analyzer } else { analyzerName = m.AnalyzerNameForPath(field) } analyzer := m.AnalyzerNamed(analyzerName) if analyzer == nil { return nil, fmt.Errorf("no analyzer named '%s' registered", q.Analyzer) } tokens := analyzer.Analyze([]byte(q.Match)) if len(tokens) > 0 { tqs := make([]Query, len(tokens)) if q.Fuzziness != 0 { for i, token := range tokens { query := NewFuzzyQuery(string(token.Term)) query.SetFuzziness(q.Fuzziness) query.SetPrefix(q.Prefix) query.SetField(field) query.SetBoost(q.Boost.Value()) tqs[i] = query } } else { for i, token := range tokens { tq := NewTermQuery(string(token.Term)) tq.SetField(field) tq.SetBoost(q.Boost.Value()) tqs[i] = tq } } switch q.Operator { case MatchQueryOperatorOr: shouldQuery := NewDisjunctionQuery(tqs) shouldQuery.SetMin(1) shouldQuery.SetBoost(q.Boost.Value()) return shouldQuery.Searcher(i, m, explain) case MatchQueryOperatorAnd: mustQuery := NewConjunctionQuery(tqs) mustQuery.SetBoost(q.Boost.Value()) return mustQuery.Searcher(i, m, explain) default: return nil, fmt.Errorf("unhandled operator %d", q.Operator) } } noneQuery := NewMatchNoneQuery() return noneQuery.Searcher(i, m, explain) }
func newIndexUsing(path string, mapping mapping.IndexMapping, indexType string, kvstore string, kvconfig map[string]interface{}) (*indexImpl, error) { // first validate the mapping err := mapping.Validate() if err != nil { return nil, err } if kvconfig == nil { kvconfig = map[string]interface{}{} } if kvstore == "" { return nil, fmt.Errorf("bleve not configured for file based indexing") } rv := indexImpl{ path: path, name: path, m: mapping, meta: newIndexMeta(indexType, kvstore, kvconfig), } rv.stats = &IndexStat{i: &rv} // at this point there is hope that we can be successful, so save index meta if path != "" { err = rv.meta.Save(path) if err != nil { return nil, err } kvconfig["create_if_missing"] = true kvconfig["error_if_exists"] = true kvconfig["path"] = indexStorePath(path) } else { kvconfig["path"] = "" } // open the index indexTypeConstructor := registry.IndexTypeConstructorByName(rv.meta.IndexType) if indexTypeConstructor == nil { return nil, ErrorUnknownIndexType } rv.i, err = indexTypeConstructor(rv.meta.Storage, kvconfig, Config.analysisQueue) if err != nil { return nil, err } err = rv.i.Open() if err != nil { if err == index.ErrorUnknownStorageType { return nil, ErrorUnknownStorageType } return nil, err } // now persist the mapping mappingBytes, err := json.Marshal(mapping) if err != nil { return nil, err } err = rv.i.SetInternal(mappingInternalKey, mappingBytes) if err != nil { return nil, err } // mark the index as open rv.mutex.Lock() defer rv.mutex.Unlock() rv.open = true indexStats.Register(&rv) return &rv, nil }