Литература Введение Lucene Обзор


Download 219.91 Kb.
bet11/13
Sana19.04.2023
Hajmi219.91 Kb.
#1363803
TuriЛитература
1   ...   5   6   7   8   9   10   11   12   13
Bog'liq
1 sam top

3.5. Поиск


После создания индекса мы можем выполнять поиск по этому индексу, используяQuery иIndexSearcher.. Результатом поиска обычно является набор результатов, содержащий извлеченные данные.
Обратите внимание, чтоIndexWritter отвечает за создание индекса, аIndexSearcher - за поиск по индексу.

3.6. Синтаксис запроса


Lucene предоставляет очень динамичный и простой в написании синтаксис запроса.
Для поиска по произвольному тексту мы просто использовали бы текстString в качестве запроса.
Для поиска текста в определенном поле мы будем использовать:
fieldName:text


eg: title:tea
Диапазон поиска:
timestamp:[1509909322,1572981321]
Мы также можем искать с использованием подстановочных знаков:
dri?nk
будет искать один символ вместо подстановочного знака «?»
d*k
поиск слов, начинающихся с «d» и заканчивающихся на «k», с несколькими символами между ними.
uni*
найдет слова, начинающиеся с «уни».
Мы также можем комбинировать эти запросы и создавать более сложные запросы. И включите логический оператор как И, НЕ, ИЛИ:
title: "Tea in breakfast" AND "coffee"
Подробнее о синтаксисе запросаhere.

4. Простое приложение


Давайте создадим простое приложение и проиндексируем несколько документов.
Сначала мы создадим индекс в памяти и добавим в него несколько документов:
...
Directory memoryIndex = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig);
Document document = new Document();


document.add(new TextField("title", title, Field.Store.YES));
document.add(new TextField("body", body, Field.Store.YES));


writter.addDocument(document);
writter.close();
Здесь мы создаем документ сTextField и добавляем их в индекс с помощьюIndexWriter. Третий аргумент в конструктореTextField указывает, должно ли значение поля также сохраняться или нет .
Анализаторы используются для разделения данных или текста на куски, а затем отфильтровывают из них стоп-слова. Стоп-слова - это такие слова, как «a», «am», «is» и т. Д. Это полностью зависит от данного языка.
Затем давайте создадим поисковый запрос и выполним поиск в указателе добавленного документа:
public List searchIndex(String inField, String queryString) {
Query query = new QueryParser(inField, analyzer)
.parse(queryString);


IndexReader indexReader = DirectoryReader.open(memoryIndex);
IndexSearcher searcher = new IndexSearcher(indexReader);
TopDocs topDocs = searcher.search(query, 10);
List documents = new ArrayList<>();
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
documents.add(searcher.doc(scoreDoc.doc));
}


return documents;
}
В методеsearch() второй целочисленный аргумент указывает, сколько лучших результатов поиска он должен вернуть.
Теперь давайте проверим это:
@Test
public void givenSearchQueryWhenFetchedDocumentThenCorrect() {
InMemoryLuceneIndex inMemoryLuceneIndex
= new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
inMemoryLuceneIndex.indexDocument("Hello world", "Some hello world");


List documents
= inMemoryLuceneIndex.searchIndex("body", "world");


assertEquals(
"Hello world",
documents.get(0).get("title"));
}
Здесь мы добавляем в индекс простой документ с двумя полями ‘title 'и‘ body', а затем пытаемся найти его с помощью поискового запроса.

Download 219.91 Kb.

Do'stlaringiz bilan baham:
1   ...   5   6   7   8   9   10   11   12   13




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling