我只是想知道它是如何可能的更新(删除/插入)的基础上的数字字段的文档。 到目前为止,我这样做:
LuceneManager.updateDocument(writer, new Term("id", NumericUtils.intToPrefixCoded(sentenceId)), newDoc);
但现在使用Lucene 4.0 NumericUtils类已更改为这 ,我真的不明白。 任何帮助吗?
我只是想知道它是如何可能的更新(删除/插入)的基础上的数字字段的文档。 到目前为止,我这样做:
LuceneManager.updateDocument(writer, new Term("id", NumericUtils.intToPrefixCoded(sentenceId)), newDoc);
但现在使用Lucene 4.0 NumericUtils类已更改为这 ,我真的不明白。 任何帮助吗?
我建议,如果可能的话,这将是更好的一个ID存储为关键字字符串,而不是数量。 如果它只是一个唯一的标识符,索引作为关键字更有道理。 这消除了任何需要乱用数字格式。
如果它实际上是被用作一个数字,那么你可能需要手动进行更新。 也就是说,搜索并获取要更新,与删除旧文档的文档tryDeleteDocument ,然后添加更新的版本addDocument 。 这基本上就是updateDocument做反正,我的知识。
第一个选择肯定会是更好的办法,但。 非数字字段作为更新ID使用将使生活更轻松。
使用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);
使用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);
你可以用这种方式:
首先,你必须设置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
更新文档。
根据Lucene的4.0.0的文档中,ID字段必须与StringField类一起使用:
“编入索引,但没有标记化的字段:您打算用于排序的整个字符串值索引作为一个单一的令牌。例如,这可能被用于‘国家’字段或‘ID’字段 ,或任何领域。或通过实地访问缓存“。
我有同样的问题,因为你和我这样调整解决它。 在那之后,我的UPDATE和DELETE完美。