Lucene使用笔记

  本学期学习了做一个自己的Web搜索引擎,其中使用到了Lucene包,发现这个开源包简单易用,所以记录一下。

  首先是Lucene的索引结构:

从左往右看,是读索引的过程,从右往左看,则是构建索引的过程。

其中,所有中包含文档(Document)每篇文档中又包含(Field),field为自己设置的域。

先看创建索引过程吧:

1.创建Field

  Field field=new Field(Field名称,Field内容,存储方式,索引方式)

例如:   field=new Field("content",content,Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);

存储方式:

(1)Field.Store.NO为不存储,一般用于检索的文档的正文。

(2)Field.Store.YES完全存储,如标题可用完全存储。

(3)Field.Store.COMPRESS压缩存储,正文也可以用压缩存储。

索引方式:

(1)Field.Index.NO不索引

(2)Field.Index.NO_NORMS索引但不分析

(3)Field.Index.UN_TOKENIZED索引但不分词

(4)Field.Index.TOKENIZED分词并索引

2.创建Document

Document doc=new Document();(空Document)

doc.add(Field);

3.创建IndexWriter

IndexWriter writer=new IndexWriter(存储索引的路径,分析器的实例);

分析器实例:做词法分析的(StandardAnlyzer......)同时推荐大家IK-Analyzer。

通过IndexWriter联系逻辑索引和物理索引,在此创建的为空索引器,需要添加Document

writer.add(Document);

创建完成记得关闭writer.close();

FSDirectory是Lucene对文件系统的操作,有下面三个子类

1.SimpleFSDirectory  不能很好地支持多线程操作,要做到这一点必须在内部加入锁。

2.NIOFSDirectory  支持Windows外的多线程操作,在win上的性能较差。

3.MapDirectory  使用内存映射的I/O接口进行读写,支持多线程,但是消耗空间。

代码示例:

import java.io.File;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.apache.lucene.analysis.standard.StandardAnalyzer;

public class BasicIndexer {

public static void main(String[] args) throws java.io.IOException{
        // TODO Auto-generated method stub
        SimpleFSDirectory dir=new SimpleFSDirectory(new File("index"));
  
     IndexWriter writer=new IndexWriter(dir, new
IndexWriterConfig(Version.LUCENE_36, new
StandardAnalyzer(Version.LUCENE_36)));
        
        //该示例中有两个文档,即一个Document,包含两个Field
        //First doc
        Document doc=new Document();
        String title="I love China";
        Field field=new Field("title",title,Field.Store.YES,Field.Index.ANALYZED);
        doc.add(field);
        String content="I love you, China";
        field=new Field("content",content,Field.Store.YES,Field.Index.ANALYZED);
        doc.add(field);
        writer.addDocument(doc);
        
        //second doc
        doc=new Document();
        title="I love mom";
        field=new Field("title",title,Field.Store.YES,Field.Index.ANALYZED);
        doc.add(field);
        content="I love you, my mother";
        field=new Field("title",title,Field.Store.YES,Field.Index.ANALYZED);
        doc.add(field);
        writer.addDocument(doc);
        
        writer.close();
        System.out.println("Index Created!");
    }

}

到此索引便建立起来了。

接着便是执行搜索,以下为示例代码:

import java.io.File;

import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.SimpleFSDirectory;

public class BasicSearcher {

public static void main(String[] args) throws java.io.IOException{
        // TODO Auto-generated method stub
        SimpleFSDirectory indexPath=new SimpleFSDirectory(new File("index"));
        IndexReader reader=IndexReader.open(indexPath);
        IndexSearcher searcher=new IndexSearcher(reader);
        String searchField="content";//要执行搜索的Field
        String searchPhrase="汉语";//要搜索的内容
        
        
        Term t=new Term(searchField,searchPhrase);
        Query q=new TermQuery(t);

TopDocs tdc=searcher.search(q,5);
        ScoreDoc[] sdc=tdc.scoreDocs;
        System.out.println(tdc.totalHits);
        for(int i=0;i<sdc.length;i++)
        {
            int doc=sdc[i].doc;
            System.out.println(doc);
            System.out.println(reader.document(sdc[i].doc).get(searchField));
        }
        reader.close();
        searcher.close();
    }

}
在Lucene中还可以进行模糊查询等查询功能,同时也支持用户自定义的加权求文档向量空间得分。

