• 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:采用的分析器
  • 相关阅读:
    python学习笔记:遍历目录
    c++笔记:友元函数
    VMware Workstation 9: This virtual machine's policies are too old to be run by this version of VMware
    inet_ntoa内存问题
    python学习笔记:sqlite3查询
    python学习笔记:利用asyncore的端口映射(端口转发)
    编写谷歌浏览器的油猴脚本
    window编译7z
    通过配置nginx的header路由到不同环境的服务器
    用U盘给物理机安装ubuntu20.04
  • 原文地址:https://www.cnblogs.com/zhai1997/p/13291381.html
Copyright © 2020-2023  润新知