lucene的介绍网上有好多,再写一遍可能有点多余了。

使用lucene之前,有一系列的疑问

  • 为什么lucene就比数据库快?
  • 倒排索引是什么,他是怎么做到的
  • lucene的数据结构是什么样的,cpu消耗,内存消耗主要因为什么
  • lucene的索引流程以及查询流程是什么样的

推荐两篇文章,更进一步了解lucene

可以参考lucene与数据库对比部分

http://www.chedong.com/tech/lucene.html

可以参考第一篇和第二篇部分对lucene有一部分了解

http://blog.csdn.net/forfuture1978/article/details/5668956

《Lucene 原理与代码分析》看过一点,但是有点难度。

现在从《lucene实战》这本书来看,lucene使用的是4.7可能与3.0有所区别。

下面是第一节的例子

package com.mitchz.lucence;

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException; import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; /**
* @author mitchz
* @version 1.0
* @since 2014年4月30日
* @category com.mitchz.lucence
*/
public class Indexer
{ private IndexWriter writer; public Indexer(String indexDir) throws IOException
{
Directory dir = FSDirectory.open(new File(indexDir));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47,
new SimpleAnalyzer(Version.LUCENE_47));
writer = new IndexWriter(dir, config);
} public int index(String dataDir, FileFilter filter) throws Exception
{
File[] files = (new File(dataDir)).listFiles();
for (File file : files)
{
if (!file.isDirectory() && !file.isHidden() && file.canRead()
&& (filter == null || filter.accept(file)))
{
indexFile(file);
}
}
return writer.numDocs();
} private static class TextFilesFilter implements FileFilter
{ @Override
public boolean accept(File path)
{
return path.getName().toLowerCase().endsWith(".txt");
}
} protected Document getDocument(File file) throws Exception
{
Document doc = new Document();
doc.add(new TextField("contents", new FileReader(file)));
doc.add(new StringField("filename", file.getName(), Field.Store.YES));
doc.add(new StringField("fullpath", file.getCanonicalPath(), Field.Store.YES));
return doc;
} protected void indexFile(File file) throws Exception
{
System.out.println("Indexing " + file.getCanonicalPath());
Document doc = getDocument(file);
writer.addDocument(doc);
} protected void close() throws IOException
{
writer.close();
} public static void main(String[] args) throws Exception
{
if (args.length != 2)
{
throw new IllegalArgumentException("Usage java " + Indexer.class.getName()
+ "<index dir> <data dir>");
}
String indexDir = args[0];
String dataDir = args[1];
System.out.println("indexDir:" + indexDir);
System.out.println("dataDir:" + dataDir);
long start = System.currentTimeMillis();
Indexer indexer = new Indexer(indexDir);
int numIndexed;
try
{
numIndexed = indexer.index(dataDir, new TextFilesFilter());
}
finally
{
indexer.close();
}
long end = System.currentTimeMillis();
System.out.println("Indexing " + numIndexed + " files took " + (end - start)
+ " milliseconds");
}
}
package com.mitchz.lucence;

import java.io.File;
import java.io.IOException; import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; /**
* @author mitchz
* @version 1.0
* @since 2014年4月30日
* @category com.mitchz.lucence
*/
public class Searcher
{ public static void main(String args[]) throws IOException, ParseException
{
if (args.length != 2)
{
throw new IllegalArgumentException("Usage java " + Searcher.class.getName()
+ "<index dir> <query>");
}
String indexDir = args[0];
String q = args[1];
search(indexDir, q);
} public static void search(String indexDir, String q) throws IOException,
ParseException
{
Directory dir = FSDirectory.open(new File(indexDir));
DirectoryReader dirReader = DirectoryReader.open(dir);
IndexSearcher is = new IndexSearcher(dirReader);
QueryParser parser = new QueryParser(Version.LUCENE_47, "contents",
new SimpleAnalyzer(Version.LUCENE_47));
Query query = parser.parse(q);
long start = System.currentTimeMillis();
TopDocs hits = is.search(query, 10);
long end = System.currentTimeMillis();
System.out.println("Found " + hits.totalHits + " document(s) (in "
+ (end - start) + " milliseconds) that matched query '" + q + "':");
for (ScoreDoc scoreDoc : hits.scoreDocs)
{
Document doc = is.doc(scoreDoc.doc);
System.out.println(doc.get("filename"));
}
}
}

maven的配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.mitchz</groupId>
<artifactId>lucence-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>lucence-test</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>4.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.7.0</version>
</dependency>
</dependencies>
</project>

初识lucene的更多相关文章

  1. 初识Lucene.net

    最近想提高下自己的能力,也是由于自己的项目中需要用到Lucene,所以开始接触这门富有挑战又充满新奇的技术.. 刚刚开始,只是写了个小小的demo,用了用lucene,确实很好   创建索引 Data ...

  2. 初识 Lucene

    Lucene是一个信息检索工具库,而不是一个完整的搜索程序 搜索程序 Lucene索引核心类 Lucene索引核心类: Document: 文档对象代表一些域(field)的集合 Field: 每个文 ...

  3. 第一章 初识Lucene

    多看几遍,慢就是快 1.1 应对信息爆炸 1.2 Lucene 是什么 1.2.1 Lucene 能做些什么 1.2.2 Lucene 的历史 1.3 Lucene 和搜索程序组件 基本概念 索引操作 ...

  4. 初识lucene(想看代码的跳过)

    最早是在百度贴吧里看到的lucene这个名称,只知道跟搜索引擎有关,因为工作中一直以来没有类似的需求,所以没有花时间学习这方面的知识. 刚过完年,公司不忙,自己闲不住把<Netty权威指南> ...

  5. 1. 初识 Lucene

    在学习Lucene之前呢,我们当然首先要了解下什么是Lucene. 0x01 什么是Lucene ? Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供. Lu ...

  6. (转)初识 Lucene

    Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家族中的一个开源项目. ...

  7. 实战 Lucene,第 1 部分: 初识 Lucene (zhuan)

    http://www.ibm.com/developerworks/cn/Java/j-lo-lucene1/ ******************************************** ...

  8. 搜索引擎学习(一)初识Lucene

    一.Lucene相关基础概念 定义:一个简易的工具包,实现文件搜索的功能,支持中文,关键字,多条件查询,凡是文件名或文件内容包含的都查出来. 数据分类:结构化数据(固定格式或有限长度的数据)和非结构化 ...

  9. 【转载】Lucene.Net入门教程及示例

    本人看到这篇非常不错的Lucene.Net入门基础教程,就转载分享一下给大家来学习,希望大家在工作实践中可以用到. 一.简单的例子 //索引Private void Index(){    Index ...

随机推荐

  1. BOT、BT、PPP形式介绍(1)

    BOT.BT.PPP形式介绍 BOT1.什么是BOT     BOT是英文Build-Operate-Transfer的缩写,即“建设-经营-转让”.实质上是基础设施投资.建设和经营的一种方式,以政府 ...

  2. Firefox历史版本下载

    http://ftp.mozilla.org/pub/firefox/releases/ http://ftp.mozilla.org/pub/firefox/releases/47.0.1/

  3. 企业生产环境中linux系统分区的几种方案

    方案1:针对网站集群架构中的某个节点服务器分区 该服务器上的数据有多份(其他节点也有)且数据不太重要,建议分区方案如下: /boot: 200MB swap: 物理内存的1.5倍,当内存大于或等于8G ...

  4. (转)iOS Wow体验 - 第二章 - iOS用户体验解析(2)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第二章译文精选的第二部分,其余章节将陆续放出.上一 ...

  5. oracle数据库常用查询一

    oracle数据库常用查询一 sqlplus / as sysdba; 或sqlplus sys/密码 as sysdba;两者都是以sys登录.conn scott/tiger@orcl; conn ...

  6. 关于sed的应用

    公司让我做一个看一下在优化的程序和比原来的程序快多少,但是文件还在运行的服务器上,我需要把用到的文件复制到测试服务器上去.但是测试服务器上有的,目录不全,会导致scp出错.就发生了以下的故事. 首选我 ...

  7. css3 tranform  transition animation

    tranform:对象图形变形 tranform的属性包括:   1.none 表示不进行变换:   2.rotate 旋转            transform:rotate(20deg) 旋转 ...

  8. cookie 的Domain删除失败的问题

    最近接手一个老项目,项目中使用的是cookie来做的处理的,新增的时候cookie添加了域, 但是删除的时候没有添加域,导致删除cookie的时候一直失败!还有cookie的创建与删除,应该都必需经过 ...

  9. Java数据结构漫谈-Vector

    List除了ArrayList和LinkedList之外,还有一个最常用的就是Vector. Vector在中文的翻译是矢量,向量,所以大家喜欢把Vector叫做矢量数组,或者向量数组. 其实就底层实 ...

  10. Android AsyncTask学习

    Android程序有UI进程和后台进程,在执行一些耗时的操作时,如果在UI进程中,很可能出现假死的情况,用户体验会受到影响,因此,那些耗时进程往往就放在了后台进程中,用户体验能更好一些.网络情况不稳定 ...