这里向大家推荐Lucene3[1].0原理与代码分析,里面内容较为深入全面,小的也正是从中学习的,若有发现错误,还希望读者不惜赐教。

时间: 2024-11-03 22:51:39

Lucene使用笔记的相关文章

lucene学习笔记(三)

好几天没更新了.更新一下,方便自己和大家学习. 这是最基本的代码 package index; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document;

lucene学习笔记(二)

package index; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIn

Lucene学习笔记(1)

下载:http://lucene.apache.org lucene项目的Java子项目:http://lucene.apache.org/java Lucene学习笔记 查询者输入查询条件,条件之间可以通过特定运算符进行运算,比如查询希望查询到与“中国”和“北京”相关的记录,但不希望结果中包括“海淀区中关村”,于是输入条件为“中国+北京-海淀区中关村”: 把IndexWriter想象成让你可以对索引进行写操作的对象. 在一个文档被索引之前,首先需要对文档内容进行分词处理,并且而剔除一些冗余的词

Lucene学习笔记: 五,Lucene搜索过程解析

一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: IndexReader打开索引文件,读取并打开指向索引文件的流. 用户输入查询语句 将查询语句转换为查询对象Query对象树 构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分). 构造Scorer对象树,用于计算打分(T

Lucene学习笔记(一)

一.什么是lucene 官方的理解:全文检索首先是将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的,这种先建立索引,在根据索引搜索文档的过程叫做全文检索 自身理解:也就类似于使用字典的过程,而索引就是字典的索引目录,方便我们来查询汉字. Lucene是什么:Lucene是appache下的一个开源全文检索的引擎工具包,通过这个简单易用的工具包,可以快速开发全文检索应用. 全文检索应用:搜索引擎(例如:百度,谷歌).站内搜索(京东的商品搜索).文件搜索等. Lucen

Lucene学习笔记

师兄推荐我学习Lucene这门技术,用了两天时间,大概整理了一下相关知识点. 一.什么是Lucene Lucene即全文检索.全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置.当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程. 二.Lucece全文检索和数据库检索的区别 三.Lucene的原理 (1)索引库操作原理 注意:这里面有两个关键的对象:分别是IndexWriter和IndexSearcher. 执行增删改操作用的是

Lucene搜索笔记

Lucene的常用检索类: IndexSearcher :检索操作的核心组件,用于对 IndexWriter 创建的索引执行,只读的检索操作,工作模式为接收 Query 对象而返回 ScoreDoc对象. Term :检索的基本单元,标示检索的字段名称和检索对象的值,如Term( “title”, “lucene” ).即表示在 title 字段中搜寻关键词 lucene . Query:表示查询的抽象类,由相应的 Term 来标识. TermQuery :最基本的查询类型,用于匹配含有指定值字

lucene学习笔记二(基于数组的lucene检索,索引删除)

构建数组: private String[] ids = {"1","2","3","4","5","6"}; private String[] emails = {"[email protected]","[email protected]","[email protected]","[email protected

[lucene系列笔记1]lucene6的安装与配置(Windows系统)

lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载32的,如果是64位就下载64位的,否则不能兼容).下载之后解压到当前文件夹,双击安装JDK的可执行文件,按步骤和提示,一直点"下一步"完成安装,这里假设安装到目标文件C:\Program Files\Java\jdk1.8.0_25: 2.JDK安装完成后,需手动配置环境变量,右键&qu