Java lucene删除文件不工作

Java lucene删除文件不工作,java,lucene,Java,Lucene,我想删除文档,但是deleteDocuments方法不起作用。文档仍然是一样的。有什么问题吗?您打开了一个新的索引阅读器来执行第二次搜索,这很好,但您将旧的阅读器传递给搜索器。在运行搜索时,您还使用了旧的搜索程序,而不是新的搜索程序 // Directory indexDir = new SimpleFSDirectory(new File("D:" + File.separator + "testindex")); Directory indexDir = ne

我想删除文档,但是deleteDocuments方法不起作用。文档仍然是一样的。有什么问题吗?

您打开了一个新的
索引阅读器来执行第二次搜索,这很好,但您将旧的阅读器传递给搜索器。在运行搜索时,您还使用了旧的搜索程序,而不是新的搜索程序

//        Directory indexDir = new SimpleFSDirectory(new File("D:" + File.separator + "testindex"));
        Directory indexDir =  new RAMDirectory();

        System.out.println("当前lucene的版本号是---" + Version.LUCENE_45);

        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_45);

        // 写索引的配置
        IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_45, analyzer);

        // 每一次都会进行创建新的索引,第二次删掉原来的创建新的索引
        writerConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);

        IndexWriter indexWriter = new IndexWriter(indexDir, writerConfig);

        Document document = new Document();

        Field stringField = new TextField("int1", "hello lucky boy", Store.YES);

        Reader reader = new StringReader("hello lucky boy");

        /** ****************创建索引时查看分词的结果************* ****** */
        TokenStream tokenStream = analyzer.tokenStream("", reader);

        tokenStream.reset();

        CharTermAttribute charTermAttr = tokenStream.getAttribute(CharTermAttribute.class);

        System.out.println("tokenStream......" + tokenStream);

        System.out.print("....分词开始....");

        while (tokenStream.incrementToken())
        {

            System.out.print(charTermAttr + "----");

        }
        System.out.print("....分词结束....");

        document.add(stringField);

        indexWriter.addDocument(document);

        indexWriter.close();

        /*******查询term********/
        IndexReader indexReader = DirectoryReader.open(indexDir);

        IndexSearcher searcher = new IndexSearcher(indexReader);

        TopDocs docs = searcher.search(new TermQuery(new Term("int1", "boy")), 10);

        ScoreDoc[] hits = docs.scoreDocs;

        System.out.println("......");

        if(null != hits)
        {

            System.out.println("...存在查询的结果..."+hits.length);

            for(ScoreDoc hit : hits)
            {

                System.out.println("命中的结果是......"+hit);

                Document doc = searcher.doc(hit.doc);

                System.out.println("查询出来的field是......"+doc.get("int1"));

            }

        }


        /** *********更新索引文件document********* */
        System.out.println("...更新索引文件开始...");
        Term term = new Term("int1", "lucky");

        IndexWriterConfig writerConfig2 = new IndexWriterConfig(Version.LUCENE_45, analyzer);

        IndexWriter indexWriter2 = new IndexWriter(indexDir, writerConfig2);
//        indexWriter2.updateDocument(term, document);

        indexWriter2.deleteDocuments(term);

        indexWriter2.close();
        System.out.println("......" + document);

        System.out.println("...跟新索引文件结束...");
        /** **********跟新索引文件结束**** */


        /**********update/delete之后的操作*********/
        IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);

        IndexSearcher searcherUpdate = new IndexSearcher(indexReader);

        TopDocs docsUpdate = searcher.search(new TermQuery(new Term("int1", "hello")), 10);

        ScoreDoc[] hitsUpdate = docsUpdate.scoreDocs;

        System.out.println("...跟新之后的Search操作...");

        if(null != hitsUpdate)
        {

            System.out.println("...跟新之后存在查询的结果...");

            for(ScoreDoc hit : hitsUpdate)
            {

                System.out.println("命中的结果是......"+hit);

                Document doc = searcher.doc(hit.doc);

                System.out.println("查询出来的field是......"+doc.get("int1"));

            }

        }
那么这个,

public final void removeReaderClosedListener(IndexReader.ReaderClosedListener listener)
应该是:

IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);

// Use indexReaderUpdate here, instead of indexReader
IndexSearcher searcherUpdate = new IndexSearcher(indexReader);

// Use searcherUpdate here, instead of searcher
TopDocs docsUpdate = searcher.search(new TermQuery(new Term("int1", "hello")), 10);

您希望删除哪个
文档
?我没有看到
int1
字段被设置为
lucky
。只有一个Docuemnt,Document Document=new Document();Field stringField=新文本字段(“int1”,“你好,幸运儿”,Store.YES);我想删除这个。怎么做如果你通过了
新学期(“int1”,“你好,幸运儿”)
删除文档
?我用这两个更改测试了您的代码,文档被成功删除,并且没有在搜索结果中返回。您做了这两项更改吗?对不起,这是我的错误。但是,关于indexWriter2还有一个问题。updateDocument(术语,文档);。好像不行。你能给我举个例子吗?
IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);

// Use indexReaderUpdate here, instead of indexReader
IndexSearcher searcherUpdate = new IndexSearcher(indexReader);

// Use searcherUpdate here, instead of searcher
TopDocs docsUpdate = searcher.search(new TermQuery(new Term("int1", "hello")), 10);
IndexReader indexReaderUpdate = DirectoryReader.open(indexDir);
IndexSearcher searcherUpdate = new IndexSearcher(indexReaderUpdate);
TopDocs docsUpdate = searcherUpdate.search(new TermQuery(new Term("int1", "hello")), 10);