После нескольких дней напряженной работы я наконец реализовал простой полнотекстовый поиск. Позвольте мне просмотреть и подвести итог
этой статьи. Что такое Lucene.Net? Что может сделать Lucene.Net? И вопрос как это сделать? Наконец, приведен пример реализации полнотекстового поиска в Lucene.Net.
1. Что такое Lucene.Net?
Lucene.net изначально был проектом с открытым исходным кодом, а затем обратился к коммерциализации. Lucene.net 2.0 также был выпущен, но за деньги D. Судьба Lucene.net чем-то похожа на FreeTextBox, который начался с версии 2.0, выпущенной после версии 1.6. 5. Коммерческий вариант 2.0 предоставляет бесплатную версию в виде DLL, а для версии исходного кода необходимо приобрести коммерческую лицензию, однако остается исходный код версии 1.6.5, и вы все равно можете увидеть большую часть внутренних деталей; , но в версии 2.0 Добавленная поддержка браузера Mozilla видна только через генерируемые им сценарии HTML и JavaScript.
Lucene — это широко используемый API индексирования в мире Java. Используя предоставляемые им методы, вы можете создавать индексы для текстовых материалов и обеспечивать извлечение. (Ссылка: NLucene и Lucene .NET) NLucene — это первый порт .net и версия в стиле .net, в которой используются соглашения об именах .net и дизайн библиотеки классов. Однако по энергетическим причинам лидер проекта NLucene выпустил только бета-версию 1.2. После появления проекта Lucene.NET новых планов относительно NLucene не было.
Первоначально Lucene.NET претендовал на то, чтобы быть современной версией .net Lucene. Он принял только предложения .net с точки зрения именования. Его основные цели, как правило, были совместимы с Java Lucene: одна из них заключалась в том, чтобы сделать формат индекса совместимым. они могут работать вместе; одна из них заключается в том, чтобы имена были близкими (с небольшими различиями, например, в верхнем и нижнем регистре и т. д.), и цель состоит в том, чтобы облегчить разработчикам использование кода и информации, связанных с Java Lucene.
Я не знаю, когда проект Lucene.NET отказался от своего плана с открытым исходным кодом и обратился к бизнесу. Фактически он удалил файлы с открытым исходным кодом на SourceForge. В то же время на SourceForge появился проект dotLucene. В знак протеста против Lucene.NET, dotLucene практически оставила код Lucene.NET нетронутым в качестве отправной точки. ( https://sourceforge.net/forum/forum.php?thread_id=1153933&forum_id=408004 ).
Проще говоря, Lucene.Net — это библиотека функций поиска информации (Library). Вы можете использовать ее для добавления функций индексирования и поиска в ваше приложение.
Пользователям Lucene не обязательно иметь глубокие знания о полнотекстовом поиске. научитесь только использовать библиотеку. Если вы знаете, как вызывать функции в библиотеке, вы можете реализовать функцию полнотекстового поиска для своего приложения.
Но не ждите, что Lucene будет поисковой системой, такой как Google и Baidu. инструмент, библиотеку. Вы также можете думать о нем как о простом и удобном в использовании API, который инкапсулирует функции индексирования и поиска. С помощью этого API вы можете выполнять множество операций, связанных с поиском, и это очень удобно. удовлетворит ваши потребности. Приложение выполняет простой полнотекстовый поиск. Как разработчик приложения (непрофессиональный разработчик поисковых систем), его функций достаточно, чтобы удовлетворить вас.
2. Что может сделать Lucene.Net?
Lucene может индексировать и искать любые данные. Независимо от формата источника данных, если они могут быть преобразованы в текст, они могут быть проанализированы и использованы Lucene. Другими словами, будь то MS word, Html, pdf или. другое Lucene может использовать файлы любой формы, если вы можете извлечь из них текстовое содержимое. Вы можете использовать Lucene для их индексации и поиска.
3. Как использовать Lucene.Net?
Все сводится к следующему: создание индекса и его использование. Создание индекса заключается в хранении или анализе информации источника данных, по которой осуществляется поиск, в качестве нашей ключевой информации, а оставление отметки для поиска похоже на создание таблицы. содержимое в Word (личное понимание), использование индекса заключается в анализе источника данных на основе информации индекса во время поиска и извлечении необходимой нам информации.
Пожалуйста, взгляните на пример:
общедоступный класс IntranetIndexer
для создания индекса.
{
/**/////Запись индекса
Private IndexWriter Writer
//Корневой каталог файла, который будет записан в индекс;
частная строка docRootDirectory
//соответствующий формат файла
;
шаблон частной строки[]
/**//// <сводка>
/// Инициализировать средство записи индекса. Каталог – это каталог, в котором создается индекс. Значение true означает, что если индексный файл не существует, индексный файл будет создан заново. Если индексный файл уже существует, индексный файл будет создан заново. перезаписано.
/// </сводка>
/// <param name="directory">Передается индексируемый каталог. Обратите внимание, что это строковое значение. Если каталог не существует, он будет создан автоматически</param>.
publicIntranetIndexer (каталог строк)
{
писатель = новый IndexWriter (каталог, новый StandardAnalyzer (), правда);
писатель.SetUseCompoundFile(истина);
}
public void AddDirectory (каталог DirectoryInfo, шаблон строки [])
{
this.docRootDirectory = каталог.ПолноеИмя;
this.pattern = шаблон;
addSubDirectory (каталог);
}
частная пустота addSubDirectory (каталог DirectoryInfo)
{
for(int i=0;i<шаблон .Length ;i++)
{
foreach (FileInfo fi в каталоге.GetFiles(шаблон[i]))
{
AddHtmlDocument(fi.FullName);
}
}
foreach (DirectoryInfo в каталоге.GetDirectories())
{
addSubDirectory (ди);
}
}
public void AddHtmlDocument (строковый путь)
{
строка exname = Path.GetExtension (путь);
Документ документа = новый документ();
строка HTML;
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm"||exname .ToLower ()==".txt")
{
использование (StreamReader sr = новый StreamReader (путь, System .Text .Encoding .Default ))
{
html = sr.ReadToEnd();
}
}
еще
{
используя (StreamReader sr = новый StreamReader(path, System.Text.Encoding.Unicode))
{
html = sr.ReadToEnd();
}
}
int относительныйPathStartsAt = this.docRootDirectory.EndsWith("\") ? this.docRootDirectory.Length: this.docRootDirectory.Length + 1;
строка относительныйPath = path.Substring(relativePathStartsAt);
строка title=Path.GetFileName(путь);
//Определяем, является ли это веб-страницей, удаляем тег, иначе не используем его
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm")
{
doc.Add(Field.UnStored("текст", parseHtml(html)));
}
еще
{
doc.Add(Поле .UnStored("текст",html));
}
doc.Add(Field.Keyword("путь", относительныйПуть));
//doc.Add(Field.Text("title", getTitle(html)));
doc.Add(Поле .Текст("title",title));
писатель.AddDocument(док);
}
/**//// <сводка>
/// Удаление тегов с веб-страниц
/// </сводка>
/// <param name="html">Веб-страница</param>
/// <returns>Вернуть текст удаленной веб-страницы</returns>
частная строка parseHtml (строка html)
{
строка temp = Regex.Replace(html, "<[^>]*>", "");
return temp.Replace(" ", " ");
}
/**//// <сводка>
/// Получаем заголовок страницы
/// </сводка>
/// <param name="html"></param>
/// <возвращается></возвращается>
частная строка getTitle (строка html)
{
Соответствие m = Regex.Match(html, "<title>(.*)</title>");
если (m.Groups.Count == 2)
вернуть m.Groups[1].Value;
вернуть «Название документа неизвестно»;
}
/**//// <сводка>
/// Оптимизируем индекс и закрываем запись
/// </сводка>
публичная недействительность Закрыть()
{
писатель.Оптимизировать();
писатель.Закрыть();
}
}
Сначала создайте объект «Документ», а затем добавьте некоторые атрибуты «Поле» к объекту «Документ». Вы можете думать об объекте «Документ» как о виртуальном файле, из которого в дальнейшем будет получена информация. Поле рассматривается как метаданные, описывающие этот виртуальный файл. Среди них Поле включает четыре типа:
Данные Keywork этого типа не будут анализироваться, но будут индексироваться и сохраняться в индексе.
Неиндексированный
Данные этого типа не будут анализироваться или индексироваться, но будут храниться в индексе.
Не сохранено
В отличие от UnIndexed, он анализируется и индексируется, но не сохраняется.
Текст
Аналогично UnStored. Если тип значения — строка, оно будет сохранено. Если тип значения — Reader, оно не будет сохранено, как и UnStored.
Наконец, каждый документ добавляется в индекс.
Ниже приводится поиск по индексу
//Создаем индексатор
Искатель IndexSearcher = новый IndexSearcher (indexDirectory);
//Разбираем текстовое поле индекса для поиска
Запрос запроса = QueryParser.Parse(this.Q, "text", new StandardAnalyzer());
//Помещаем результаты поиска в хиты
Хиты хиты = searcher.Search(query);
//Статистика по общему количеству найденных записей
this.total = hits.Length();
//Выделять
Подсветка QueryHighlightExtractor = новый QueryHighlightExtractor(query, new StandardAnalyzer(), "<font color=red>", "</font>");
Первый шаг — использовать IndexSearcher для открытия индексного файла для последующих поисков, а параметр — это путь к индексному файлу.
Второй шаг — использовать QueryParser для преобразования более читаемых операторов запроса (например, слова запроса lucene и некоторых других)
.расширенные методы lucene AND. net) в объект запроса, используемый внутри Lucene.
Третий шаг выполняет поиск и возвращает результаты в коллекцию совпадений. Следует отметить, что Lucene не помещает все результаты в попадания сразу, а помещает их. Для экономии места
результаты поиска затем обрабатываются и отображаются на странице:
for (int i = startAt; i <resultsCount; i++)
{
Документ документа = hits.Doc(i);
string path = doc.Get("path");
string location =Server.MapPath("documents")+" \"+path ;
строка exname = Path.GetExtension (путь);
строка PlainText;
строка str=doc.Get ("название");
if(exname==".html" || exname ==".htm" || exname ==".txt")
{
используя (StreamReader sr = новый StreamReader(location, System.Text.Encoding.Default))
{
PlainText = parseHtml(sr.ReadToEnd());
}
}
еще
{
используя (StreamReader sr = новый StreamReader(location, System.Text.Encoding.Unicode))
{
PlainText = sr.ReadToEnd();
}
}
//DataTable добавляем строки
Строка DataRow = this.Results.NewRow();
row["title"] = doc.Get("title");
string IP=Request.Url.Host;//Получить IP сервера
//Запрос.URL.Порт;
row["path"]=@" http://"+IP+"/WebUI/Search/documents/"+path ;
row["образец"] = маркер.GetBestFragments(plainText, 80, 2, "");
this.Results.Rows.Add(строка);
}
searcher.Close();//Закройте поисковик. Если вы хотите получить более глубокое, полное и глубокое понимание Lucene.Net, посетите веб-сайт:
http: //blog.tianya.cn/blogger/view_blog.asp?BlogName=aftaft