public async Task OrFullTextAndMatchSearchTest() { MultiSearchModel searchModel = new MultiSearchModel(); searchModel.QueryType = QueryType.Or; SearchModels = new List <SearchModel> { new() { Type = SearchType.Fulltext, Key = "Text", Term = "parent" }, new () { Type = SearchType.Match, Key = "Name", Term = "Yandex" } }; searchModel.Searches = SearchModels.ToArray(); var result = await SearcherService.MultiSearch(IndexModel, searchModel); Assert.AreEqual(2, result.Count); } }
public async Task <List <DocumentModel> > MultiSearch(IndexModel indexModel, MultiSearchModel searchModel) { var results = new List <List <DocumentModel> >(); foreach (var search in searchModel.Searches) { SetSearcher(search.Type); results.Add(await _searcher.ExecuteSearch(indexModel, search)); } List <DocumentModel> searchResult; switch (searchModel.QueryType) { case QueryType.Or: searchResult = CollectionsHelper.Union(new DocumentComparer(), results.ToArray()).ToList(); break; case QueryType.And: searchResult = CollectionsHelper.Intersect(new DocumentComparer(), results.ToArray()).ToList(); break; default: throw new ArgumentOutOfRangeException(); } return(GetSorted(searchModel, searchResult)); }
public async Task <IActionResult> MultiSearch([FromBody] MultiSearchModel searchModel, string dbname, string index) { if (await UserService.CheckAuthorize(Request, false, dbname) is null) { return(Unauthorized(ErrorDto.GetAuthError())); } try { var docs = await _searcher.MultiSearch(new IndexModel(dbname, index), searchModel); var result = docs.Select(DocumentMapper.MapToDto); return(Ok(result)); } catch (Exception ex) { _logger.Log(LogLevel.Error, $"ERROR: Search {searchModel.QueryType} in {dbname}/{index}, Error: {ex}"); return(BadRequest(new ErrorDto(ErrorsType.SystemError, ex.Message))); } }