예제 #1
0
        private void LearnCommandForInput(IndexWriter writer, IndexReader reader, DocumentId completionId, string input)
        {
            // fickle command, isn't learnable
            if (completionId == null)
            {
                return;
            }

            var document = CoreDocument.Rehydrate(PopDocument(writer, reader, completionId.GetId()));

            if (document == null)
            {
                throw new InvalidOperationException(string.Format("Didn't find command {0}", completionId));
            }

            var learnings = _learningRepository.LearnFor(input, completionId.GetLearningId());

            document.SetLearnings(learnings);

            writer.AddDocument(document);
        }
        public AutoCompletionResult Autocomplete(string text, bool includeExplanation = false)
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                return(AutoCompletionResult.NoResult(text));
            }

            var searchers = _directoryFactory.GetAllDirectories().Select(d =>
            {
                try
                {
                    return(new IndexSearcher(d, true));
                }
                catch (Exception e)
                {
                    _log.Error(e, "While searching directory {0}", d);
                    return(null);
                }
            })
                            .Where(s => s != null)
                            .ToArray();

            using (var searcher = new MultiSearcher(searchers))
            {
                try
                {
                    BooleanQuery query = GetQueryForText(text);

                    var results  = searcher.Search(query, 10);
                    var commands = results.ScoreDocs
                                   .Select(d =>
                    {
                        var document = searcher.Doc(d.Doc);
                        try
                        {
                            Explanation explanation = null;
                            if (includeExplanation)
                            {
                                explanation = searcher.Explain(query, d.Doc);
                            }
                            var coreDoc = CoreDocument.Rehydrate(document);
                            var command = _converterRepository.FromDocumentToItem(coreDoc);

                            return(new AutoCompletionResult.CommandResult(command, coreDoc.GetDocumentId(), explanation));
                        }
                        catch (Exception e)
                        {
                            _log.Error(e, "Error getting command result for document {0}:{1}",
                                       document.GetField(SpecialFields.ConverterId).StringValue,
                                       document.GetField(SpecialFields.Id).StringValue);
                            return(null);
                        }
                    })
                                   .Where(r => r != null);
                    return(AutoCompletionResult.OrderedResult(text, commands));
                }
                catch (ParseException e)
                {
                    _log.Error(e, "Error parsing '{0}'", text);
                    return(AutoCompletionResult.NoResult(text));
                }
            }
        }