Литература Введение Lucene Обзор
Download 219.91 Kb.
|
1 sam top
- Bu sahifa navigatsiya:
- 6.1. TermQuery с
- 6.2. PrefixQuery с
- 6.3. WildcardQuery с
- 6.4. PhraseQuery с
- 6.5. FuzzyQuery с
- 6.6. BooleanQuery с
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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling