默认分析器
查看之前代码,在new IndexWriterConfig()
的时候没有指定分析器就调用了默认的分析器StandardAnalyzer
,默认的标准的分析器就是对每个单词以空格进行拆分,而对于汉字就把每个汉字都拆分开为一个一个的字符。
IndexWriterConfig config = new IndexWriterConfig();
IndexWriter indexWriter = new IndexWriter(directory, config);
下面来写一段代码看看默认的分析器分词后的效果:
//1、创建一个Director对象,指定索引库保存的位置。
//把索引库保存在内存中
//Directory directory = new RAMDirectory();
//把索引库保存在磁盘
Directory directory = FSDirectory.open(new File("E:\\教程\\01-lucene\\02.参考资料\\index").toPath());
//2、基于Directory对象创建一个IndexWriter对象
IndexWriterConfig config = new IndexWriterConfig();
IndexWriter indexWriter = new IndexWriter(directory, config);
//3、读取磁盘上的文件,对应每个文件创建一个文档对象。
File dir = new File("E:\\教程\\01-lucene\\02.参考资料\\searchsource");
File[] files = dir.listFiles();
for (File f : files) {
//取文件名
String fileName = f.getName();
//文件的路径
String filePath = f.getPath();
//文件的内容
String fileContent = FileUtils.readFileToString(f, "utf-8");
//文件的大小
long fileSize = FileUtils.sizeOf(f);
//创建Field
//参数1:域的名称,参数2:域的内容,参数3:是否存储
Field fieldName = new TextField("name", fileName, Field.Store.YES);
//Field fieldPath = new TextField("path", filePath, Field.Store.YES);
Field fieldPath = new StoredField("path", filePath);
Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
//Field fieldSize = new TextField("size", fileSize + "", Field.Store.YES);
Field fieldSizeValue = new LongPoint("size", fileSize);
Field fieldSizeStore = new StoredField("size", fileSize);
//创建文档对象
Document document = new Document();
//向文档对象中添加域
document.add(fieldName);
document.add(fieldPath);
document.add(fieldContent);
//document.add(fieldSize);
document.add(fieldSizeValue);
document.add(fieldSizeStore);
//5、把文档对象写入索引库
indexWriter.addDocument(document);
}
//6、关闭indexwriter对象
indexWriter.close();
}
中文分析器
Lucene自带中文分词器:
StandardAnalyzer
:单字分词:就是按照中文一个字一个字地进行分词。如:“我爱中国”,果:“我”、“爱”、“中”、“国”。SmartChineseAnalyzer
:对中文支持较好,但扩展性差,扩展词库,禁用词库和同义词库等不好处理
IKAnalyzer:
使用方法:
第一步:把jar
包添加到工程中
第二步:把配置文件和扩展词典和停用词词典添加到classpath
下
::: tip 注意
hotword.dic
和ext_stopword.dic
文件的格式为UTF-8
,注意是无BOM
的UTF-8
编码。
也就是说禁止使用windows
记事本编辑扩展词典文件
:::
修改之前的代码使用IK分析器:
//索引库存放路径
Directory directory = FSDirectory.open(new File("D:\\temp\\index").toPath());
IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
//创建一个indexwriter对象
IndexWriter indexWriter = new IndexWriter(directory, config//...