in search-elasticsearch/es.go [256:297]
func (s *SearchEngine) buildQuery(cond *plugin.SearchBasicCond) (
query *elastic.BoolQuery) {
log.Debugf("build query: %+v", cond)
q := elastic.NewBoolQuery()
for _, tagGroup := range cond.TagIDs {
if len(tagGroup) > 0 {
q.Must(elastic.NewTermsQuery("tags", convertToInterfaceSlice(tagGroup)...))
}
}
if len(cond.UserID) > 0 {
q.Must(elastic.NewTermQuery("user_id", cond.UserID))
}
if len(cond.QuestionID) > 0 {
q.Must(elastic.NewTermQuery("question_id", cond.QuestionID))
}
if cond.VoteAmount > 0 {
q.Must(elastic.NewRangeQuery("score").Gte(cond.VoteAmount))
}
if cond.ViewAmount > 0 {
q.Must(elastic.NewRangeQuery("views").Gte(cond.ViewAmount))
}
if cond.AnswerAmount > 0 {
q.Must(elastic.NewRangeQuery("answers").Gte(cond.AnswerAmount))
}
if cond.AnswerAccepted == plugin.AcceptedCondTrue {
q.Must(elastic.NewTermQuery("has_accepted", true))
} else if cond.AnswerAccepted == plugin.AcceptedCondFalse {
q.MustNot(elastic.NewTermQuery("has_accepted", true))
}
if cond.QuestionAccepted == plugin.AcceptedCondTrue {
q.MustNot(elastic.NewTermQuery("has_accepted", true))
} else if cond.QuestionAccepted == plugin.AcceptedCondFalse {
q.Must(elastic.NewTermQuery("has_accepted", false))
}
if len(cond.Words) > 0 {
q.Must(elastic.NewMultiMatchQuery(strings.Join(cond.Words, " "), "title", "content"))
}
q.Must(elastic.NewTermQuery("status", plugin.SearchContentStatusAvailable))
return q
}