Exemplo n.º 1
0
        public PageSearchResultContract SearchPageByCriteria(long snapshotId, SearchPageRequestContract searchRequest)
        {
            var pageIdList = GetPageIds(snapshotId);

            var client = m_communicationProvider.GetElasticClient();

            var queriesBuilder = m_queriesBuilderFactory.Create(IndexType.Page);
            var filterQuery    = queriesBuilder.GetFilterByIdSearchQuery(pageIdList);
            var mustQuery      = queriesBuilder.GetSearchQuery(searchRequest.ConditionConjunction, PageTextField);

            var pageResponse = client.Search <TextResourceContract>(s => s
                                                                    .Index(PageIndex)
                                                                    .Type(PageType)
                                                                    .Source(sf => sf.Excludes(i => i.Field(f => f.PageText)))
                                                                    .Query(q => q
                                                                           .Bool(b => b
                                                                                 .Filter(filterQuery)
                                                                                 .Must(mustQuery)
                                                                                 )
                                                                           )
                                                                    .Size(DefaultSize) //WORKAROUND we need all pages which have any hits, so specify big enough number
                                                                    );

            return(m_searchResultProcessor.ProcessSearchPageResult(pageResponse));
        }
Exemplo n.º 2
0
        public ActionResult GetHeadwordDescriptionFromSearch(string criteria, bool isCriteriaJson, long headwordId)
        {
            List <SearchCriteriaContract> listSearchCriteriaContracts;

            if (isCriteriaJson)
            {
                listSearchCriteriaContracts = DeserializeJsonSearchCriteria(criteria);
            }
            else
            {
                listSearchCriteriaContracts = new List <SearchCriteriaContract>
                {
                    CreateWordListContract(CriteriaKey.HeadwordDescription, criteria)
                };
            }

            var client  = GetBookClient();
            var request = new SearchPageRequestContract
            {
                ConditionConjunction = listSearchCriteriaContracts
            };
            var result = client.GetHeadwordTextFromSearch(headwordId, TextFormatEnumContract.Html, request);

            return(Json(result));
        }
Exemplo n.º 3
0
        public long SearchHitsResultCount(long snapshotId, SearchPageRequestContract searchRequest)
        {
            var pageIdList = GetPageIds(snapshotId);

            var client = m_communicationProvider.GetElasticClient();

            var queriesBuilder = m_queriesBuilderFactory.Create(IndexType.Page);
            var filterQuery    = queriesBuilder.GetFilterByIdSearchQuery(pageIdList);
            var mustQuery      = queriesBuilder.GetSearchQuery(searchRequest.ConditionConjunction, PageTextField);

            var pageResponse = client.Search <TextResourceContract>(s => s
                                                                    .Index(PageIndex)
                                                                    .Type(PageType)
                                                                    .Source(sf => sf.Excludes(i => i.Field(f => f.PageText)))
                                                                    .Query(q => q
                                                                           .Bool(b => b
                                                                                 .Filter(filterQuery)
                                                                                 .Must(mustQuery)
                                                                                 )
                                                                           )
                                                                    .Highlight(h => h
                                                                               .PreTags(HighlightTag)
                                                                               .PostTags(HighlightTag)
                                                                               .Fields(f => f
                                                                                       .Field(PageTextField)
                                                                                       .NumberOfFragments(FragmentsCount)
                                                                                       .FragmentSize(FragmentSize)
                                                                                       .Type(HighlighterType)
                                                                                       )
                                                                               )
                                                                    .Size(DefaultSize) //WORKAROUND we need get all hits to sum total hit count, so specify big enough number
                                                                    );

            return(m_searchResultProcessor.ProcessSearchPageResultCount(pageResponse, HighlightTag));
        }
