一:向索引库添加文档
1、步骤:
a、使用IndexWriter打开索引库
b、创建一个Document对象
c、向Document中添加field
d、把文档对象添加到索引库
e、提交
f、关闭IndexWriter对象
2、代码实现
@Test
public void addDocument() throws Exception {
// 1)使用IndexWriter打开索引库
indexWriter = new IndexWriter(FSDirectory.open(new File("D:/temp/JavaEE49/index")),
new IndexWriterConfig(Version.LATEST, new IKAnalyzer()));
// 2)创建一个Document对象
Document document = new Document();
// 3)向Document中添加field
Field name = new TextField("name", "新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa apache", Store.YES);
name.setBoost(10f);
document.add( name);
document.add(new TextField("name1", "新添加的文档1", Store.YES));
document.add(new TextField("name2", "新添加的文档2", Store.YES));
// 4)把文档对象添加到索引库
indexWriter.addDocument(document);
// 5)提交
indexWriter.commit();
// 6)关闭IndexWriter对象
indexWriter.close();
}
二:删除文档
1、删除全部文档
使用IndexWriter的deleteAll方法:此方法慎用!!!
@Test
public void deleteAllDocument() throws Exception {
indexWriter = new IndexWriter(FSDirectory.open(new File("D:/temp/JavaEE49/index")),
new IndexWriterConfig(Version.LATEST, new IKAnalyzer()));
//删除全部文档
indexWriter.deleteAll();
//提交修改
indexWriter.commit();
indexWriter.close();
}
2、根据查询删除,查询到多少文档就删除多少文档
@Test
public void deleteDocumentByQuery() throws Exception {
// 使用IndexWriter打开索引库
indexWriter = new IndexWriter(FSDirectory.open(new File("D:/temp/JavaEE49/index")),
new IndexWriterConfig(Version.LATEST, new IKAnalyzer()));
//参数就是查询条件
Query query = new TermQuery(new Term("name", "apache"));
indexWriter.deleteDocuments(query);
//提交修改
indexWriter.commit();
indexWriter.close();
三:修改文档
本质上是先删除,再添加
@Test
public void updateDocument() throws Exception {
// 使用IndexWriter打开索引库
indexWriter = new IndexWriter(FSDirectory.open(new File("D:/temp/JavaEE49/index")),
new IndexWriterConfig(Version.LATEST, new IKAnalyzer()));
//创建一个新的Document
Document doc = new Document();
doc.add(new TextField("name", "更新后的文档1", Store.YES));
doc.add(new TextField("content", "更新后的文档1内容", Store.YES));
doc.add(new TextField("name1", "更新后的文档1", Store.YES));
indexWriter.updateDocument(new Term("name", "spring"), doc);
//提交修改
indexWriter.commit();
indexWriter.close();
}
四:索引库的查询
1、使用Query的子类进行查询:
☯TermQuery:
步骤:
(1)、创建IndexReader对象
(2)、创建IndexSearcher对象
(3)、创建一个Query对象
(4)、执行查询,得到TopDocs对象
(5)、遍历文档列表
(6)、根据Id获取文档对象
(7)、从文档对象中取出Field
(8)、关闭IndexReader对象
代码实现:
private void searchResult(Query query) throws Exception {
// 1)创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:/temp/JavaEE49/index")));
// 2)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)执行查询,得到TopDocs对象
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果的总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 4)遍历文档列表
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
// 5)根据id取文档对象
Document document = indexSearcher.doc(doc);
// 6)从文档对象中取Field
System.out.println(document.get("name"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
// 7)关闭IndexReader对象
indexReader.close();
}
@Test
public void testTermQuery() throws Exception {
// 3)创建一个Query对象
Query query = new TermQuery(new Term("content", "apache"));
System.out.println(query);
searchResult(query);
}
☯MatchAllDocsQuery:查询全部文档
private void searchResult(Query query) throws Exception {
// 1)创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:/temp/JavaEE49/index")));
// 2)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)执行查询,得到TopDocs对象
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果的总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 4)遍历文档列表
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
// 5)根据id取文档对象
Document document = indexSearcher.doc(doc);
// 6)从文档对象中取Field
System.out.println(document.get("name"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
// 7)关闭IndexReader对象
indexReader.close();
}
@Test
public void testMatchAllDocsQuery() throws Exception {
Query query = new MatchAllDocsQuery();
System.out.println(query);
searchResult(query);
}
☯NumericRangeQuery:数值范围区间查询
private void searchResult(Query query) throws Exception {
// 1)创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:/temp/JavaEE49/index")));
// 2)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)执行查询,得到TopDocs对象
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果的总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 4)遍历文档列表
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
// 5)根据id取文档对象
Document document = indexSearcher.doc(doc);
// 6)从文档对象中取Field
System.out.println(document.get("name"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
// 7)关闭IndexReader对象
indexReader.close();
}
@Test
public void testNumericRangeQuery() throws Exception {
//参数1:要搜索的域的名称 参数2:最小值 参数3:最大值 参数4:是否包含最小值 参数5:是否包含最大值
Query query = NumericRangeQuery.newLongRange("size", 1000l, 10000l, false, false);
System.out.println(query);
searchResult(query);
}
☯BooleanQuery:多条件查询,可以有无数个条件
☠ Occur.MUST ==> 相当于AND条件
☠ Occur.SHOULD ==> 相当于OR条件
☠ Occur.MUST_NOT ==> 相当于NOT条件,如果所有条件都是MUST_NOT,则没有查询结果
private void searchResult(Query query) throws Exception {
// 1)创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:/temp/JavaEE49/index")));
// 2)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)执行查询,得到TopDocs对象
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果的总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 4)遍历文档列表
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
// 5)根据id取文档对象
Document document = indexSearcher.doc(doc);
// 6)从文档对象中取Field
System.out.println(document.get("name"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
// 7)关闭IndexReader对象
indexReader.close();
}
@Test
public void testBooleanQuery() throws Exception {
BooleanQuery query = new BooleanQuery();
//条件1
Query query1 = new TermQuery(new Term("content", "apache"));
//条件2
Query query2 = NumericRangeQuery.newLongRange("size", 1000l, 10000l, true, true);
//添加查询条件
query.add(query1, Occur.SHOULD);
query.add(query2, Occur.MUST_NOT);
System.out.println(query);
searchResult(query);
}
2、使用QueryParser查询:带分词的查询
(1)、需要添加jar包:(2)、代码查询
private void searchResult(Query query) throws Exception {
// 1)创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:/temp/JavaEE49/index")));
// 2)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)执行查询,得到TopDocs对象
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果的总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 4)遍历文档列表
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
// 5)根据id取文档对象
Document document = indexSearcher.doc(doc);
// 6)从文档对象中取Field
System.out.println(document.get("name"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
// 7)关闭IndexReader对象
indexReader.close();
}
@Test
public void testQueryParser() throws Exception {
// a.创建一个QueryParser对象,需要两个参数1:默认搜索域 2:分析器对象
QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
// b.使用QueryParser创建一个Query对象。
//参数就是查询条件
//Query query = queryParser.parse("lucene是一个基于java开发全文检索工具包");
Query query = queryParser.parse("name:apache");//指定在哪个域上进行查询,此处是name域
System.out.println(query);
// c.执行查询
searchResult(query);
}
3、MultiFieldQueryParser:可以指定多个默认搜索域的QueryParser
private void searchResult(Query query) throws Exception {
// 1)创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:/temp/JavaEE49/index")));
// 2)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)执行查询,得到TopDocs对象
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果的总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 4)遍历文档列表
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
// 5)根据id取文档对象
Document document = indexSearcher.doc(doc);
// 6)从文档对象中取Field
System.out.println(document.get("name"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
// 7)关闭IndexReader对象
indexReader.close();
}
@Test
public void testMultiFieldQueryParser() throws Exception {
String[] fields = {"name","content"};//创建默认搜索域的数组
//参数1:指定默认搜索域数组 参数2:分析器对象
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
Query query = queryParser.parse("lucene是一个基于java开发全文检索工具包");
System.out.println(query);
searchResult(query);
}
4、lucene的查询语法
(1)、域名:关键词 在指定的域中根据关键词进行查询 例如:name:spring
(2)、*:* 查询索引库中的全部文档
(3)、域名:[最小值 TO 最大值] 范围查询,其中 TO 必须是大写 例如:size:[1000 TO 10000] 【】:包含临界值 {}:不包含临界值
注意:数值范围查询在lucene中是不支持查询语法的,可以使用范围查询语法查询字符串类型,在lucene中如果是数值范围的查询应该使用NumericRangeQuery
(4)、组合条件查询
如果条件前带“+”号 相当于 Occur.MUST ==> 例如:name:spring AND content:mvc
如果没有任何符号 相当于 Occur.SHOULD ==> 例如:name:spring content:mvc
如果条件带有“-”号 相当于 Occur.MUST_NOT ==> 例如:NOT name:spring content:mvc (从content为mvc的结果中把name为spring的去掉)
5、添加文档时设置权重:使用setBoot()属性设置
@Test
public void addDocument() throws Exception {
// 1)使用IndexWriter打开索引库
// 2)创建一个Document对象
Document document = new Document();
// 3)向Document中添加field
Field name = new TextField("name", "新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档新添加的文档aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa apache", Store.YES);
name.setBoost(10f);//给新添加的文档设置权重,权重越大,排名越靠前
document.add( name);
document.add(new TextField("name1", "新添加的文档1", Store.YES));
document.add(new TextField("name2", "新添加的文档2", Store.YES));
// 4)把文档对象添加到索引库
indexWriter.addDocument(document);
// 5)提交
indexWriter.commit();
// 6)关闭IndexWriter对象
indexWriter.close();
}