in search-algolia/algolia.go [132:194]
func (s *SearchAlgolia) SearchQuestions(ctx context.Context, cond *plugin.SearchBasicCond) (res []plugin.SearchResult, total int64, err error) {
var (
filters = "status<10 AND type:question"
tagFilters []string
userIDFilter string
viewsFilter string
answersFilter string
)
if len(cond.TagIDs) > 0 {
for _, tagGroup := range cond.TagIDs {
var tagsIn []string
if len(tagGroup) > 0 {
for _, tagID := range tagGroup {
tagsIn = append(tagsIn, "tags:"+tagID)
}
}
tagFilters = append(tagFilters, "("+strings.Join(tagsIn, " OR ")+")")
}
if len(tagFilters) > 0 {
filters += " AND " + strings.Join(tagFilters, " AND ")
}
}
if cond.QuestionAccepted == plugin.AcceptedCondFalse {
userIDFilter = "hasAccepted:false"
filters += " AND " + userIDFilter
}
if cond.ViewAmount > -1 {
viewsFilter = "views>=" + strconv.Itoa(cond.ViewAmount)
filters += " AND " + viewsFilter
}
// check answers
if cond.AnswerAmount == 0 {
answersFilter = "answers=0"
filters += " AND " + answersFilter
} else if cond.AnswerAmount > 0 {
answersFilter = "answers>=" + strconv.Itoa(cond.AnswerAmount)
filters += " AND " + answersFilter
}
var (
query = strings.TrimSpace(strings.Join(cond.Words, " "))
opts = []interface{}{
opt.AttributesToRetrieve("objectID", "type"),
opt.Filters(filters),
opt.Page(cond.Page - 1),
opt.HitsPerPage(cond.PageSize),
}
qres search.QueryRes
)
qres, err = s.getIndex(string(cond.Order)).Search(query, opts...)
for _, hit := range qres.Hits {
res = append(res, plugin.SearchResult{
ID: hit["objectID"].(string),
Type: hit["type"].(string),
})
}
total = int64(qres.NbHits)
return res, total, err
}