提问者:小点点

Lucene删除索引,Java


我使用Lucene库进行搜索,当我更新我搜索的对象中的信息时,我需要重新索引这个对象。所以我这样做:

    IndexWriterConfig config = new IndexWriterConfig(OffersSearchEJB.VERSION, OffersSearchEJB.ANALYZER);
    config.setOpenMode(IndexWriterConfig.OpenMode.APPEND);
    config.setRAMBufferSizeMB(64);
    config.setMaxBufferedDocs(2000);

    IndexWriter indexWriter;
    try {
        indexWriter = new IndexWriter(OffersSearchEJB.DIRECTORY, config);
        Document doc = new Document();
        IntField idField = new IntField("id", 0, Field.Store.YES);
        TextField shortTitleField = new TextField("shortTitle", "", Field.Store.NO);
        TextField titleField = new TextField("title", "", Field.Store.NO);
        TextField termsField = new TextField("terms", "", Field.Store.NO);
        TextField featuresField = new TextField("features", "", Field.Store.NO);
        TextField descriptionField = new TextField("description", "", Field.Store.NO);
        // deleting old index
        Term term = new Term("id", offer.getId().toString());
        indexWriter.deleteDocuments(term);
        // storing new index
        OffersSearchEJB.indexOffer(offer, indexWriter, doc, idField, shortTitleField, titleField, termsField, featuresField, descriptionField);
        indexWriter.commit();
        indexWriter.close();
    } catch (IOException ex) {
        Logger.getLogger(OfferMDB.class.getName()).log(Level.SEVERE, null, ex);
    }

换句话说,我只是添加新对象并删除旧对象。向索引中添加新对象效果很好,但这段代码并不是删除旧索引。我还尝试了indexWriter.updateDocument(term,doc)

我使用Lucene 4.7、JDK 1.6和Jboss 6.4


共1个答案

匿名用户

这是行不通的,因为您的ID是一个IntField,所以它是编码的,而不是作为一个简单的术语进行索引。

这里有两个很好的解决方案:

> < li>

将您的< code>idField更改为< code>StringField。如果你的id只是作为一个标识符,我肯定会推荐这个。即使字段可能是由数字组成的,如果你不把它当作一个数字(比如使用范围查询,或者对它进行排序),那么就不要把它当作一个数字来索引。

使用数字查询而不是术语来删除文档,如下所示:

Query query = NumericRangeQuery.newIntRange("id", offer.getId(), offer.getId(), true, true);
indexWriter.deleteDocuments(query);