1、内存索引库
2、文件索引库和内存索引库的合并
3、可以利用indexWriter.addIndexesNoOptimize方法把很多个索引库合并在一起
1:创建内存索引库
实现:
RAMDirectory directory = new RAMDirectory();
创建索引库后其他操作与操作普通数据库的原理和流程都是一样的。
IndexWriter indexWriter = new IndexWriter(directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);只不过在建立流对象时,注意别放错索引库即可。
2:把文件索引库和内存索引库合并
1、当程序运行的时候,把文件索引库的内容复制到内存索引库一份
2、让应用程序和内存索引库进行交互
3、把内存索引库的内容复制到文件索引库中
实现:
Directory ramDirectory = new RAMDirectory(Filedirectory);
在创建内存索引库时,直接利用构造函数将一个文件索引库以参数传入,就会建立起内存索引库和文件索引库之间的关联。
//创建indexWriter操作内存索引库
IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
//创建indexWriter操作文件索引库
IndexWriter fileIndexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);
注意:创建fileIdexWriter时,在analyzer参数后跟了一个true,代表当同步数据时,更新覆盖原有数据。
/**
* 把内存索引库的内容合并到文件索引库中
*/
fileIndexWriter.addIndexesNoOptimize(ramDirectory);
此方法可以加入的不止是内存索引库,还具备其他参数可以加入,专门用来合并数据时使用。
完整代码:
@Test
public void testRamDirectoryAndFileDirectory() throws Exception{
Directory ramDirectory = new RAMDirectory(LuceneUtils.directory);
IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
IndexWriter fileIndexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);
Article article = new Article();
article.setId(1L);
article.setTitle("lucene可以做搜索引擎");
article.setContent("baidu,google是很好的搜索引擎");
ramIndexWriter.addDocument(DocumentUtils.article2Document(article));
ramIndexWriter.close();
fileIndexWriter.addIndexesNoOptimize(ramDirectory);
fileIndexWriter.close();
this.testSeacherIndex(LuceneUtils.directory);
}
分词器:
1、切分关键词
2、去掉停用词
3、把大写转化成小写
实现方法:
String s = "Creates a searcher searching the index in the named directory";
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
this.testAnalyzer(analyzer, s);
Apache提供的对中文的分词器,一种是单字分词,一种是二分分词,都不适合,知道即可。
1.Analyzer analyzer = new ChineseAnalyzer();
2. new CJKAnalyzer(Version.LUCENE_30);
IK分词器是针对中文的分词器:
使用该分词器需要导入jar包:IKAnalyzer3.2.0Stable.jar
创建IK分词器对象:Analyzer analyzer = new IKAnalyzer();
该分词器最好的地方在于 可以自定义 词库:
操作方法:
1、 将IKAnalyzer.cfg.xml和ext_stopword.dic拷贝进工程的src目录下。
2、 然后建一个自定义 词库:这里以mydict.dic为例,然后在该词库中添加自定义的内容,即可。
3、 在IKAnalyzer.cfg.xml中配置访问自定义词库的路径:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<entry key="ext_dict">/mydict.dic;</entry> //这里配置的是自定义分词词库的访问路径。
<entry key="ext_stopwords">/ext_stopword.dic</entry>//这里定义的是过滤掉的分词器词库的访问路径
</properties>
完成以上操作即可实现自定义分词的效果了。需要注意的是,这几个文件必须是utf-8的编码形式。