func()

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
}