public IActionResult RecommendById(string id, [FromBody] PrcRecommendationByIdRequest request) { if (request == null) { return(new StatusCodeResult(StatusCodes.Status400BadRequest)); } // If Id is Alias, translate to Id if (GlobalStore.ServiceAliases.IsExist(id)) { id = GlobalStore.ServiceAliases.Get(id); } if (!GlobalStore.ActivatedPrcs.IsExist(id)) { return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, string.Format(ServiceResources.ServiceNotExistsOrNotActivated, ServiceTypeEnum.Prc))); } if (!string.IsNullOrEmpty(request.TagId) && !GlobalStore.ActivatedPrcs.Get(id).PrcsSettings.Tags.Any(t => t.Id == request.TagId)) { return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, ServiceResources.TheGivenTagIsMissingFromThePRCService)); } var prcSettings = GlobalStore.ActivatedPrcs.Get(id).PrcsSettings; var result = prcIndexHandler.RecommendById(id, prcSettings, request); return(new OkObjectResult(result)); }
public IEnumerable <PrcRecommendationResult> RecommendById(string id, PrcSettingsElastic prcSettings, PrcRecommendationByIdRequest request) { var result = new List <PrcRecommendationResult>(); var globalStoreDataSet = GlobalStore.DataSets.Get(prcSettings.DataSetName); var dataSet = globalStoreDataSet.DataSet; var documentQuery = queryFactory.GetDocumentQuery(dataSet.Name); var fieldsForRecommendation = prcSettings.FieldsForRecommendation; var filterOrWeight = !string.IsNullOrEmpty(request.Query) || request?.Weights?.Any() == true; var tagId = string.Empty; if (string.IsNullOrEmpty(request.TagId)) { var documentElastic = documentQuery.Get(request.DocumentId); if (documentElastic == null) { return(result); } var tagToken = JTokenHelper.GetToken(documentElastic.DocumentObject).GetPathToken(dataSet.TagField); tagId = JTokenHelper.GetUnderlyingToken(tagToken)?.ToString(); if (tagId == null) { return(result); } } else { tagId = request.TagId; } var similarDocIdsWithScore = redisHandler.GetTopNDocuments(new PrcIndexRedisKey(id, tagId, request.DocumentId), filterOrWeight ? -1 : request.Count - 1); Dictionary <string, double> resultDictionary = similarDocIdsWithScore; var documentElastics = (filterOrWeight || request.NeedDocumentInResult) ? GetDocuments(dataSet.Name, request.Query, null, fieldsForRecommendation, similarDocIdsWithScore.Keys, request.NeedDocumentInResult) : null; // ha a Filter és a Weights is üres, a TOP Count doksi Id - t visszaadjuk score-jaikkal. (ha kell a document is, akkor elastic - tól elkérjük ezeket pluszban) if (filterOrWeight) { // ezekre a doksikra módosítjuk a prc score - t a Weights-el var docIdsWithScore = documentElastics.ToDictionary(k => k.Id, v => similarDocIdsWithScore[v.Id]); //súlyozás if (request?.Weights?.Any() == true) { var weightsDic = request.Weights.ToDictionary(key => Guid.NewGuid().ToString(), value => value); var docIds = docIdsWithScore.Keys.ToList(); var queries = weightsDic.ToDictionary(key => key.Key, value => documentQuery.PrefixQueryFields(value.Value.Query, globalStoreDataSet.DocumentFields)); var ids = documentQuery.GetExistsForQueries(queries, docIds).ToDictionary(k => k.Key, v => v.Value.ToDictionary(ke => ke, va => va)); var allWeightsCount = request.Weights.Count; foreach (var docId in docIds) { var weightsSum = weightsDic.Where(w => ids[w.Key].ContainsKey(docId)).Sum(w => w.Value.Value); var pow = 1 + (weightsSum / allWeightsCount); var score = Math.Pow(docIdsWithScore[docId] + 1, pow) - 1; docIdsWithScore[docId] = score; } } resultDictionary = docIdsWithScore; } var recommendation = resultDictionary .OrderByDescending(o => o.Value) .Take(request.Count) .Select(s => new PrcRecommendationResult() { DocumentId = s.Key, Score = s.Value, Document = request.NeedDocumentInResult ? documentElastics.SingleOrDefault(d => d.Id == s.Key).DocumentObject : null }); return(recommendation); }
public async Task <ClientResponseWithObject <IEnumerable <PrcRecommendationResult> > > RecommendByIdAsync(string serviceId, PrcRecommendationByIdRequest prcRecommendationRequest) { return(await _client.SendAsync <IEnumerable <PrcRecommendationResult> >(HttpMethod.Post, prcRecommendationRequest, $"{serviceId}/{RecommendByIdEndpointSuffix}", null, null)); }