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


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

6. Lucene запросы


Поскольку теперь мы знакомы с основами индексации и поиска, давайте углубимся в это.
В предыдущих разделах мы видели основной синтаксис запроса и то, как преобразовать его в экземплярQuery с помощьюQueryParser.
Lucene также предлагает различные конкретные реализации:

6.1. TermQueryс


Term - это базовая единица поиска, содержащая имя поля вместе с искомым текстом.
TermQuery - самый простой из всех запросов, состоящий из одного термина:
@Test
public void givenTermQueryWhenFetchedDocumentThenCorrect() {
InMemoryLuceneIndex inMemoryLuceneIndex
= new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
inMemoryLuceneIndex.indexDocument("activity", "running in track");
inMemoryLuceneIndex.indexDocument("activity", "Cars are running on road");


Term term = new Term("body", "running");
Query query = new TermQuery(term);


List documents = inMemoryLuceneIndex.searchIndex(query);
assertEquals(2, documents.size());
}

6.2. PrefixQueryс


Для поиска документа по слову «начинается с»:
@Test
public void givenPrefixQueryWhenFetchedDocumentThenCorrect() {
InMemoryLuceneIndex inMemoryLuceneIndex
= new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
inMemoryLuceneIndex.indexDocument("article", "Lucene introduction");
inMemoryLuceneIndex.indexDocument("article", "Introduction to Lucene");


Term term = new Term("body", "intro");
Query query = new PrefixQuery(term);


List documents = inMemoryLuceneIndex.searchIndex(query);
assertEquals(2, documents.size());
}

6.3. WildcardQueryс


Как следует из названия, мы можем использовать подстановочные знаки «*» или «?» Для поиска:
// ...
Term term = new Term("body", "intro*");
Query query = new WildcardQuery(term);
// ...

6.4. PhraseQueryс


Он используется для поиска последовательности текстов в документе:
// ...
inMemoryLuceneIndex.indexDocument(
"quotes",
"A rose by any other name would smell as sweet.");


Query query = new PhraseQuery(
1, "body", new BytesRef("smell"), new BytesRef("sweet"));


List documents = inMemoryLuceneIndex.searchIndex(query);
// ...
Обратите внимание, что первый аргумент конструктораPhraseQuery называетсяslop,, который представляет собой расстояние в количестве слов между терминами, которые необходимо сопоставить.

6.5. FuzzyQueryс


Мы можем использовать это при поиске чего-то похожего, но не обязательно идентичного:
// ...
inMemoryLuceneIndex.indexDocument("article", "Halloween Festival");
inMemoryLuceneIndex.indexDocument("decoration", "Decorations for Halloween");


Term term = new Term("body", "hallowen");
Query query = new FuzzyQuery(term);


List documents = inMemoryLuceneIndex.searchIndex(query);
// ...
Мы попытались найти текст «Хэллоуин», но с ошибкой «Хэллоуин».

6.6. BooleanQueryс


Иногда нам может потребоваться выполнить сложные поиски, комбинируя два или более разных типов запросов:
// ...
inMemoryLuceneIndex.indexDocument("Destination", "Las Vegas singapore car");
inMemoryLuceneIndex.indexDocument("Commutes in singapore", "Bus Car Bikes");


Term term1 = new Term("body", "singapore");
Term term2 = new Term("body", "car");


TermQuery query1 = new TermQuery(term1);
TermQuery query2 = new TermQuery(term2);


BooleanQuery booleanQuery
= new BooleanQuery.Builder()
.add(query1, BooleanClause.Occur.MUST)
.add(query2, BooleanClause.Occur.MUST)
.build();
// ...

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