lucene:索引维护(删除、更新、查询)

1、删除全部索引

(1)删除索引前执行查询:

1.txt
null
null
E:	est1.txt
1.txt
null
null
E:	est1.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:	estjava a.txt
java b.txt
null
null
E:	estjava 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:	est001.txt
1.txt
null
null
E:	est1.txt
2.txt
null
null
E:	est2.txt
3.txt
null
null
E:	est3.txt
abc.txt
null
null
E:	estabc.txt
java.txt
null
null
E:	estjava.txt
js.txt
null
null
E:	estjs.txt
2.txt
null
null
E:	est2.txt
3.txt
null
null
E:	est3.txt
abc.txt
null
null
E:	estabc.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:	estjava a.txt
java b.txt
null
null
E:	estjava 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:	est001.txt
1.txt
null
null
E:	est1.txt
2.txt
null
null
E:	est2.txt
3.txt
null
null
E:	est3.txt
abc.txt
null
null
E:	estabc.txt
java.txt
null
null
E:	estjava.txt
js.txt
null
null
E:	estjs.txt
2.txt
null
null
E:	est2.txt
3.txt
null
null
E:	est3.txt
abc.txt
null
null
E:	estabc.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:采用的分析器
原文地址:https://www.cnblogs.com/zhai1997/p/13291381.html