资源说明:Lucene searcher example basead on Google engine
h1. Overview Apache Lucene h1. 1up4developers? * Desenvolvedores ** agilidade ** pragmatismo ** real world * Blog ** http://1up4dev.org ** http://1up4dev.com h1. 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. h1. 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 h1. 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. h2. 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. h1. 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. h1. Configuraçãoh1. Exemplo: indexandoorg.apache.lucene lucene-core 2.4.1 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();h1. Exemplo: pesquisandoIndexReader 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")); }h1. 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 h1. Avançado: ordenação h1. Avançado: hightlight h1. Demonstração Sources: http://github.com/rpanachi/loogle/ h1. Ferramentas * *Luke* http://www.getopt.org/luke/ 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* http://limo.sourceforge.net 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 * *Zoei* http://code.google.com/p/zoie/ Zoie is a real-time search and indexing system built on Apache Lucene. Originally developed at LinkedIn.com * *Hibernate* Search http://www.hibernate.org 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* http://lucene.apache.org/solr/ 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.
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。
English
