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. 解决android4.0系统中菜单(Menu)添加Icon无效问题

    本文转载自: http://blog.csdn.net/stevenhu_223/article/details/9705173 在Android4.0系统中,创建菜单Menu,通过setIcon方法 ...

  2. Windows下编译eXosip、osip,以及UAC和UAS的例子

    今天开始了SIP开源库的学习,我选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,最后终于编译成功! ...

  3. FreeBSD简单配置SSH并用root远程登陆方法

    FreeBSD简单配置SSH并用root远程登陆方法 前言:最近下载了FreeBSD,在虚拟机上安装,第一步先要开启SSH服务,用终端putty软件可以实现在windows系统进行远程管理, 初级 = ...

  4. ajax提交写法

    <script> /* ajax提交写法 */ function add_prize() { // var query={}; var query = new Object(); quer ...

  5. IOS uitableviewcell 向左滑动删除编辑等

    主要实现这个方法就好了 -(NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActions ...

  6. java bootstrap分页

    样式如下 datumMap.total总共多少页 datumMap.page第几页 <nav class="pull-right"> <ul class=&quo ...

  7. ServletRequest中getReader()和getInputStream()只能调用一次的解决办法(转)

    原文地址:http://liwx2000.iteye.com/blog/1542431 原文作者:liwx2000 为了提高项目安全性,拦截非法访问,要给项目增加了一个过滤器,拦截所有的请求,校验是否 ...

  8. Stm32高级定时器(四)

    Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...

  9. (转)Javascript面向对象编程(三):非构造函数的继承(作者:阮一峰)

    不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese = { na ...

  10. (转)android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下       首先客户端从服务器端获取json数据 1.利用HttpUrlConnection   复制代码 ...