示例#1
0
        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)));
            }
        }