Lucene 7.1.0 相比以前的版本, 代码发生了一些变化, 如果还按照以前的写法的话, 代码已经不能正常运行了.
在这里, 给大家整理了一下新版本的基本功能的代码, 希望对大家有所帮助!
- 创建索引库
//1.指定索引存放的路径
Path path = Paths.get("C:/index");
//2.获取索引文件夹对象
FSDirectory dir = FSDirectory.open(path);
//3.创建分析器对象
Analyzer analyzer = new IKAnalyzer();//中文分析器
//4.创建索引配置对象
IndexWriterConfig config = new IndexWriterConfig(analyzer);
//5.创建索引写出对象
IndexWriter writer = new IndexWriter(dir, config);
//6.指定一个文件夹, 获取它的内容, 把它的指定内容写到索引库中
File srcDir = new File("C:/gongxm/Mozilla Firefox");
//遍历文件夹, 获取到文件夹中的内容
File[] files = srcDir.listFiles();
for (File file : files) {
//获取到文件的名字
String name = file.getName();
//获取到文件的绝对路径
String absolutePath = file.getAbsolutePath();
//获取到文件的大小
long length = file.length();
//创建一个文档对象
Document doc = new Document();
//创建域对象, 存放需要写到索引库中的内容
TextField nameField = new TextField("name", name,Store.YES);
TextField absolutePathField = new TextField("absolutePath", absolutePath,Store.YES);
StoredField lengthField = new StoredField("lengthField", length);
//把域对象存到文档对象中
doc.add(nameField);
doc.add(absolutePathField);
doc.add(lengthField);
//把文档对象写到索引库中
writer.addDocument(doc);
}
//关闭索引写出对象
writer.close();
System.out.println("索引库创建完成!");
- 查询索引库
//1.指定索引存放的路径
Path path = Paths.get("C:/index");
//2.获取索引文件夹对象
FSDirectory dir = FSDirectory.open(path);
//3.获取索引读取对象
IndexReader reader = DirectoryReader.open(dir);
//4.创建索引搜索对象
IndexSearcher searcher = new IndexSearcher(reader);
//5.创建查询对象
Query query = new MatchAllDocsQuery();//查询所有内容
//6.获取到搜索结果
TopDocs topDocs = searcher.search(query, 100);
//7.获取结果数量
long totalHits = topDocs.totalHits;
System.out.println("一共搜索到"+totalHits+"条结果!");
//8.遍历一下, 看看搜索到的结果是什么内容
if(totalHits>0) {
//取出搜索结果的信息数组
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//遍历数组, 获取到每条记录的信息
for (ScoreDoc scoreDoc : scoreDocs) {
//取出搜索结果文档的ID
int id = scoreDoc.doc;
//根据ID获取到对应的文档对象
Document doc = reader.document(id);
//查看文档对象的内容
System.out.println("name:"+doc.get("name"));
System.out.println("absolutePath:"+doc.get("absolutePath"));
System.out.println("length:"+doc.get("length"));
}
}
- 常用的查询对象
查询的时候基本上就是以上的逻辑, 其他的查询, 就是创建的查询的对象不一样, 所以, 只需要把上面的代码中的查询对象改变一下即可, 以下举例一些常用的查询对象:
1. 多条件查询
BooleanQuery.Builder builder = new Builder();
builder.add(query1, Occur.MUST); // 必须: AND
builder.add(query2, Occur.MUST_NOT);// 不是: NOT
builder.add(query3, Occur.SHOULD);// 应该: OR
BooleanQuery query = builder.build();
2.字符串范围查询: name的长度在1~20000之间的, 不包含1, 包含20000
TermRangeQuery query = new TermRangeQuery("name", new BytesRef("1"), new BytesRef("20000"), false, true);
3.前缀查询: 查询name域中以de开头的所有内容
PrefixQuery query = new PrefixQuery(new Term("name", "de"));
4.关键词查询:
/**
* 所谓PhraseQuery,就是通过短语来检索,比如我想查“big car”这个短语,
* 那么如果待匹配的document的指定项里包含了"big car"这个短语,
* 这个document就算匹配成功。可如果待匹配的句子里包含的是“big black car”,
* 那么就无法匹配成功了,如果也想让这个匹配,就需要设定slop,
* 先给出slop的概念:slop是指两个项的位置之间允许的最大间隔距离
* @throws Exception
*/
第一种写法:
PhraseQuery.Builder builder = new PhraseQuery.Builder();
builder.add(new Term("name", "api"));
builder.add(new Term("name", "core"));
builder.setSlop(50);
PhraseQuery query = builder.build();
第二种写法:
PhraseQuery query = new PhraseQuery(50, "name", new String[]{"api","core"});
5.模糊查询: 可以查询相近的关键词
FuzzyQuery query = new FuzzyQuery(new Term("name", "api"));
6.通配符查询: ?代表一个字符, *代表0~多个字符
WildcardQuery query = new WildcardQuery(new Term("name", "ap*i"));
7.分词搜索: 把要搜索的内容进行分词再搜索!
IKAnalyzer ikAnalyzer = new IKAnalyzer(); //中文分析器
QueryParser parser = new QueryParser("name", ikAnalyzer);//进行分词
Query query = parser.parse("api文档"); //生成查询对象