Skip to content
This repository has been archived by the owner on Aug 13, 2024. It is now read-only.
/ loogle Public archive

Lucene searcher example basead on Google engine

Notifications You must be signed in to change notification settings

rpanachi/loogle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Overview Apache Lucene

1up4developers?

Apache Lucene

  • O que é?

Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java.

  • Para que serve?

It is a technology suitable for nearly any application that requires full-text search, especially cross-platform.

Features

  • high-performance indexing and search
  • scalable
  • ranked searching
  • many powerful query types: phrase queries, wildcard queries, proximity queries, range queries and more
  • fielded searching (e.g., title, author, contents)
  • date-range searching
  • sorting by any field
  • multiple-index searching with merged results
  • allows simultaneous update and searching

Conceitos “core indexing”

  • IndexWriter

Componente principal do processo de indexar. Esta classe cria novos indices ou adiciona document a existentes, só permite acesso de escrita, ou seja, não consegue ler ou buscar indices.

  • Directory

Representa a localização dos indices.O Lucene vem com duas implementações para esta class abstrata. O FSDirectory, que permite guardar indices no disco, e o RAMDirectory que permite guardá-los em memória.

  • Analyzer

Antes do texto ser indexado, passa por um Analyzer. Responsável por extrair os tokens do texto e eliminar o “resto”. Nesta classe que aplica-se os conceitos de stop words, case sensitive etc. A escolha do analyzer é um elemento crítico no design da aplicação.

  • Document

Representa uma coleção de fields. Imagine como um “documento virtual” que é recuperado nas buscas. Os campos do documento devem ser texto, o Lucene lida somente com String e java.io.Reader. Qualquer documento “não-texto” deve ser processado antes para se tornarem pesquisáveis.

  • Field

Cada documento no indice contém um ou mais fields, que são como chave-valor. Cada campo corresponde a um pedaço de informação que pode ser pesquisada e/ou recuperado do indice durante a busca. Existem quatro tipos de campos.

  • IndexWriter

Componente principal do processo de indexar. Esta classe cria novos indices ou adiciona document a existentes, só permite acesso de escrita, ou seja, não consegue ler ou buscar indices.

  • Directory

Representa a localização dos indices.O Lucene vem com duas implementações para esta class abstrata. O FSDirectory, que permite guardar indices no disco, e o RAMDirectory que permite guardá-los em memória.

  • Analyzer

Antes do texto ser indexado, passa por um Analyzer. Responsável por extrair os tokens do texto e eliminar o “resto”. Nesta classe que aplica-se os conceitos de stop words, case sensitive etc. A escolha do analyzer é um elemento crítico no design da aplicação.

  • Document

Representa uma coleção de fields. Imagine como um “documento virtual” que é recuperado nas buscas. Os campos do documento devem ser texto, o Lucene lida somente com String e java.io.Reader. Qualquer documento “não-texto” deve ser processado antes para se tornarem pesquisáveis.  

  • Field

Cada documento no indice contém um ou mais fields, que são como chave-valor. Cada campo corresponde a um pedaço de informação que pode ser pesquisada e/ou recuperado do indice durante a busca. Existem quatro tipos de campos.

Fields

  • Keyword – Isn’t analyzed, but is indexed and stored in the index.

This type is suitable for fields whose original value should be preserved in its entirety, such as URLs, file system paths, dates, personal names, telephone numbers, and so on.

  • UnIndexed – Not nalyzed or indexed, but its value is stored in the index.

This type is suitable for fields that you need to display with search results (such as a URL or database primary key), but whose values you’ll never search directly.

  • UnStored – This field type is analyzed and indexed but isn’t stored in the index.

It’s suitable for indexing a large amount of text that doesn’t need to be retrieved in its original form, such as bodies of web pages, or any other type of text document.

  • Text – Is analyzed, and is indexed.

This implies that fields of this type can be searched against, but be cautious about the field size. If the data indexed is a String, it’s also stored; but if the data is from a Reader, it isn’t stored. This is often a source of confusion, so take note of this difference when using Field.Text.

Conceitos “core searching”

  • IndexSearcher

É a classe que abre o indice como somente leitura e oferece uma variedade de métodos para busca.

  • Term

A unidade básica para pesquisa. Parecido com Field, é uma classe chave-valor.

Query q = new TermQuery(new Term("contents", "lucene"));
Hits hits = is.search(q);

Este código buscará todos os Documentos que contém a palavra lucene no campo contents.

  • Query

É a classe abstrata que permite representar diferentes tipos de “busca”, como BooleanQuery, PhraseQuery… etc.

  • TermQuery

É o Tipo mais básico de busca. É usado para buscar Documentos que contém Campos com algum valor específico.

  • Hits

É um container de ponteiros para o resultado da busca. Por questões de performance, as instâncias de Hits não carregam todos os Documentos do resultado.

Configuração

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>2.4.1</version>
</dependency>

Exemplo: indexando

Document doc = new Document();
doc.add(new Field("titulo", "Teste do Lucene",
    Store.YES, Index.ANALYZED));
doc.add(new Field("texto", "Isto é um texto de exemplo",
    Store.NO, Index.ANALYZED));
doc.add(new Field("data", "2009-10-07",
    Store.NO, Index.NOT_ANALYZED));
IndexWriter writer = new IndexWriter("/tmp/index",
    new StrandardAnalyzer(), true, 
    IndexWriter.MaxFieldLength.LIMITED);
writer.addDocument(docToIndex);
writer.commit();

Exemplo: pesquisando

IndexReader reader = IndexReader.open("/tmp/index");
Searcher searcher = new IndexSearcher(reader);
Query query = new QueryParser.parse("lucene", "texto", 
    new StandardAnalyzer()); 
TopDocs hits = searcher.search(query);
println("Resultados encontrados: " + hits.totalHits);
for (ScoreDoc score : hits.scoreDocs) {
    Document document = searcher.doc(score.doc);
    println(document.get("titulo"));
}

Avançado: query syntax

Field

texto:exemplo

Wildcard

te?to
text*

Fuzzy

text~

Proximity

“exemplo lucene”~2

Range

texto:{teste TO texto}
data:{2005-01-01 TO 2009-12-31}

Grouping and Boolean

texto AND lucene
(apache OR lucene) AND teste

Avançado: ordenação

Avançado: hightlight

Demonstração

Sources: http://github.com/rpanachi/loogle/

Ferramentas

Luke is a handy development and diagnostic tool, which accesses already existing Lucene indexes and allows you to display and modify their content in several ways.

LIMO stands for Lucene Index Monitor. The idea is to have a small tool, running as a web application, that gives basic information about indexes used by the Lucene search engine

Zoie is a real-time search and indexing system built on Apache Lucene. Originally developed at LinkedIn.com

Hibernate Search brings the power of full text search engines to the persistence domain model and Hibernate experience, through transparent configuration (Hibernate Annotations) and a common API.

Solr is an open source enterprise search server based on the Lucene Java search library, with XML/HTTP and JSON APIs, hit highlighting, faceted search, caching, replication, a web administration interface and many more features. It runs in a Java servlet container such as Tomcat.

About

Lucene searcher example basead on Google engine

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages