public IEnumerable <IndexQueryResult> Query() { using (IndexStorage.EnsureInvariantCulture()) { AssertQueryDoesNotContainFieldsThatAreNotIndexes(); IndexSearcher indexSearcher; using (parent.GetSearcher(out indexSearcher)) { var luceneQuery = ApplyIndexTriggers(GetLuceneQuery()); int start = indexQuery.Start; int pageSize = indexQuery.PageSize; int returnedResults = 0; int skippedResultsInCurrentLoop = 0; do { if (skippedResultsInCurrentLoop > 0) { start = start + pageSize; // trying to guesstimate how many results we will need to read from the index // to get enough unique documents to match the page size pageSize = skippedResultsInCurrentLoop * indexQuery.PageSize; skippedResultsInCurrentLoop = 0; } TopDocs search = ExecuteQuery(indexSearcher, luceneQuery, start, pageSize, indexQuery); indexQuery.TotalSize.Value = search.TotalHits; RecordResultsAlreadySeenForDistinctQuery(indexSearcher, search, start, pageSize); for (var i = start; (i - start) < pageSize && i < search.ScoreDocs.Length; i++) { Document document = indexSearcher.Doc(search.ScoreDocs[i].doc); IndexQueryResult indexQueryResult = parent.RetrieveDocument(document, fieldsToFetch, search.ScoreDocs[i].score); if (ShouldIncludeInResults(indexQueryResult) == false) { indexQuery.SkippedResults.Value++; skippedResultsInCurrentLoop++; continue; } returnedResults++; yield return(indexQueryResult); if (returnedResults == indexQuery.PageSize) { yield break; } } } while (skippedResultsInCurrentLoop > 0 && returnedResults < indexQuery.PageSize); } } }
private void LoadExistingSuggesionsExtentions(string indexName, Index indexImplementation) { var suggestionsForIndex = Path.Combine(configuration.IndexStoragePath, "Raven-Suggestions", indexName); if (!Directory.Exists(suggestionsForIndex)) { return; } foreach (var directory in Directory.GetDirectories(suggestionsForIndex)) { IndexSearcher searcher; using (indexImplementation.GetSearcher(out searcher)) { var key = Path.GetFileName(directory); var decodedKey = MonoHttpUtility.UrlDecode(key); var lastIndexOfDash = decodedKey.LastIndexOf('-'); var accuracy = float.Parse(decodedKey.Substring(lastIndexOfDash + 1)); var lastIndexOfDistance = decodedKey.LastIndexOf('-', lastIndexOfDash - 1); StringDistanceTypes distanceType; Enum.TryParse(decodedKey.Substring(lastIndexOfDistance + 1, lastIndexOfDash - lastIndexOfDistance - 1), true, out distanceType); var field = decodedKey.Substring(0, lastIndexOfDistance); var extension = new SuggestionQueryIndexExtension( Path.Combine(configuration.IndexStoragePath, "Raven-Suggestions", indexName, key), searcher.IndexReader, SuggestionQueryRunner.GetStringDistance(distanceType), field, accuracy); indexImplementation.SetExtension(key, extension); } } }
private void LoadExistingSuggestionsExtentions(string indexName, Index indexImplementation) { var suggestionsForIndex = Path.Combine(configuration.IndexStoragePath, "Raven-Suggestions", indexName); if (!Directory.Exists(suggestionsForIndex)) return; try { foreach (var directory in Directory.GetDirectories(suggestionsForIndex)) { IndexSearcher searcher; using (indexImplementation.GetSearcher(out searcher)) { var key = Path.GetFileName(directory); var decodedKey = MonoHttpUtility.UrlDecode(key); var lastIndexOfDash = decodedKey.LastIndexOf('-'); var accuracy = float.Parse(decodedKey.Substring(lastIndexOfDash + 1), CultureInfo.InvariantCulture); var lastIndexOfDistance = decodedKey.LastIndexOf('-', lastIndexOfDash - 1); StringDistanceTypes distanceType; Enum.TryParse(decodedKey.Substring(lastIndexOfDistance + 1, lastIndexOfDash - lastIndexOfDistance - 1), true, out distanceType); var field = decodedKey.Substring(0, lastIndexOfDistance); var extension = new SuggestionQueryIndexExtension( indexImplementation, documentDatabase.WorkContext, Path.Combine(configuration.IndexStoragePath, "Raven-Suggestions", indexName, key), SuggestionQueryRunner.GetStringDistance(distanceType), searcher.IndexReader.Directory() is RAMDirectory, field, accuracy); indexImplementation.SetExtension(key, extension); } } } catch (Exception e) { log.WarnException("Could not open suggestions for index " + indexName + ", resetting the index", e); try { IOExtensions.DeleteDirectory(suggestionsForIndex); } catch (Exception) { // ignore the failure } throw; } }
private void LoadExistingSuggesionsExtentions(string indexName, Index indexImplementation) { var suggestionsForIndex = Path.Combine(configuration.IndexStoragePath, "Raven-Suggestions", indexName); if (!Directory.Exists(suggestionsForIndex)) return; foreach (var directory in Directory.GetDirectories(suggestionsForIndex)) { IndexSearcher searcher; using (indexImplementation.GetSearcher(out searcher)) { var key = Path.GetFileName(directory); var decodedKey = MonoHttpUtility.UrlDecode(key); var lastIndexOfDash = decodedKey.LastIndexOf('-'); var accuracy = float.Parse(decodedKey.Substring(lastIndexOfDash + 1)); var lastIndexOfDistance = decodedKey.LastIndexOf('-', lastIndexOfDash - 1); StringDistanceTypes distanceType; Enum.TryParse(decodedKey.Substring(lastIndexOfDistance + 1, lastIndexOfDash - lastIndexOfDistance - 1), true, out distanceType); var field = decodedKey.Substring(0, lastIndexOfDistance); var extension = new SuggestionQueryIndexExtension( Path.Combine(configuration.IndexStoragePath, "Raven-Suggestions", indexName, key), searcher.IndexReader, SuggestionQueryRunner.GetStringDistance(distanceType), field, accuracy); indexImplementation.SetExtension(key, extension); } } }