3

我只是想知道如何根据数字字段更新(删除/插入)文档。到目前为止,我这样做了:

LuceneManager.updateDocument(writer, new Term("id",  NumericUtils.intToPrefixCoded(sentenceId)), newDoc);

但是现在在 Lucene 4.0 中,NumericUtils 类已经变成了我不太理解的这个。有什么帮助吗?

4

5 回答 5

2

使用 Lucene 5.x,这可以通过以下代码解决:

    int id = 1;
    BytesRefBuilder brb = new BytesRefBuilder();
    NumericUtils.intToPrefixCodedBytes(id, 0, brb);
    Term term = new Term("id", brb.get());
    indexWriter.updateDocument(term, doc); // or indexWriter.deleteDocument(term);
于 2016-04-08T10:39:03.633 回答
1

使用 Lucene 4,您现在可以像这样创建IntFieldLongFieldFloatFieldDoubleField

document.add(new IntField("id", 6, Field.Store.NO));

要在修改后编写文档,它仍然是:

indexWriter.updateDocument(new Term("pk", "<pk value>"), document);

编辑: 这是一种进行包含此数字字段的查询的方法:

// Query <=> id <= 7
Query query = NumericRangeQuery.newIntRange("id", Integer.MIN_VALUE, 7, true, true);
TopDocs topDocs = indexSearcher.search(query, 10);
于 2012-12-19T18:21:54.393 回答
1

你可以这样使用它:

首先,您必须设置FieldType的数字类型:

FieldType TYPE_ID = new FieldType();
...
TYPE_ID.setNumericType(NumericType.INT);
TYPE_ID.freeze();

进而:

int idTerm = 10;
BytesRef bytes = new BytesRef(NumericUtils.BUF_SIZE_INT);
NumericUtils.intToPrefixCoded(id, 0, bytes);
Term idTerm = new Term("id", bytes);

现在您就可以使用它idTerm来更新文档了。

于 2013-01-24T15:50:41.873 回答
0

我会建议,如果可能的话,最好将 ID 存储为关键字字符串,而不是数字。如果它只是一个唯一标识符,那么将索引作为关键字更有意义。这消除了任何与数字格式混淆的需要。

如果它实际上被用作数字,那么您可能需要手动执行更新。也就是说,搜索并获取要更新的文档,使用tryDeleteDocument删除旧文档,然后使用 addDocument 添加更新的版本。据我所知,这基本上就是 updateDocument 所做的。

不过,第一种选择肯定是更好的方法。用作更新 ID 的非数字字段将使生活更轻松。

于 2012-12-20T18:51:17.317 回答
0

根据Lucene 4.0.0 的文档,ID 字段必须与 StringField 类一起使用:

“被索引但未标记的字段:整个字符串值被索引为单个标记。例如,这可能用于 'country' 字段或 'id' 字段,或您打算用于排序的任何字段或通过字段缓存访问。”

我和你有同样的问题,我通过做出这个改变解决了这个问题。之后,我的更新和删除工作完美。

于 2013-07-29T16:15:12.987 回答