0 Введение
С разработкой Всемирной паутины и появления эпохи больших данных, производится большое количество цифровой информации, хранится, передается и конвертируется каждый день. Как найти информацию, которая удовлетворяет ваши потребности определенным образом из большого количества информации, чтобы ее можно было заказать и использовать, стало серьезной проблемой. Технология полнотекстового поиска является наиболее распространенным информационным приложением сегодня. В жизни поисковые системы используются для поиска информации на форумах блогов. Основным принципом этих поисков является технология полнотекстового поиска, которая будет реализована в этой статье. С реализацией цифровизации информации о документах эффективно хранение и своевременное и точное извлечение информации является основой для каждой компании, предприятия и подразделения, чтобы заложить хорошую основу. Есть уже много зрелых теорий и методов для полнотекстового поиска на английском языке. Полнотекстовой поисковой системой с открытым исходным кодом Lucene является субпроектом проектной команды Jakarta Project Foundation Foundation Apache. Его цель состоит в том, чтобы предоставить разработчикам программного обеспечения простой и простой в использовании инструментарий для облегчения реализации полнотекстовых функций поиска в целевой системе. Lucene не поддерживает китайский, но в настоящее время есть много китайских сегментов Word с открытым исходным кодом, которые могут индексировать контент китайского. Основываясь на изучении основных принципов Лусена, в этом документе осознает ползание и поиск китайских и английских веб -страниц соответственно.
1 Введение в Lucene
1.1 Введение в Lucene
Lucene-это полнотекстовый инструментарий поисковой системы, написанный на Java, который реализует две основные функции: индексация и поиск, и они не зависят друг от друга, что позволяет разработчикам легко расширяться. Lucene предоставляет богатые API, которые могут легко взаимодействовать с информацией, хранящейся в индексе. Следует отметить, что это не полное полнотекстовое приложение поиска, но предоставляет функции индексации и поиска для приложения. То есть, если Лусене хочет по -настоящему работать, необходимо сделать необходимое вторичное развитие на основе этого.
Структурный дизайн Lucene похож на конструкцию базы данных, но индекс Lucene сильно отличается от индекса базы данных. Базы данных и индексация Lucene предназначены для удобства поиска, но база данных установлена только для некоторых полей, и данные должны быть преобразованы в форматированную информацию и сохранены. Полнотекстовый поиск заключается в том, чтобы индексировать всю информацию определенным образом. Различия и сходства двух поисков показаны в таблице 1-1.
Таблица 1-1: Сравнение поиска в базе данных и поиска Lucene
Сравнение | Lucene Search | Поиск базы данных |
Поиск данных | Проверьте из файла индекса Lucene | Получить записи из индекса базы данных |
Индексная структура | Документ | Записывать |
Результаты запроса | Хит: Композиция документа, которая удовлетворяет отношениям | Набор результатов запроса: записи, содержащие ключевые слова |
Полный текстовый поиск | поддерживать | Не поддерживается |
Нечеткий запрос | поддерживать | Не поддерживается |
Сортировка результатов | Установить веса и сортировать корреляцию | Не может быть отсортирован |
1,2 Общая структура Lucene
Форма выпуска программного пакета Lucene - это файл JAR, с быстрыми обновлениями версий и большими пробелами версий. В этой статье используется версия 5.3.1, а основные используемые подпакинги показаны в таблице 1-2.
Таблица 1-2: Подпакинги и функции
Название пакета | Функция |
Org.apache.lucene.analysis | Причастие |
Org .apache.lucene .document | Документация по управлению индексом |
Org .apache.lucene .index | Операции индексации, включая сложение, удаление и т. Д. |
Org.apache.lucene.queryparser | Queryer, создать поиск выражений |
Org .apache.lucene .search | Управление поиском |
Org .apache.lucene .store | Управление хранением данных |
Org .apache.lucene .util | Общественная категория |
1.3 Lucene Architecture Design
Lucene имеет очень мощные функции, но в основном он в основном включает в себя две части: одна из них - индекс индекса в библиотеку после сегментирования текстового содержимого; Другой - вернуть результаты в соответствии с условиями запроса, то есть для установления индекса и запроса.
Как показано на рисунке 1-1, эта статья выбрасывает внешние интерфейсы и источники информации, сосредотачиваясь на индексации и запросе текстового содержимого, ползающего веб-страницами.
Рисунок 1-1: дизайн архитектуры Lucene
2 Конфигурация переменной установки JDK и переменной среды
1.jdk скачать:
Загрузите сжатый пакет, который соответствует системной версии на официальном сайте Oracle, и URL выглядит следующим образом. Нажмите Установить и установить в соответствии с подсказками. Во время процесса установки вы приведите, чтобы установить JRE, нажмите «Да».
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. Установите переменные среды:
(1) Щелкните правой кнопкой мыши Computer =》 Properties =》 Advanced System Settings =》 Variable =》 Системная переменная =》 new =》 java_home: путь установки
(2) Недавно добавлено в Path =》%Java_Home%/Bin
3. Успешный тест:
Start =》 Run =》 Cmd Введите в окне всплывающего окна DOS
Введите: Java -version будет отображать информацию версии.
Введите: javac Информация об использовании появляется в Javac
Внешний вид, как показано на рисунке 2-1 как успех.
Рисунок 2-1: CMD Command Box Test Configuration
3. Напишите код Java для получения веб -контента
Поскольку Lucene необходимо использовать разные сегментеры слов для разных языков, на английском языке используются стандартные сегментеры Word, а сегментеры SmartCN используются на китайском языке. При получении веб -страницы сначала получите веб -страницу в качестве файла HTML. В HTML интерференция TAG повлияет на эффект поиска. Следовательно, тег HTML должен быть устранен, а текстовое содержимое преобразуется в файл TXT для сохранения. За исключением участников слов, остальные на китайском и английском языке в основном одинаковы, поэтому будет выбрана любая последующая демонстрация результатов и экспериментальных результатов. Эта статья выбирает пятьдесят веб -страниц китайских и английских историй в качестве примеров.
Конкретный дизайн кода выглядит следующим образом: url2html.java преобразует URL -адрес ввода веб -страницы в файл HTML, а файл html2txt.java реализует удаление тега документа HTML и преобразует его в документ TXT. Конкретные коды показаны на рисунках 3-1 и 3-2.
public void Way (String filePath, String URL) Throws Exception {file dest = новый файл (filePath); // Создать файл inputStream IS; // получение байтового потока ввода FileOutputStream fos = new FileOutputStream (dest); // byte uput -url url wangzhi = url (url); // set url url url url url. BufferedInputStream bis = new BufferedInputStream (IS); // BufferedOutputStream для байтового входного потока BOS = new BufferedOutputStream (FOS); // Буферизация выходного потока байта/** Читать байт*/int длина; байт [] байты = новый байт [1024*20]; while ((length = bis.read (байты, 0, bytes.length))! = -1) {fos.write (байты, 0, длина); } /** Закрыть буферизованный поток и входной и выходной поток* / bos.close (); fos.close (); bis.close (); is.close (); } public String getBody (String val) {string zyf = val.replaceall ("</? [^>]+>", ""); // Проверьте <HTML> TAG return Zyf;} public void writetxt (String Str, String writePath) {file writeName = new File (writePath); try {writename.createnewfile (); BufferedWriter Out = new BufferedWriter (New FileWriter (WritEname)); out.write (str); out.flush (); out.close (); } catch (ioException e) {e.printstackTrace (); }}Принимая веб -страницу сказки «Глупый волк, идущий в школу», в качестве примера, путь документа установлен на «E:/work/lucene/test/data/html» и «E:/work/lucene/test/data/txt». Два параметра, которые необходимо установить при чтении веб -страницы, называются именем файла, и получают URL -адрес URL -адреса назначения. Создайте новую основную функцию для реализации вызовов к двум методам. Конкретная реализация показана на рисунке 3-3:
public static void main (string [] args) {string fileName = "jingdizhi"; // имя файла string url = "http://www.51test.net/show/8072125.html";//web page, которая должна быть ползал строкой filepath = "E: // work // lucene // test // data // html //"+filename+".html"; // Написать путь файла html+filename string writepath = "/// work // lucene // test // data // txt //"+filename+" = новый url2html (); try {url2html.way (filepath, url); } catch (Exception e) {e.printstackTrace (); } Html2txt html2txt = new html2txt (); String read = html2txt.readfile (filePath); // Читать html -файл string txt = html2txt.getbody (read); // Удалить систему тегов html.out.println (txt); try {html2txt.writetxt (txt, writepath); } catch (Exception e) {e.printstackTrace (); }}После выполнения программы создайте «Глупую школу Вольфа.HTML» и «Глупый волк школ» в двух папках соответственно.
4. Создайте индекс
Основные принципы индексации и запроса следующие:
Индексация: индексация поисковой системы фактически для реализации конкретной структуры данных «матрицы Word-Document». Это также первый шаг в полном поиске текста. Lucene предоставляет класс Indexwriter для управления индексом, в основном включая Add (), Delete () и Update (). Существует также настройка весов. Благодаря настройке различных весов индекса вы можете вернуть в соответствии с размером корреляции во время поиска.
Поиск: оригинальный прямой поиск был для поиска документов в последовательности. После установления индекса вы можете найти местоположение, где в документе появляется указанное слово, поиск индекса, а затем вернуть позицию и слово в документе, в который элемент индекса является правильным. Lucene предоставляет класс IndexSearcher для поиска документов. Формы поиска в основном разделены на две категории. Первая категория - термин, который ищет элементы на одну термин; Вторая категория - анализатор, который может настроить поисковые выражения и имеет больше форм поиска. Конкретные методы будут продемонстрированы позже.
4.1 Экспериментальная среда
В этом ПК используется система Windows 10x64, 8G памяти и 256G SSD. Среда разработки - Myeclipse 10, а версия JDK - 1,8. Во время эксперимента, из -за некоторых изменений синтаксиса, несколько классов были реализованы с использованием версии 1.6.
4.2 Создание индекса
Создание индексной библиотеки - это добавление записей индексов в библиотеку индексов. Lucene предоставляет интерфейс для добавления записей индексов и добавления индексов.
В основном он использует три категории: «Индексера написать», «документ» и «домен». Чтобы создать индекс, вы должны сначала построить объект документа документа и определить различные поля документа. Это похоже на создание структуры таблицы в реляционной базе данных. Документ эквивалентен строке записи в таблице, и поле эквивалентно столбцу в ряду. В Lucene для требований свойств и выходных данных различных доменов можно выбрать различные правила поля индекса/хранилища для домена. В этом эксперименте имя файла файла, полная трасса файла и текстовое содержимое используется в качестве поля документа.
Indexwriter отвечает за получение вновь добавленных документов и написание их в библиотеку индекса. При создании индексного автора записи индекс автора, вам необходимо указать языковый анализатор, который вы используете. Создание индекса разделено на две категории: первая: невзвешенный индекс; Второй: взвешенный индекс.
public Indexer (String Indexdir) бросает исключение {каталог dir = fsdirectory.open (paths.get (indexdir)); Analyzer Analyzer = new Standardanalyzer (); // Стандартный разделитель слов // SmartChinesEanalyzer Analyzer = new SmartChinesEanalyzer (); Indexwriterconfig iwc = new IndexWriterConfig (анализатор); writer = new Indexwriter (dir, iwc); }Установите поле индекса, и хранилище указывает, хранится ли содержимое индекса: имя файла и полная точка занимают меньше памяти и могут храниться для облегчения возврата запросов.
Частный документ getDocument (файл f) выбрасывает исключение {документ doc = new Document (); doc.add (new Textfield («Содержание», новый FileReader (f))); doc.add (new Textfield ("filename", f.getName (), store.yes)); doc.add (new Textfield ("fullpath", f.getCanonicalPath (), store.yes)); // индекс пути возврата Doc; }Результат после выполнения основного кода показан на рисунке: при индексации файла дизайн возвращает файл «Индексный файл: + путь файла» и вычисляет время, необходимое для вывода индекса всех файлов.
4.3 Удалить и изменить индекс
Как правило, операции в базах данных включают CRUD (добавить, удалить, изменять, запрос). Добавление означает выбор и установление элементов индекса. Запрос, как более основная функция, будет обсуждаться позже. Здесь мы в основном записываем методы, используемые при удалении и обновлении индексов.
Удаление делится на два типа, включая обычное удаление и полное удаление, поскольку удаление индекса влияет на всю базу данных. Более того, для крупных систем индексы удаления означает изменение базового уровня системы, которая требует много времени и трудоемкого и не может быть возвращена. Когда индекс был впервые индексирован, после установки индекса было сгенерировано несколько небольших файлов. При поиске каждый файл будет объединен, а затем искал. Обычное удаление - это просто простая маркировка ранее установленного индекса, что делает невозможным поиск и возврата. Полное удаление означает уничтожение индекса и не может быть отозван. Возьмите пример удаления индекса с помощью указателя «ID» 1:
Нормальное удаление (удалить перед слиянием):
writer.deletedocuments (новый термин ("id", "1")); writer.commit ();Полностью удалить (удалить после слияния):
writer.deletedocuments (новый термин ("id", "1")); writer.forcemergedeletes (); // Force Delete writer.commit ();Принцип изменения индекса относительно прост, который состоит в том, чтобы реализовать охват на основе исходного индекса. Код реализации такой же, как и добавление индекса в приведенном выше тексте. Я не буду объяснять это здесь.
4.4 Взвешивание индексов
Lucene сортируется по актуальности по умолчанию. Lucene предоставляет поле с параметром повышения, который может быть установлен. Этот параметр используется для указания важности записей. Когда условия поиска будут выполнены, записи с высоким значением будут уделяться приоритету, а результат возврата будет превышен. Если есть много записей, записи с низким весом будут ранжированы за домашнюю страницу. Следовательно, операция взвешивания по индексу является важным фактором, влияющим на удовлетворение результата возврата. При на самом деле проектирование информационной системы должны быть строгие формулы расчета веса, чтобы облегчить изменение веса поля и лучше удовлетворить потребности пользователей.
Например, поисковые системы будут иметь высокую скорость клика, а веб -страницы, которые связаны и выезжают и выходят на первую страницу, когда они возвращаются. Код реализации показан на рисунке 4-1, а пары невзвешенной суммы взвешенных результатов показаны на рисунке 4-2.
Textfield Field = New Textfield ("FullPath", f.getCanonicalPath (), store.yes); if ("Великий огонь. } // Вес по умолчанию составляет 1,0 и изменяется до 1,2, чтобы увеличить вес. doc.add (Field);Рисунок 4-1: Веса индекса
Рисунок 4-2: Перед взвешиванием
Рисунок 4-2: После взвешивания
Как видно из результатов рисунка 4-2, когда он взвешен, он возвращается в условно-порядок. Следовательно, до второго, первый взвешен, и порядок именованного файла, названного вторым, изменяется при возвращении, реализуя тест веса.
5 Провести запрос
Интерфейс поиска Lucene в основном состоит из трех классов: Queryparser, IndexSearcher и Hits. QueryParser - это анализатор запроса, ответственный за ключевые слова запроса, представленные пользователями. При создании нового анализатора вам необходимо указать домен, который будет проанализирован и какой языковой анализатор будет использоваться. Используемый здесь языковой анализатор должен быть таким же, как и анализатор, используемый при установке библиотеки индекса, в противном случае результат запроса будет неверным. IndexSearcher является индексным поиском. При создании индекса -исследователя вам необходимо указать каталог, в котором находится библиотека индекса. У IndexSearcher есть метод поиска для выполнения поиска индекса. Этот метод принимает запрос в качестве параметра и возвращает хиты. Hists - это коллекция серии отсортированных результатов запроса. Элемент коллекции - документ. С помощью метода GET документа вы можете получить информацию о файле, соответствующем этому документу, такой как: имя файла, путь файла, содержимое файла и т. Д.
5.1 Основной запрос
Как показано на рисунке, существует два основных способа запроса, но рекомендуется использовать первый тип конструктивного выражения QueryParser, которые могут иметь гибкие комбинации, включая логическое выражение логического выражения, нечеткое сопоставление и т. Д., Но второй тип термина может использоваться только для словаря.
1. Создайте форму запроса QueryParser:
Queryparser parser = new queryparser ("fullpath", анализатор); Query Query = parser.parse (q);2. Запрос для конкретных предметов:
Термин T = новый термин («имя файла», Q); Query Query = new Termquery (t);
Результат запроса показан на рисунке 5-1: В качестве примера принимайте имя файла файла запроса, содержащее «Big».
Рисунок 5-1: «Большие» результаты запроса
5.2 Нечеткий запрос
При построении QueryParser, точное соответствие и нечеткое сопоставление могут быть достигнуты путем изменения термина Q. Нечеткое сопоставление изменяется путем добавления «~» после «Q». Как показано на рисунке 5-2:
Рисунок 5-2: нечеткое сочетание
5.3 Запрос квалифицированного условия
Логический запрос логического запроса и нечеткого запроса должны только изменить слово Q, в то время как ограниченный условный запрос должен установить выражение запроса, которое в основном делится на следующие категории:
Это указанный поиск в диапазоне элементов, указанный диапазон номеров, указанная строка, начало строки и запрос на несколько кондиционеров, в котором перечислены примененные запросы соответственно. Истинный параметр относится к тому, включены ли верхний и нижний предел.
Укажите диапазон элементов:
TermrangeQuery Query = new TermrangeQuery ("desc", новый Bytesref ("b" .getbytes ()), New Bytesref ("c" .getbytes ()), true, true);Укажите диапазон номеров:
NumericRangeQuery <Integer> Query = numericRangeQuery.newinTrange ("id", 1, 2, true, true, true);Укажите начало строки:
Prefixquery Query = new Prefixquery (новый термин ("City", "a"));Запрос из нескольких кондиционеров:
Numericrangequery <Integer> Query1 = numericrangeQuery.newintrange ("id", 1, 2, true, true); prefixquery Query2 = new Prefixquery (новый термин ("City", "a")); Booleanquery.builder (); Booleanquery.add (Query1, booleanclause.occur.must); Booleanquery.add (Query2, booleanclause.occur.must);5.4 Основной запрос
В поисковых системах, таких как Baidu и Google, при запросе возвращаемая веб -страница будет отображаться красным, когда она содержит ключевые слова запроса и будет отображаться в резюме, то есть некоторый контент, содержащий ключевые слова, перехватываются и возвращаются. Выдельный запрос - реализовать изменения стиля в ключевых словах. Этот эксперимент проводится в Myeclipse. При возвращении результата не будет никаких изменений в стиле. Он добавит только теги HTML к ключевым словам, которые возвращают контент. При отображении на веб -странице произойдут изменения в стиле.
Выдвинутый код настройки показан на рисунке 5-3, а результаты показаны на рисунке 5-4. Соответствующие слова нанкина будут добавлены и помечены, которые будут смелыми и красными при отображении на веб -странице.
QueryScorer Scorer = New QueryScorer (запрос); Fragmenter Fragmenter = новый SimpleSpanFragmenter (Scorer); SimpleHtmlformatter SimpleHtmlFormatter = new SimpleHtmlFormatter ("<b> <font color = 'red'>", </font> </b> "); бомбардир); highlight.settextfragmenter (фрагментер);Рисунок 5-3: Настройки выделения
Рисунок 5-4: Выделите результаты
6 проблем и недостатков, с которыми сталкиваются во время эксперимента
Версия Lucene быстро обновляется, и между версией JDK, версией Eclipse и версией Lucene требуется хорошее соединение, и в противном случае это вызовет много несовместимости. В версии отладки есть много трудностей и выбор JDK1.6 и JDK1.8. Например, метод добавления в веб -полки был удален в версии 1.8 и не может быть использован. Тем не менее, чтение пути документа Force fsdirectory.open () требует JDK1.8 для его поддержки.
Недостатки этого эксперимента в основном отражены в:
Код менее гибкий. При ползании веб -страниц это необходимо сделать вручную, и это должно быть сделано отдельно на китайском и английском языке. Код должен быть улучшен, так что существует суждение на языке веб -страницы, а затем он автоматически выбирает и выполняет различные сегменторы слов.
Код имеет низкую повторную способность и более разумную классификацию и построение методов. Для простоты эффект в основном достигается путем аннотирования и маркировки в нескольких основных кодах, которые необходимо улучшить.
Код имеет низкую мобильность, а ползание веб -страниц использует версию JDK1.6, а в реализации Lucene используется версия JDK1.8. При экспорте в другие машины среда должна быть слегка изменена и настроена, а эксплуатация не может быть достигнута.
7 Резюме
Основываясь на принципах Lucene, эта статья понимает идеи и методы полнотекстового поиска и проводит эксперименты и тесты на обычно используемых функциях. Во время эксперимента я узнал о принципах поисковых систем и имел лучший практический опыт, основанный на содержании курса поиска информации. Lucene - отличная структура полного текста с открытым исходным кодом. Благодаря углубленным исследованиям, мы больше знакомы с его механизмом реализации. В процессе изучения его, мы выучили много объектно-ориентированных методов программирования и идей. Его хорошая система и масштабируемость и масштабируемость стоит учиться.