Lucene常识:
Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索
IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。IndexWriter是用来读写索引的类,单幷不是唯一用来修改索引的类。
Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。搜索不是大小写敏感的。
Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。RAMDirectory适合于你需要快速访问索引的情况, 不管是索引或搜索
Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。Lucene只是用来处理文本,其核心是处理java.lang.String和java.io.Reader。创建索引的过程:找出每一个文本文件,创建Document对象实例,用Field组装它,幷把这个Document对象添加到索引中。
Field:字段。
IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;可以将这个类理解为以只读方式打来索引的类
Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。
QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。
Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。
Term:
TermQuery:
几个知识点:
1、索引格式
有两种:
一种是除了配置文件外,每一个Document成为一个独立的文件
另一种是全部的Document成为一个文件,这种属于复合模式
2、索引文件可放的位置:
索引可以存放在两个地方1.硬盘,2.内存
放在硬盘上可以用FSDirectory(),放在内存的用RAMDirectory()不过一关机就没了
FSDirectory.getDirectory(File file, boolean create)
FSDirectory.getDirectory(String path, boolean create)
两个工厂方法返回目录
New RAMDirectory()就直接可以
再和
IndexWriter(Directory d, Analyzer a, boolean create)
一配合就行了
如:
IndexWrtier indexWriter = new IndexWriter(FSDirectory.getDirectory(“c://index”, true ), new StandardAnlyazer(), true );
IndexWrtier indexWriter = new IndexWriter( new RAMDirectory(), new StandardAnlyazer(), true );
3、索引的合并
这个可用
IndexWriter.addIndexes(Directory[] dirs)
注意:合并的时候一定要将被合并的那一方的IndexWriter的close()方法调用。
4、对索引的其它操作:
IndexReader类是用来操作索引的,它有对Document,Field的删除等操作。
前辈的建议:
1、lucene的索引不能太大,要不然效率会很低。大于1G的时候就必须考虑分布索引的问题
2、不建议用多线程来建索引,产生的互锁问题很麻烦。经常发现索引被lock,无法重新建立的情况
3、中文分词是个大问题,目前免费的分词效果都很差。如果有能力还是自己实现一个分词模块,用最短路径的切分方法,网上有教材和demo源码,可以参考。
4、建增量索引的时候很耗cpu,在访问量大的时候会导致cpu的idle为0
5、默认的评分机制不太合理,需要根据自己的业务定制
理解Lucene核心索引类:
IndexWriter、Directory、Analyzer、Document、Field
理解Lucene核心搜索类:
IndexSearcher、Term、TermQuery、Hits