public IEnumerable <SampleDataFileRow> _search(string searchTerm, int precision, global::Lucene.Net.Store.Directory indexDirectory)
        {
            Debug.Assert(!String.IsNullOrEmpty(searchTerm));

            List <SampleDataFileRow> results = new List <SampleDataFileRow>();

            if (String.IsNullOrEmpty(searchTerm))
            {
                return(results);
            }

            using (IndexSearcher searcher = new IndexSearcher(indexDirectory))
            {
                var analyzer = new StandardAnalyzer(Version.LUCENE_30, ListStopWords);

                QueryParser parser = new QueryParser(Version.LUCENE_30, "LineText", analyzer);

                if (precision > 0 && precision < 100)
                {
                    parser.FuzzyMinSim = ((float)precision) * 0.01f;
                }
                else if (precision == 100)
                {
                    parser.FuzzyMinSim = 0.99f;
                }
                else
                {
                    parser.FuzzyMinSim = 0.8f;
                }

                //parser.PhraseSlop = 5;

                var query = ParseQuery(searchTerm, parser);

                //var query = fparseQuery(searchTerm);
                ScoreDoc[] hitsFound = searcher.Search(query, null, CountSearchResults).ScoreDocs;

                foreach (var t in hitsFound)
                {
                    var         sampleDataFileRow = new SampleDataFileRow();
                    int         docId             = t.Doc;
                    float       score             = t.Score;
                    Explanation explanation       = searcher.Explain(query, t.Doc);
                    Document    doc = searcher.Doc(docId);

                    sampleDataFileRow.LineNumber = int.Parse(doc.Get("LineNumber"));
                    sampleDataFileRow.LineText   = doc.Get("LineText");
                    sampleDataFileRow.Score      = score;

                    _explanationResult = explanation.ToString();


                    results.Add(sampleDataFileRow);
                }

                analyzer.Close();
                searcher.Dispose();
            }
            return(results.OrderByDescending(x => x.Score).ToList());
        }
        // исключает из входящего списка
        // некорректные результаты
        private IEnumerable <SampleDataFileRow> ExcludeBadResults(SampleDataFileRow[] listResultsToCheck, string termSearch, char[] stopPunctuationMark, int searchPrecision)
        {
            var listFinal = new List <SampleDataFileRow>();

            // делаем проход по всем результатам поиска
            // и исключаем варианты, где найденные слова из запроса стоят после знака препинания
            for (var i = 0; i < listResultsToCheck.Count(); i++)
            {
                // создаем индекс для поиска с урезанным вариантом
                var listClipped = new List <SampleDataFileRow>();
                var dataRow     = new SampleDataFileRow
                {
                    Score      = listResultsToCheck.ElementAt(i).Score,
                    LineText   = listResultsToCheck.ElementAt(i).LineText,
                    LineNumber = listResultsToCheck.ElementAt(i).LineNumber
                };
                listClipped.Add(dataRow);
                // обрезать строку при необходимости
                listClipped[0] = CutDataIndex(listClipped[0], stopPunctuationMark);

                if (_condShouldResearch) // если было обрезание
                {
                    // выполнить перестройку индекса
                    // для обрезанного значения
                    RebuildRamIndex(listClipped);
                    // и выполнить поиск заново
                    var listTempSearchResults = _search(termSearch, searchPrecision, _RAMdirectory);

                    // если значение было найдено, добавляем в финальный результат
                    if (!listTempSearchResults.Any())
                    {
                        continue;
                    }
                    listFinal.Add(listResultsToCheck.ElementAt(i));
                }
                else
                {
                    listFinal.Add(listResultsToCheck.ElementAt(i));
                }
            }

            return(listFinal);
        }
        // обрезаем строки у входных данных
        // до первого знака препинания
        private SampleDataFileRow CutDataIndex(SampleDataFileRow dataInput, char[] stopPunctuationMark)
        {
            _condShouldResearch = false;

            var textCut = dataInput.LineText;

            int positionPMark = -1;

            positionPMark = textCut.IndexOfAny(stopPunctuationMark);

            // если есть знаки препинания,
            // обрезаем строку до первого знака
            if (positionPMark > _lengthStopPunctuationMark)
            {
                dataInput.LineText  = textCut.Substring(0, positionPMark);
                _condShouldResearch = true;
            }

            return(dataInput);
        }