Exemplo n.º 4
0
        public TextResourceContract SearchOnPageByCriteria(string textResourceId, SearchPageRequestContract searchRequest)
        {
            var queriesBuilder = m_queriesBuilderFactory.Create(IndexType.Page);
            var filterQuery    = queriesBuilder.GetFilterByIdSearchQuery(textResourceId);
            var mustQuery      = queriesBuilder.GetSearchQuery(searchRequest.ConditionConjunction, PageTextField);

            var client = m_communicationProvider.GetElasticClient();

            var response = client.Search <TextResourceContract>(s => s
                                                                .Index(PageIndex)
                                                                .Type(PageType)
                                                                .Source(sf => sf.Excludes(e => e.Field(f => f.PageText)))
                                                                .Query(q => q
                                                                       .Bool(b => b
                                                                             .Filter(filterQuery)
                                                                             .Must(mustQuery)
                                                                             )
                                                                       )
                                                                .Highlight(h => h
                                                                           .PreTags(OpeningEmphTag)
                                                                           .PostTags(ClosingEmphTag)
                                                                           .Fields(f => f
                                                                                   .Field(PageTextField)
                                                                                   .NumberOfFragments(0)
                                                                                   .Type(HighlighterType)
                                                                                   )
                                                                           )
                                                                );

            return(m_searchResultProcessor.ProcessSearchPageByCriteria(response));
        }
Exemplo n.º 5
0
        public string GetPageTextFromSearch(TextResource textResource, TextFormatEnumContract format,
                                            SearchPageRequestContract searchRequest)
        {
            var fulltextServiceClient = m_communicationProvider.GetFulltextServiceClient();
            var result = fulltextServiceClient.GetTextResourceFromSearch(textResource.ExternalId, format, searchRequest);

            return(result.PageText);
        }
Exemplo n.º 6
0
        public ActionResult <long> SearchHitsResultCount(long snapshotId, [FromBody] SearchPageRequestContract criteria)
        {
            if (ContainsAnyUnsupportedCriteria(criteria))
            {
                return(BadRequest("Request contains unsupported criteria"));
            }

            var result = m_searchManager.SearchHitsResultCount(snapshotId, criteria);

            return(result);
        }
Exemplo n.º 7
0
        public string GetHeadwordTextFromSearch(HeadwordResource headwordResource, TextFormatEnumContract format,
                                                SearchPageRequestContract searchRequest)
        {
            var transformation = GetTransformationOrDefault(format, BookTypeEnum.Dictionary);

            using (var ssc = m_communicationProvider.GetSearchServiceClient())
            {
                var project     = headwordResource.Resource.Project;
                var bookVersion = headwordResource.BookVersion;
                var result      = ssc.GetDictionaryEntryFromSearch(searchRequest.ConditionConjunction, project.ExternalId, bookVersion.ExternalId, headwordResource.ExternalId, transformation.Name, transformation.OutputFormat, transformation.ResourceLevel);
                return(result);
            }
        }
Exemplo n.º 8
0
        public ActionResult TextSearchInBookPagesWithMatchHit(string text, long projectId, long?snapshotId)
        {
            var listSearchCriteriaContracts = CreateTextCriteriaList(CriteriaKey.Fulltext, text);

            var client  = GetBookClient();
            var request = new SearchPageRequestContract
            {
                ConditionConjunction = listSearchCriteriaContracts
            };
            var result = client.SearchPage(projectId, request);

            return(Json(new { pages = result }));
        }
Exemplo n.º 9
0
        public ActionResult AdvancedSearchInBookPagesWithMatchHit(string json, long projectId, long?snapshotId)
        {
            var deserialized = JsonConvert.DeserializeObject <IList <ConditionCriteriaDescriptionBase> >(json, new ConditionCriteriaDescriptionConverter());
            var listSearchCriteriaContracts = Mapper.Map <List <SearchCriteriaContract> >(deserialized);

            var client  = GetBookClient();
            var request = new SearchPageRequestContract
            {
                ConditionConjunction = listSearchCriteriaContracts
            };
            var result = client.SearchPage(projectId, request);

            return(Json(new { pages = result }));
        }
Exemplo n.º 10
0
 public IActionResult SearchPage(long projectId, [FromBody] SearchPageRequestContract request)
 {
     try
     {
         var result = m_bookHitSearchManager.SearchPage(projectId, request);
         return(Ok(result));
     }
     catch (ArgumentException exception)
     {
         return(BadRequest(exception.Message));
     }
     catch (HttpErrorCodeException exception)
     {
         return(StatusCode((int)exception.StatusCode, exception.Message));
     }
 }
Exemplo n.º 11
0
        public List <PageContract> SearchPage(long projectId, SearchPageRequestContract request)
        {
            try
            {
                var result = m_client.Post <List <PageContract> >($"book/{projectId}/page/search", request);
                return(result);
            }
            catch (HttpRequestException e)
            {
                if (m_logger.IsErrorEnabled())
                {
                    m_logger.LogError("{0} failed with {1}", m_client.GetCurrentMethod(), e);
                }

                throw;
            }
        }
