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); }