Удаление документа по термину из люцена - PullRequest
1 голос
/ 14 сентября 2010

Следующий код не удаляет документ по сроку, как ожидалось:

        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 (упомянуто в этом FAQ ), но это не помогает. Выполнение writer.deleteAll () работает, но не удаление по термину.

Я нашел старую ссылку на тот факт, что только поля типа Field.Keyword могут быть удалены, но это больше не является допустимым типом поля в Lucene 3.x

1 Ответ

1 голос
/ 14 сентября 2010

Ваше поле заголовка не проиндексировано. Изменение

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)

в зависимости от того, хотите ли вы проанализировать свое поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...