我只是想知道如何根据数字字段更新(删除/插入)文档。 到目前为止,我做到了这一点:
LuceneManager.updateDocument(writer, new Term("id", NumericUtils.intToPrefixCoded(sentenceId)), newDoc);
但是现在使用Lucene 4.0,NumericUtils类已经改为this,我真的不明白。 有什么帮助吗?
答案 0 :(得分:1)
使用Lucene 4,您现在可以像这样创建IntField,LongField,FloatField或DoubleField:
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);
答案 1 :(得分:0)
我建议,如果可能的话,最好将ID存储为关键字字符串,而不是数字。如果它只是一个唯一标识符,则将索引作为关键字更有意义。这消除了弄乱数字格式的任何需要。
如果它实际上被用作数字,那么您可能需要手动执行更新。也就是说,搜索并获取您要更新的文档,使用tryDeleteDocument删除旧文档,然后使用addDocument添加更新后的版本。据我所知,这基本上就是updateDocument所做的事情。
第一种选择肯定是更好的方式。用作更新ID的非数字字段可以使生活更轻松。
答案 2 :(得分:0)
你可以这样使用它:
首先,您必须设置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
更新文档。
答案 3 :(得分:0)
根据documentation of Lucene 4.0.0,ID字段必须与StringField类一起使用:
“已编入索引但未标记化的字段:整个字符串值被编入索引作为单个标记。例如,这可能用于'country'字段或'id'字段,或者您打算用于通过字段缓存进行排序或访问的任何字段。“
我和你有同样的问题,我通过改变来解决它。之后,我的更新和删除工作完美。
答案 4 :(得分:0)
使用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);