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 *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 *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) }