(cond *plugin.SearchBasicCond)
| 241 | } |
| 242 | |
| 243 | func (s *SearchEngine) buildQuery(cond *plugin.SearchBasicCond) ( |
| 244 | query *elastic.BoolQuery) { |
| 245 | |
| 246 | log.Debugf("build query: %+v", cond) |
| 247 | |
| 248 | q := elastic.NewBoolQuery() |
| 249 | if len(cond.TagIDs) > 0 { |
| 250 | q.Must(elastic.NewTermsQuery("tags", convertToInterfaceSlice(cond.TagIDs)...)) |
| 251 | } |
| 252 | if len(cond.UserID) > 0 { |
| 253 | q.Must(elastic.NewTermQuery("user_id", cond.UserID)) |
| 254 | } |
| 255 | if len(cond.QuestionID) > 0 { |
| 256 | q.Must(elastic.NewTermQuery("question_id", cond.QuestionID)) |
| 257 | } |
| 258 | if cond.VoteAmount > 0 { |
| 259 | q.Must(elastic.NewRangeQuery("score").Gte(cond.VoteAmount)) |
| 260 | } |
| 261 | if cond.ViewAmount > 0 { |
| 262 | q.Must(elastic.NewRangeQuery("views").Gte(cond.ViewAmount)) |
| 263 | } |
| 264 | if cond.AnswerAmount > 0 { |
| 265 | q.Must(elastic.NewRangeQuery("answers").Gte(cond.AnswerAmount)) |
| 266 | } |
| 267 | if cond.AnswerAccepted == plugin.AcceptedCondTrue { |
| 268 | q.Must(elastic.NewTermQuery("has_accepted", true)) |
| 269 | } else if cond.AnswerAccepted == plugin.AcceptedCondFalse { |
| 270 | q.MustNot(elastic.NewTermQuery("has_accepted", true)) |
| 271 | } |
| 272 | if cond.QuestionAccepted == plugin.AcceptedCondTrue { |
| 273 | q.MustNot(elastic.NewTermQuery("has_accepted", true)) |
| 274 | } else if cond.QuestionAccepted == plugin.AcceptedCondFalse { |
| 275 | q.Must(elastic.NewTermQuery("has_accepted", false)) |
| 276 | } |
| 277 | if len(cond.Words) > 0 { |
| 278 | q.Must(elastic.NewMultiMatchQuery(strings.Join(cond.Words, " "), "title", "content")) |
| 279 | } |
| 280 | q.Must(elastic.NewTermQuery("status", plugin.SearchContentStatusAvailable)) |
| 281 | return q |
| 282 | } |
| 283 | |
| 284 | func convertToInterfaceSlice(slice []string) []interface{} { |
| 285 | s := make([]interface{}, len(slice)) |
no test coverage detected