lucene_03_索引的增删改查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lucene_03_索引的增删改查相关的知识,希望对你有一定的参考价值。

lucene索引的添加见 http://www.cnblogs.com/getchen/p/8615276.html 入门代码。

 

公共代码

  public <T extends Query> void printResult(Query query) throws Exception{
        IndexSearcher indexSearcher = getIndexSearcher();

        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        int i=0;
        for (ScoreDoc doc : scoreDocs) {
            int docIndex = doc.doc;
            Document document = indexSearcher.doc(docIndex);
            String fileName = document.get("fileName");
            System.out.println(fileName);
            String fileSize = document.get("fileSize");
            System.out.println("size:=="+fileSize);
            String filePath = document.get("filePath");
            System.out.println(filePath);
            String fileContent = document.get("fileContent");
            System.out.println(fileContent);
            System.out.println("==========="+ ++i +"===============");
        }
        indexSearcher.getIndexReader().close();
    }




 public IndexSearcher getIndexSearcher() throws Exception{
      //  第一步: 创建一个Directory 对象,也就是索引库存放的位置。
        Directory directory = FSDirectory.open(new File("F:\\\\lucene\\\\indexDatabase"));
//        第二步: 创建一个indexReader 对象,需要指定Directory 对象。
        IndexReader indexReader = DirectoryReader.open(directory);
//        第三步: 创建一个indexsearcher 对象,需要指定InclexReader 对象。
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        return indexSearcher;
    }

 

lucene索引的查询

查询全部

 @Test
    public void queryAll() throws Exception{
        Query query = new MatchAllDocsQuery();
        printResult(query);


    }

区间查询

    @Test
    public void queryRange() throws Exception{
        Query query =  NumericRangeQuery.newLongRange("fileSize",0L,800L,true,true);
        printResult(query);


    }

组合条件查询

    /**
     * 组合条件查询
     */
    @Test
    public void queryBoolean() throws Exception{
        BooleanQuery query = new BooleanQuery();
        TermQuery query1 = new TermQuery(new Term("fileName", "java"));
        TermQuery query2 = new TermQuery(new Term("fileName", "lucene"));
        query.add(query1, BooleanClause.Occur.MUST);
        query.add(query2, BooleanClause.Occur.MUST);

//        Query query3 = query;
        printResult(query);



    }

其中BooleanClause.Occur 中有三个选项:MUST,NOT_MUST,SHOULD.等同于数据库中的and,not,or


lucene索引的添加
//
    @Test
    public void add() throws  Exception{
        IndexWriter indexWriter = getIndexWriter();
        Document document = new Document();
        document.add(new TextField("fileContent","电话号码", Field.Store.YES));
        indexWriter.addDocument(document);
        indexWriter.close();
    }

lucene 索引的更新

 /**
     * 更新:删除原有的并增加需要更改的。
     * 删掉一个添加一个
     * @throws Exception
     */
    @Test
    public void update() throws Exception{
        IndexWriter indexWriter = getIndexWriter();
        Term term = new Term("fileContent", "电话号码");
      /*  Document document = new Document();
        document.add(new TextField("fileContent","电话号码1", Field.Store.YES));*/
        Document document = getDocumentByFile(new File("F:\\\\lucene\\\\test.txt"));
        indexWriter.updateDocument(term,document,new IKAnalyzer());
        indexWriter.close();
    }

    public Document getDocumentByFile(File file) throws Exception{
        Document document = new Document();
        //获取文件的名称
        String fileName = file.getName();
        //创建textfield,保存文件名(key,value,是否存储)
        TextField fileNameField = new TextField("fileName",fileName, Field.Store.YES);
        //文件大小
        long fileSize = FileUtils.sizeOf(file);

//                NumericDocValuesField fileSizeField = new NumericDocValuesField("fileSize", fileSize);
        System.out.println(fileSize);

//                SortedNumericDocValuesField fileSizeField = new SortedNumericDocValuesField("fileSize", fileSize);
//                LongPoint fileSizeField = new LongPoint("fileSize", fileSize);
        StringField fileSizeField = new StringField("fileSize", String.valueOf(fileSize), Field.Store.YES);
        //文件路径
        String filePath = file.getPath();
        StoredField filePathField = new StoredField("filePath", filePath);
        //文件内容
        String fileContent = FileUtils.readFileToString(file,"gbk");
        TextField fileContentField = new TextField("fileContent", fileContent, Field.Store.YES);
        document.add(fileNameField);
        document.add(fileSizeField);
        document.add(filePathField);
        document.add(fileContentField);
        return document;
    }

lucene索引的删除

 

  //删除全部
    @Test
    public  void deleteAll() throws Exception{
        IndexWriter indexWriter = getIndexWriter();
        indexWriter.deleteAll();
        indexWriter.close();

    }

    //删除部分
    @Test
    public void delete() throws  Exception{
        IndexWriter indexWriter = getIndexWriter();
        Term term = new Term("fileContent", "电话号码"); //索引文件中包含的有电话号码,分词器也分析出了电话号码一词,删除之后就无法通过该关键词索引到文件了。
        indexWriter.deleteDocuments(term);
        indexWriter.close();
    }

 

以上是关于lucene_03_索引的增删改查的主要内容,如果未能解决你的问题,请参考以下文章

Lucene参与项目持久层中对于索引库的增删改查

全文检索-基于lucene4.10的增删改查

Lucene全文检索的增删改查 实例

周末作业:文件的增删改查

Python_类和实例属性的增删改查操作

Solr_全文检索引擎系统