Exemplo n.º 12
0
        public string GetHeadwordTextFromSearch(long headwordId, TextFormatEnumContract format,
                                                SearchPageRequestContract request)
        {
            try
            {
                var result = m_client.PostReturnString($"book/headword/{headwordId}/text/search?format={format}", request);
                return(result);
            }
            catch (HttpRequestException e)
            {
                if (m_logger.IsErrorEnabled())
                {
                    m_logger.LogError("{0} failed with {1}", m_client.GetCurrentMethod(), e);
                }

                throw;
            }
        }
Exemplo n.º 13
0
        public IActionResult GetHeadwordTextFromSearch(long headwordId, [FromQuery] TextFormatEnumContract?format,
                                                       [FromBody] SearchPageRequestContract request)
        {
            try
            {
                var formatValue = format ?? TextFormatEnumContract.Html;
                var result      = m_bookManager.GetHeadwordText(headwordId, formatValue, request);
                if (result == null)
                {
                    return(NotFound());
                }

                return(Content(result));
            }
            catch (ArgumentException exception)
            {
                return(BadRequest(exception.Message));
            }
            catch (HttpErrorCodeException exception)
            {
                return(StatusCode((int)exception.StatusCode, exception.Message));
            }
        }
Exemplo n.º 14
0
        public ActionResult GetBookSearchPageByXmlId(string query, bool isQueryJson, long?snapshotId, long pageId)
        {
            List <SearchCriteriaContract> listSearchCriteriaContracts;

            if (isQueryJson)
            {
                var deserialized = JsonConvert.DeserializeObject <IList <ConditionCriteriaDescriptionBase> >(query,
                                                                                                             new ConditionCriteriaDescriptionConverter());
                listSearchCriteriaContracts = Mapper.Map <List <SearchCriteriaContract> >(deserialized);
            }
            else
            {
                listSearchCriteriaContracts = CreateQueryCriteriaContract(CriteriaKey.Fulltext, query);
            }

            var request = new SearchPageRequestContract
            {
                ConditionConjunction = listSearchCriteriaContracts
            };
            var client = GetBookClient();
            var text   = client.GetPageTextFromSearch(pageId, TextFormatEnumContract.Html, request);

            return(Json(new { pageText = text }, GetJsonSerializerSettings()));
        }
Exemplo n.º 15
0
 public string GetHeadwordTextFromSearch(HeadwordResource headwordResource, TextFormatEnumContract format,
                                         SearchPageRequestContract searchRequest)
 {
     throw new NotSupportedException("Headwords/dictionaries are not supported in ElasticSearch storage.");
 }
Exemplo n.º 16
0
        public ActionResult <TextResourceContract> GetSearchTextResource(string textResourceId, [FromQuery] TextFormatEnumContract formatValue, [FromBody] SearchPageRequestContract searchPageRequestContract)
        {
            if (ContainsAnyUnsupportedCriteria(searchPageRequestContract))
            {
                return(BadRequest("Request contains unsupported criteria"));
            }

            var textResource = m_searchManager.SearchOnPageByCriteria(textResourceId, searchPageRequestContract);

            textResource.PageText = m_textConverter.Convert(textResource.PageText, formatValue);
            textResource.PageText = m_pageWithHtmlTagsCreator.CreatePage(textResource.PageText, formatValue);

            return(textResource);
        }
Exemplo n.º 17
0
        public string GetHeadwordText(long headwordId, TextFormatEnumContract format, SearchPageRequestContract request = null)
        {
            m_authorizationManager.AuthorizeResource(headwordId);

            var headwordResource = m_bookRepository.InvokeUnitOfWork(x => x.GetHeadwordResource(headwordId, false));

            if (headwordResource == null)
            {
                return(null);
            }

            var fulltextStorage = m_fulltextStorageProvider.GetFulltextStorage(headwordResource.Resource.Project.ProjectType);

            var result = request == null
                ? fulltextStorage.GetHeadwordText(headwordResource, format)
                : fulltextStorage.GetHeadwordTextFromSearch(headwordResource, format, request);

            return(result);
        }
