public virtual SearchResult <T> Search(MemberSearchQuery query) { var shouldDescriptor = new QueryContainerDescriptor <SearchableMember>() .Bool(b => b.Should(_memberSearchDescriptorBuilder.GetMemberDescriptors(query.Text))); QueryContainer allDescriptors = null; if (!query.GroupId.HasValue) { allDescriptors = new QueryContainerDescriptor <T>() .Bool(b => b .Must(shouldDescriptor)); } else { if (query.MembersOfGroup) { allDescriptors = new QueryContainerDescriptor <T>() .Bool(b => b .Must(shouldDescriptor, _memberSearchDescriptorBuilder.GetMemberInGroupDescriptor(query.GroupId))); } } var searchRequest = GetSearchDescriptor() .Query(q => q.Bool(b => b .Should(allDescriptors) .MinimumShouldMatch(MinimumShouldMatch.Fixed(MinimumShouldMatches)))); if (query.GroupId.HasValue && !query.MembersOfGroup) { searchRequest = GetSearchDescriptor() .Query(q => q.Bool(b => b .Should(_memberSearchDescriptorBuilder.GetMemberDescriptors(query.Text)) .MinimumShouldMatch(MinimumShouldMatch.Fixed(MinimumShouldMatches)))) .PostFilter(pf => pf .Bool(b => b .MustNot(_memberSearchDescriptorBuilder.GetMemberInGroupDescriptor(query.GroupId)))); } SortByMemberGroupRights(searchRequest, query); _searchPagingHelper.Apply(searchRequest, query); var queryResult = _elasticSearchRepository.SearchByIndex(searchRequest); var searchResult = ParseResults(queryResult); return(searchResult); }
protected virtual QueryContainer GetDefaultMemberQueryContainer(MemberSearchQuery query) { return(new QueryContainerDescriptor <T>() .Bool(b => b.Should(_memberSearchDescriptorBuilder.GetMemberDescriptors(query.Text)))); }
protected virtual void SortByMemberGroupRights(SearchDescriptor <T> searchDescriptor, MemberSearchQuery query) { _searchSortingHelper.Apply(searchDescriptor, query); if (query.GroupId.HasValue) { searchDescriptor.Sort(s => s .Field(f => f .Field(ff => ff.Groups.First().IsAdmin) .NestedPath(np => np.Groups) .NestedFilter(nf => nf.Term(t => t.Field(ff => ff.Groups.First().GroupId).Value(query.GroupId))) .Descending() )); } }