1.2 数据库like查询和全文检索的区别
1.2.1 结构化数据和非结构化数据
数据库中存储的数据是结构化数据,即行数据java,可以用二维表结构来逻辑表达实现的数据。不方便用数据库二维逻辑表来表现的数据即称为非结构化数据,包括所有格式的办公文档、文本、图片、标准通用标记语言下的子集XML、HTML、各类报表、图像和音频/视频信息等等。
? 结构化数据:指具有固定格式或有限长度的数据,如数据库元数据等。
? 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。
? 半结构数据:就是介于完全结构化数据(如关系型数据库、面向对象数据库中的数据)和完全无结构的数据(如声音、图像文件等)之间的数据,HTML、XML文档就属于半结构化数据,数据的结构和内容混在一起,没有明显的区分。
1.入门
导入jar包
lucene-core-7.4.0.jar
lucene-analyzers-common-7.4.0.jar
IK-Analyzer-1.0-SNAPSHOT.jar 中文分析器
commons-io-2.6.jar 读取文件的工具类
lucene-queryparser-7.4.0.jar queryParser需要的jar包
2.创建索引
//选择索引库存放位置 FSDirectory 存储在硬盘中 RAMDirectory存储在内存中
Directory directory = FSDirectory.open(new File("").toPath());
//创建索引库配置 并且使用IKAnalyzer 中文分析器
IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
//创建索引库
IndexWriter writer = new IndexWriter(directory,config);
//读取文件信息
File f = new File("");
for (File file : f.listFiles()) {
//文件路径
String path = file.getPath();
//文件名
String name = file.getName();
//文件大小
long size = FileUtils.sizeOf(file);
//读取文件里面的内容,utf-8编码
String content = FileUtils.readFileToString(file, "utf-8");
//将获取的信息放入域中
Field fieldName = new TextField("name",name,Field.Store.YES);
Field fieldPath = new TextField("path",path,Field.Store.YES);
Field fieldSizeValue = new LongPoint("size",size);
Field fieldSizeStore = new StoredField("size",size);
Field fieldContent = new TextField("content",content,Field.Store.YES);
//将域存入到document中
Document document = new Document();
document.add(fieldName);
document.add(fieldPath);
document.add(fieldSizeValue);
document.add(fieldSizeStore);
document.add(fieldContent);
}
//关闭流
writer.close();
3.查询索引
//读取索引库
IndexReader reader = DirectoryReader.open(directory);
//创建indexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(reader);
/**
* 三种查询方式
* 1.通过term 关键字查询 TermQuery
* 2.通过LongPoint进行范围查询
* 3.通过QueryParser查询
*/
//Query query = new TermQuery(new Term("name","spring"));
//Query query = LongPoint.newRangeQuery("size",0L,100L);
QueryParser queryParser = new QueryParser("name",new IKAnalyzer());
Query query = queryParser.parse("spring,");
//第一个放query对象,第二个参数是查询多少个
TopDocs topDocs = indexSearcher.search(query, 10);
//topDocs.totalHits 总结果数
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
//获取document的id查询document对象
Document document = reader.document(scoreDoc.doc);
//查询对应域的值
System.out.println(document.get("name"));
}
//关流
reader.close();
默认分析器的使用,中文分析器IKAnalyzer
//默认的分析器
Analyzer analyzer = new StandardAnalyzer();
TokenStream tokenStream = analyzer.tokenStream("name", "spring mybatis springmvc");
//像TokenStream中设置一个引用,相当于指针
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
while (tokenStream.incrementToken()) {
System.out.println(charTermAttribute);
}
analyzer.close();
骑着猪区见上帝
发布了23 篇原创文章 · 获赞 0 · 访问量 305
私信
关注