Статьи

Lucene — быстро добавьте индекс и возможность поиска

Что такое Lucene?

Apache LuceneTM — это высокопроизводительная, полнофункциональная библиотека для текстового поиска, полностью написанная на Java. Это технология, подходящая практически для любого приложения, требующего полнотекстового поиска, особенно кросс-платформенного.

Lucene может простой текст, целые числа, индекс PDF, офисные документы. и т.д.,

Как Lucene включает более быстрый поиск?

Lucence создает нечто, называемое Inverted Index. Обычно мы отображаем документ -> условия в документе. Но Lucene делает наоборот. Создает индексный термин -> список документов, содержащих этот термин, что ускоряет поиск.

Установить Lucene

Maven Dependency

1
2
3
4
5
6
7
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><pre class='brush:xml'><dependency></span> <pre class = 'brush: xml'> <зависимость></span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupid>org.apache.lucene</groupid></span> <GroupID> org.apache.lucene </ GroupID></span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactid>lucene-core</artifactid></span> <Артефакт> Lucene-ядро </ артефакт></span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><version>3.0.2</version></span> <Версия> 3.0.2 </ версия></span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><type>jar</type></span> <Тип> банку </ тип></span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>compile</scope></span> <Сфера> компиляции </ сфера></span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>

Скачать зависимость

Загрузите Lucene с http://lucene.apache.org/ и добавьте lucene-core.jar в путь к классам.

Как работает Lucene?


Давайте разберемся с картиной сначала снизу — Центр. Необработанный текст используется для создания Lucene ‘Document’, который анализируется с использованием указанного анализатора, и Document добавляется в индекс на основе свойств Store, TermVector и Analzed полей.

Далее поиск сверху вниз. Пользователи указывают запрос в текстовом формате. Объект запроса строится на основе текста запроса, и результат выполненного запроса возвращается как TopDocs.

Основные классы Lucene

Каталог, FSDirectory, RAMDirectory Каталог, содержащий индекс

Файловая система на основе индекса dir

Основанный на памяти индекс dir

каталог

indexDirectory = FSDirectory.open (новый файл (‘c: // lucene // узлы’));

IndexWriter Обработка записи в индекс — addDocument, updateDocument, deleteDocuments, слияние и т. Д. IndexWriter writer = новый IndexWriter (indexDirectory,

новый StandardAnalyzer (Version.LUCENE_30),

новый MaxFieldLength (1010101));

IndexSearcher Поиск с использованием indexReader — search (query, int) IndexSearcher searcher = new IndexSearcher (indexDirectory);
Документ DTO используется для индексации и поиска Документ документа = новый документ ();
поле Каждый документ содержит несколько полей. Имеет 2 части, имя, значение. новое поле (‘id’, ‘1’, Store.YES, Index.NOT_ANALYZED)
Срок Слово из теста. Используется в search.2 parts.Field для поиска и значение для поиска Термин термин = новый термин («id», «1»);
запрос База всех типов запросов — TermQuery, BooleanQuery, PrefixQuery, RangeQuery, WildcardQuery, PhraseQuery и т. Д. Query query = new TermQuery (term);
анализатор Создает токены из текста и помогает в создании терминов индекса из текста новый стандартный анализатор ()

Справочник Lucene

Каталог — это пространство данных, в котором работает lucene. Это может быть файловая система или память.

Ниже приведены часто используемые каталоги

каталог Описание пример
FSDirectory Каталог на основе файловой системы Directory = FSDirectory.open (файл файла);
// Файл -> Путь к каталогу
RAMDirectory Директория Lucene на основе памяти Directory = новый MemoryDirectory ()

Directory = новый MemoryDirectory (каталог dir) // загрузить файловый каталог в память


Создать запись в индексе

Lucene ‘Document’ — это основной объект, используемый при индексации. Документы содержат несколько полей. Анализаторы работают с полями документа, разбивая их на токены, а затем записывают Справочник с помощью Index Writer.

IndexWriter

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true, MaxFieldLength.UNLIMITED);</span> IndexWriter writer = new IndexWriter (indexDirectory, новый StandardAnalyzer (Version.LUCENE_30), true, MaxFieldLength.UNLIMITED);</span>

Анализаторы

Работа по анализу текста в токены или ключевые слова для поиска. Есть несколько стандартных анализаторов, предоставляемых Lucene. Выбор Analyzer определил, как индексированный текст маркируется и ищется.

Ниже приведены некоторые стандартные анализаторы.

Пример — как анализаторы работают с образцом текста

Свойства, которые определяют индексирование полей

  • Store — если поле будет сохранено для извлечения в будущем
  • ANALYZED — Должно ли содержимое быть разбито на токены
  • TermVECTOR — основанные на сроке детали, которые будут сохранены или нет


Хранить :

Если поле будет сохранено, чтобы получить позже

STORE.YES Сохранить значение, может быть получено позже из индекса
ХРАНИТЬ НЕТ Не хранить. Используется вместе с Index.ANALYZED. Когда токены используются только для поиска


Анализируются:

Как анализировать текст

Index.ANALYZED Разбейте текст на токены, индексируйте каждый токен, чтобы сделать его доступным для поиска
Index.NOT_ANALYZED Индексируйте весь текст как один токен, но не анализируйте (разбивайте их)
Index.ANALYZED_NO_NORMS То же, что и ANALYZED, но не хранит норм
Index.NOT_ANALYZED_NO_NORMS То же, что NOT_ANALYZED, но без норм
Index.NO не
сделать это поле полностью доступным для поиска


Термин вектор

Нужны детали термина для аналога, выделения

TermVector.YES запись
УНИКАЛЬНЫЕ УСЛОВИЯ + СЧЕТА + НЕТ ПОЗИЦИЙ + НЕТ СМЕЩЕНИЙ в каждом документе
TermVector.WITH_POSITIONS запись
УНИКАЛЬНЫЕ УСЛОВИЯ + СЧЕТА + ПОЗИЦИИ + НЕТ СМЕЩЕНИЙ в каждом документе
TermVector.WITH_OFFSETS запись
УНИКАЛЬНЫЕ УСЛОВИЯ + СЧЕТА + НЕТ ПОЗИЦИЙ + СМЕЩЕНИЯ в каждом документе
TermVector.WITH_POSITIONS_OFFSETS запись
УНИКАЛЬНЫЕ УСЛОВИЯ + СЧЕТА + ПОЗИЦИИ + СМЕЩЕНИЯ в каждом документе
TermVector.NO Не записывать информацию вектора терминов

Пример создания индекса

1
2
3
4
5
6
7
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true,MaxFieldLength.UNLIMITED);</span> IndexWriter writer = new IndexWriter (indexDirectory, новый StandardAnalyzer (Version.LUCENE_30), true, MaxFieldLength.UNLIMITED);</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Document document = new Document();</span> Документ документа = новый документ ();</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">document.add(new Field('id', '1', Store.YES, Index.NOT_ANALYZED));</span> document.add (новое поле ('id', '1', Store.YES, Index.NOT_ANALYZED));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">document.add(new Field('name', 'user1', Store.YES, Index.NOT_ANALYZED));</span> document.add (новое поле ('name', 'user1', Store.YES, Index.NOT_ANALYZED));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">document.add(new Field('age', '20', Store.YES, Index.NOT_ANALYZED));</span> document.add (новое поле ('age', '20', Store.YES, Index.NOT_ANALYZED));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">writer.addDocument(document);</span> writer.addDocument (документ);</span>

