1、删除全部索引
(1)删除索引前执行查询:
1.txt
null
null
E:\test\1.txt
1.txt
null
null
E:\test\1.txt
(2)执行删除索引的代码:
@Test
public void test() throws Exception {
//指定一个分析器,对文档内容进行分析。
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
//指定索引库的存放位置Directory对象,保存索引到内存中 (内存索引库)
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());
//创建一个indexwriter对象
IndexWriter indexWriter = new IndexWriter(directory, config);
indexWriter.deleteAll();
indexWriter.close();
}
(3)再次执行查询索引的代码,没有查询结果
2、根据条件删除
(1)创建并查询索引:
java a.txt
null
null
E:\test\java a.txt
java b.txt
null
null
E:\test\java b.txt
(2)执行根据条件删除索引的程序:
@Test
public void test() throws Exception {
//指定一个分析器,对文档内容进行分析。
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
//指定索引库的存放位置Directory对象,保存索引到内存中 (内存索引库)
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());
//创建一个indexwriter对象
IndexWriter indexWriter = new IndexWriter(directory, config);
Query query = new TermQuery(new Term("fileName","java"));
indexWriter.deleteDocuments(query);
indexWriter.close();
}
(3)再次查询索引,无查询结果
3、更新索引
@Test
public void testUpdate() throws Exception {
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());
IndexWriter indexWriter = new IndexWriter(directory, config);
Document doc = new Document();
doc.add(new TextField("test_update_name", "test_name.txt", Field.Store.YES));
indexWriter.updateDocument(new Term("fileName","java"),doc);
indexWriter.close();
}
先将文件名为java的索引删除,再将名为test_name.txt的索引添加进去。
4、查询所有
@Test
public void testSelect() throws IOException {
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());// 磁盘
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
Query query = new MatchAllDocsQuery();
System.out.println(query);
TopDocs topDocs = indexSearcher.search(query, 10);
//返回查询结果,遍历查询结果并输出
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
// 文件名称
String fileName = document.get("fileName");
System.out.println(fileName);
// 文件内容
String fileContent = document.get("fileContent");
System.out.println(fileContent);
// 文件大小
String fileSize = document.get("fileSize");
System.out.println(fileSize);
// 文件路径
String filePath = document.get("filePath");
System.out.println(filePath);
}
indexSearcher.getIndexReader().close();
}
查询结果:
*:*
001.txt
null
null
E:\test\001.txt
1.txt
null
null
E:\test\1.txt
2.txt
null
null
E:\test\2.txt
3.txt
null
null
E:\test\3.txt
abc.txt
null
null
E:\test\abc.txt
java.txt
null
null
E:\test\java.txt
js.txt
null
null
E:\test\js.txt
2.txt
null
null
E:\test\2.txt
3.txt
null
null
E:\test\3.txt
abc.txt
null
null
E:\test\abc.txt
5、根据数值范围查询
@Test
public void testSelect() throws IOException {
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());// 磁盘
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//false和true表示不包含47但是包含200
Query query = NumericRangeQuery.newLongRange("fileSize", 47L, 200L, false, true);
System.out.println(query);
TopDocs topDocs = indexSearcher.search(query, 10);
//返回查询结果,遍历查询结果并输出
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
// 文件名称
String fileName = document.get("fileName");
System.out.println(fileName);
// 文件内容
String fileContent = document.get("fileContent");
System.out.println(fileContent);
// 文件大小
String fileSize = document.get("fileSize");
System.out.println(fileSize);
// 文件路径
String filePath = document.get("filePath");
System.out.println(filePath);
}
indexSearcher.getIndexReader().close();
}
是根据fileSize域来查询的
6、组合查询
@Test
public void testSelect() throws Exception {
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());// 磁盘
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
Query query1 = new TermQuery(new Term("fileName","java"));
Query query2 = new TermQuery(new Term("fileName","a"));
// select * from user where id =1 or name = 'safdsa'
booleanQuery.add(query1, BooleanClause.Occur.MUST);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
TopDocs topDocs = indexSearcher.search(booleanQuery.build(), 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
// 文件名称
String fileName = document.get("fileName");
System.out.println(fileName);
// 文件内容
String fileContent = document.get("fileContent");
System.out.println(fileContent);
// 文件大小
String fileSize = document.get("fileSize");
System.out.println(fileSize);
// 文件路径
String filePath = document.get("filePath");
System.out.println(filePath);
}
indexSearcher.getIndexReader().close();
}
测试结果:
java a.txt
null
null
E:\test\java a.txt
java b.txt
null
null
E:\test\java b.txt
- MUST 必须 相当于and, 并且
- MUST_NOT 必须不满足,相当于not, 非
- SHOULD 应该 相当于or,或者
- 可以类比于sq语句的多条件查询
7、解析的方式查询
(1)*:* 查询所有:表示域和值都不添加限制条件,但是添加了默认的filename:
@Test
public void testSelect() throws Exception {
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());// 磁盘
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser queryParser=new QueryParser("fileName",new IKAnalyzer());
Query query=queryParser.parse("*:*");
TopDocs topDocs = indexSearcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
// 文件名称
String fileName = document.get("fileName");
System.out.println(fileName);
// 文件内容
String fileContent = document.get("fileContent");
System.out.println(fileContent);
// 文件大小
String fileSize = document.get("fileSize");
System.out.println(fileSize);
// 文件路径
String filePath = document.get("filePath");
System.out.println(filePath);
}
indexSearcher.getIndexReader().close();
}
001.txt
null
null
E:\test\001.txt
1.txt
null
null
E:\test\1.txt
2.txt
null
null
E:\test\2.txt
3.txt
null
null
E:\test\3.txt
abc.txt
null
null
E:\test\abc.txt
java.txt
null
null
E:\test\java.txt
js.txt
null
null
E:\test\js.txt
2.txt
null
null
E:\test\2.txt
3.txt
null
null
E:\test\3.txt
abc.txt
null
null
E:\test\abc.txt
(2)添加条件,不执行默认的条件:
Directory directory = FSDirectory.open(new File("E:\\test1").toPath());// 磁盘
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser queryParser=new QueryParser("fileName",new StandardAnalyzer());
Query query=queryParser.parse("fileName:java");
此时默认的条件已经不起作用了,执行的是自定义的条件
(3)多域默认查询
String[] fields = {"fileName","fileContent"};
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields,new IKAnalyzer());
- 参数1: 默认查询的域
- 参数2:采用的分析器