因项目原因接触到了solr,感觉全文检索满神奇的,计算机的搜索文件功能应该都用过,非常慢.lucene建立一个索引库,而索引检索是非常快的.
假设文件系统,某个目录下有n个文件,每个文件有不同的文件名,文件大小,文件路径,文件内容.现在需要从这些分类中查找一个关键词,假设文件系统是遍历的方式每个文件都去查一下这个关键词,这是很慢的,每个document都有唯一的id,也都有上述的4种属性(field),读取每个document,按需求去分析它的每个文件名,路径,文件内容,将(field:词汇)作为一个Term,假设需要建立索引的目录下有《诗经》《诗经解读》两个文件,两个文档的id分别是1,2,这个field的属性名叫fileName,那么分析后的结果如下:
Term->fileName:文件名 -> document的id
Term->fileName:诗经 -> 1,2
Term->fileName:解析 -> 2
这样当你检索:fileName:诗经.就可以快速定位到文档1和文档2了.
第一次使用的时最新的lucene版本7.5.0,建立索引时进行debug时正常的编码,没有乱码,然后查询时打印出来的中文都是乱码,最后换成低版本的4.10.4就正常了,新版本不应该最稳定,bug较少吗???
创建索引步骤
1.创建一个IndexWriter对象
a).指定索引库的存放位置
b).指定一个分析器,对文档内容进行分析
2.创建document对象
3.创建field对象,将field对象添加到document对象中,
4.使用IndexWriter对象,将document对象写入索引库,此过程进行索引创建,并将索引和document对象写入索引库
5.关闭IndexWriter对象
Field域的属性:
1.是否分析:是否对域内容进行分词处理,如果我们需要对该域进行索引查询,那么需要进行分析
2:是否索引:将Field分析后的词或整个field值进行索引,只有索引才可以通过索引查询到,比如:文件名,商品名,而价格,身份证号这类不需要分析,但是需要索引
3.是否存储:进行Field值存储到文档中,存储到到文档中的field才可以从document中获取,比如:商品名称,订单号,
public class FirstLucene {
@Test
public void testIndex() {
try {
//保存索引的位置
File indexRepository = new File("D:\\project\\temp\\index");
Path path = indexRepository.toPath();
Directory directory = FSDirectory.open(path);
//标准分词器
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory,config);
//需要分析的文件目录 ,注意目录下不能用文件夹
File files = new File("D:\\project\\python\\demo\\pydemo");
File[] listFiles = files.listFiles();
for(File file : listFiles){
Document document = new Document();
//文件名称
String fileName = file.getName();
Field fileNameField = new TextField("fileName",fileName, Field.Store.YES);
//文件大小
long size = FileUtils.sizeOf(file);
Field sizeField = new DoubleDocValuesField("size",size);
//文件路径
String filePath = file.getPath();
Field pathField = new StoredField("path",filePath);
//文件内容
String file_content = FileUtils.readFileToString(file, "gb2312");
Field fileContentFiled = new TextField("fileContent",file_content, Field.Store.YES);
document.add(fileNameField);
document.add(sizeField);
document.add(pathField);
document.add(fileContentFiled);
writer.addDocument(document);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
以上就是索引创建过程,初次接触,请各位大佬指教
ps:1024节快乐,永远不秃,没有bug,都有女朋友.