Пример обновления индекса

1
2
3
4
5
6
7
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true,MaxFieldLength.UNLIMITED);</span> IndexWriter writer = new IndexWriter (indexDirectory, новый StandardAnalyzer (Version.LUCENE_30), true, MaxFieldLength.UNLIMITED);</span>
  
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Document document = new Document();</span> Документ документа = новый документ ();</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">document.add(new Field("id", "1", Store.YES, Index.NOT_ANALYZED));</span> document.add (новое поле («id», «1», Store.YES, Index.NOT_ANALYZED));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">document.add(new Field("name", "user1", Store.YES, Index.NOT_ANALYZED));</span> document.add (новое поле («имя», «пользователь1», Store.YES, Index.NOT_ANALYZED));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">document.add(new Field("age", "20", Store.YES, Index.NOT_ANALYZED));</span> document.add (новое поле ("age", "20", Store.YES, Index.NOT_ANALYZED));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">writer.addDocument(document);</span> writer.addDocument (документ);</span>

Пример удаления индекса

1
2
3
4
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), MaxFieldLength.UNLIMITED);</span> IndexWriter writer = new IndexWriter (indexDirectory, новый StandardAnalyzer (Version.LUCENE_30), MaxFieldLength.UNLIMITED);</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Term term = new Term('id', '1');</span> Термин термин = новый термин («id», «1»);</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">writer.deleteDocuments(term);</span> writer.deleteDocuments (срок);</span>

Поиск по индексу: Пользователи указывают запрос в текстовом формате. Объект запроса строится на основе текста запроса, анализируется, и результат выполненного запроса возвращается как TopDocs.
Запросы являются основным входом для поиска.

TermQuery
BooleanQuery И или нет (объединить несколько запросов)

PrefixQuery Начинается с
WildcardQuery ? И *
— * не допускается в начале
PhraseQuery Точная фраза
RangeQuery Термин диапазон или числовой диапазон
FuzzyQuery Поиск похожих слов

Примеры запросов

Пример по поиску:

1
2
3
4
5
6
7
8
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">IndexSearcher searcher = new IndexSearcher(indexDirectory);</span> IndexSearcher searcher = new IndexSearcher (indexDirectory);</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Term term = new Term('id', '1');</span> Термин термин = новый термин («id», «1»);</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Query query = new TermQuery(term);</span> Query query = new TermQuery (term);</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">TopDocs docs = searcher.search(query, 3);</span> TopDocs docs = searcher.search (query, 3);</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (int i = 1; i <= docs.totalHits; i++)</span> for (int i = 1; i <= docs.totalHits; i ++)</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">{</span> {</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">System.out.println(searcher.doc(i));</span> System.out.println (searcher.doc (я));</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Диагностические инструменты Lucene:

  • Люк — http://code.google.com/p/luke/
    Luke — это удобный инструмент для разработки и диагностики, который обращается к уже существующим индексам Lucene и позволяет отображать и изменять их содержимое несколькими способами:
  • Лимузин — http://limo.sourceforge.net/
    Идея состоит в том, чтобы иметь небольшой инструмент, работающий как веб-приложение, которое дает основную информацию об индексах, используемых поисковой системой Lucene.

Полный пример:

Скачать здесь: LuceneTester.java

Ресурсы

Ссылка: Lucene — быстро добавьте возможности индексации и поиска от нашего партнера JCG Шривидхьи Умашанкера в блоге « Мысли о технаре» .