【问题标题】:Deleting document by Term from lucene从lucene中按Term删除文档
【发布时间】:2010-09-15 01:01:52
【问题描述】:

以下代码没有按预期删除文档:

        RAMDirectory idx     = new RAMDirectory();
        IndexWriter writer  = new IndexWriter(idx,
                                   new SnowballAnalyzer(Version.LUCENE_30, "English"),
                                   IndexWriter.MaxFieldLength.LIMITED);
        Document doc = new Document();
        doc.add(new Field("title", "mydoc", Field.Store.YES, Field.Index.NO));
        doc.add(new Field("content", "some content, deleteme", Field.Store.YES, Field.Inde
x.ANALYZED));
        writer.addDocument(doc);
        Document doc2 = new Document();        
        doc2.add(new Field("title", "mydoc2", Field.Store.YES, Field.Index.NO));
        doc2.add(new Field("content", "other content, don't deleteme", Field.Store.YES, Field.I
ndex.ANALYZED));
        writer.addDocument(doc2);
        writer.optimize();
        writer.close();

        /*
        IndexReader reader = IndexReader.open(idx, false);
        int docs_up_for_deletion = reader.docFreq(new Term("title"));
        int before = reader.numDocs();
        int docs_deleted = reader.deleteDocuments(new Term("title", "mydoc"));
        reader.close();
        */

        IndexWriter writer2  = new IndexWriter(idx,
                                   new SnowballAnalyzer(Version.LUCENE_30, "English"),
                                   IndexWriter.MaxFieldLength.LIMITED);
        int before = writer2.numDocs();
        writer2.deleteDocuments(new Term("title", "mydoc"));
        writer2.commit();
        writer2.optimize();
        int after = writer2.numDocs();
        writer2.close();
        int docs_deleted = before - after;

我尝试使用 IndexReader 和 IndexWriter 进行删除,但均无效。

我还尝试在上述代码之后添加另一个 IndexReader 搜索,以防数字仅在关闭 writer2 后更新(在this FAQ 中提到),但这无济于事。执行 writer.deleteAll() 有效,而不是按 Term 删除。

我发现了一个旧的参考,即只能删除 Field.Keyword 类型的字段,但这在 Lucene 3.x 中不再是有效的字段类型

【问题讨论】:

    标签: lucene


    【解决方案1】:

    您的标题字段未编入索引。改变

    new Field("title", "mydoc", Field.Store.YES, Field.Index.NO)
    

    new Field("title", "mydoc", Field.Store.YES, Field.Index.ANALYZED)
    

    new Field("title", "mydoc", Field.Store.YES, Field.Index.NOT_ANALYZED)
    

    取决于您是否要分析您的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多