Exemplo n.º 18
0
        public string GetPageText(long resourcePageId, TextFormatEnumContract format, SearchPageRequestContract searchRequest = null)
        {
            m_authorizationManager.AuthorizeResource(resourcePageId);

            var textResourceList = m_bookRepository.InvokeUnitOfWork(x => x.GetPageText(resourcePageId));
            var textResource     = textResourceList.FirstOrDefault();

            if (textResource == null)
            {
                return(null);
            }

            var fulltextStorage = m_fulltextStorageProvider.GetFulltextStorage(textResource.Resource.Project.ProjectType);

            var result = searchRequest == null
                ? fulltextStorage.GetPageText(textResource, format)
                : fulltextStorage.GetPageTextFromSearch(textResource, format, searchRequest);

            return(result);
        }
Exemplo n.º 19
0
        public TextResourceContract GetTextResourceFromSearch(string resourceId, TextFormatEnumContract format, SearchPageRequestContract searchRequest)
        {
            try
            {
                var result = m_client.Post <TextResourceContract>($"text/{resourceId}/search?formatValue={format}", searchRequest);
                return(result);
            }
            catch (HttpRequestException e)
            {
                if (m_logger.IsErrorEnabled())
                {
                    m_logger.LogError("{0} failed with {1}", m_client.GetCurrentMethod(), e);
                }

                throw;
            }
        }
Exemplo n.º 20
0
 protected bool ContainsAnyUnsupportedCriteria(SearchPageRequestContract request)
 {
     return(ContainsAnyUnsupportedCriteria(request.ConditionConjunction));
 }
Exemplo n.º 21
0
        public List <PageContract> SearchPage(long projectId, SearchPageRequestContract request)
        {
            m_authorizationManager.AuthorizeBook(projectId, PermissionFlag.ShowPublished);

            var termConditions     = new List <SearchCriteriaContract>();
            var fulltextConditions = new List <SearchCriteriaContract>();

            foreach (var searchCriteriaContract in request.ConditionConjunction)
            {
                if (searchCriteriaContract.Key == CriteriaKey.Term)
                {
                    termConditions.Add(searchCriteriaContract);
                }
                else if (m_supportedSearchPageCriteria.Contains(searchCriteriaContract.Key))
                {
                    fulltextConditions.Add(searchCriteriaContract);
                }
                else
                {
                    throw new MainServiceException(MainServiceErrorCode.NotSupportedCriteriaKey,
                                                   $"Not supported criteria key: {searchCriteriaContract.Key}",
                                                   HttpStatusCode.BadRequest,
                                                   new object[] { searchCriteriaContract.Key }
                                                   );
                }
            }

            IList <PageResource> pagesByMetadata = null;

            if (termConditions.Count > 0)
            {
                var termConditionCreator = new TermCriteriaPageConditionCreator();
                termConditionCreator.AddCriteria(termConditions);
                termConditionCreator.SetProjectIds(new[] { projectId });

                pagesByMetadata = m_bookRepository.InvokeUnitOfWork(x => x.GetPagesWithTerms(termConditionCreator));
            }

            IList <PageResource> pagesByFulltext = null;

            if (fulltextConditions.Count > 0)
            {
                var projectIdentification = m_bookRepository.InvokeUnitOfWork(x => x.GetProjectIdentification(projectId));

                var fulltextStorage = m_fulltextStorageProvider.GetFulltextStorage(projectIdentification.ProjectType);
                var fulltextResult  = fulltextStorage.SearchPageByCriteria(fulltextConditions, projectIdentification);

                switch (fulltextResult.SearchResultType)
                {
                case PageSearchResultType.TextId:
                    pagesByFulltext = m_bookRepository.InvokeUnitOfWork(x => x.GetPagesByTextVersionId(fulltextResult.LongList));
                    break;

                case PageSearchResultType.TextExternalId:
                    pagesByFulltext = m_bookRepository.InvokeUnitOfWork(x => x.GetPagesByTextExternalId(fulltextResult.StringList, projectId));
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            IList <PageResource> resultPages;

            if (pagesByMetadata != null && pagesByFulltext != null)
            {
                resultPages = pagesByMetadata.Intersect(pagesByFulltext)
                              .OrderBy(x => x.Position)
                              .ToList();
            }
            else if (pagesByFulltext != null)
            {
                resultPages = pagesByFulltext;
            }
            else if (pagesByMetadata != null)
            {
                resultPages = pagesByMetadata;
            }
            else
            {
                throw new MainServiceException(MainServiceErrorCode.NoSupportedSearch,
                                               "No supported search criteria was specified"
                                               );
            }

            var result = m_mapper.Map <List <PageContract> >(resultPages);

            return(result);
        }