按id删除lucene文档
如何从Lucene索引中删除单个文档? 没有方法deleteDocument(intDocID),我也找不到一个基于docId只选择一个文档的查询 使用Lucene 4.10.3 谢谢您将永远不会在公共api中看到docId(int),因为docId可以随着每次提交(和合并…)而更改。 所以你必须使用 在solr中,您可以但在内部,这与删除文档(新术语(“id”,id))相同。您将永远不会在公共api中看到docId(int),因为docId可以随着每次提交(和合并…)而更改。 所以你必须使用按id删除lucene文档,lucene,Lucene,如何从Lucene索引中删除单个文档? 没有方法deleteDocument(intDocID),我也找不到一个基于docId只选择一个文档的查询 使用Lucene 4.10.3 谢谢您将永远不会在公共api中看到docId(int),因为docId可以随着每次提交(和合并…)而更改。 所以你必须使用 在solr中,您可以但在内部,这与删除文档(新术语(“id”,id))相同。您将永远不会在公共api中看到docId(int),因为docId可以随着每次提交(和合并…)而更改。 所以你必须使用
在solr中,您可以但在内部,这与删除文档(新术语(“id”,id))相同。在将多个碎片合并到一个大核心中时,我意外地将同一核心合并了两次,导致一组文档具有相同的id字段值。为了解决这个问题,我使用以下代码按文档的位置id删除文档:
public class IndexCleaner {
public static void main(String[] args) {
try (Directory dir = FSDirectory.open(new File(args[0]));
IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_4_10_4, null));
IndexReader reader = DirectoryReader.open(writer, false);) {
int numDocs = reader.numDocs();
Set<String> items = new HashSet<>(numDocs);
for (int i = numDocs - 1; i >= 0; i--) {
String id = reader.document(i).get("id");
if (items.contains(id)) {
writer.tryDeleteDocument(reader, i);
System.out.println("Document with id \"" + id + "\" marked for deletion");
}
else {
items.add(id);
}
}
writer.commit();
}
catch (Throwable e) {
e.printStackTrace();
}
}
}
公共类索引清理器{
公共静态void main(字符串[]args){
try(Directory dir=FSDirectory.open(新文件(args[0]));
IndexWriter writer=newindexwriter(dir,newindexwriterconfig(Version.LUCENE_4_10_4,null));
IndexReader=DirectoryReader.open(writer,false);){
int numDocs=reader.numDocs();
Set items=新哈希集(numDocs);
对于(int i=numDocs-1;i>=0;i--){
stringid=reader.document(i.get)(“id”);
if(项目包含(id)){
writer.tryDeleteDocument(reader,i);
System.out.println(“id为\”+id+“\”标记为删除的文档”);
}
否则{
项目。添加(id);
}
}
writer.commit();
}
捕获(可丢弃的e){
e、 printStackTrace();
}
}
}
在将多个碎片合并为一个大核心时,我意外地将同一核心合并了两次,导致一组文档的id字段值相同。为了解决这个问题,我使用以下代码按文档的位置id删除文档:
public class IndexCleaner {
public static void main(String[] args) {
try (Directory dir = FSDirectory.open(new File(args[0]));
IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_4_10_4, null));
IndexReader reader = DirectoryReader.open(writer, false);) {
int numDocs = reader.numDocs();
Set<String> items = new HashSet<>(numDocs);
for (int i = numDocs - 1; i >= 0; i--) {
String id = reader.document(i).get("id");
if (items.contains(id)) {
writer.tryDeleteDocument(reader, i);
System.out.println("Document with id \"" + id + "\" marked for deletion");
}
else {
items.add(id);
}
}
writer.commit();
}
catch (Throwable e) {
e.printStackTrace();
}
}
}
公共类索引清理器{
公共静态void main(字符串[]args){
try(Directory dir=FSDirectory.open(新文件(args[0]));
IndexWriter writer=newindexwriter(dir,newindexwriterconfig(Version.LUCENE_4_10_4,null));
IndexReader=DirectoryReader.open(writer,false);){
int numDocs=reader.numDocs();
Set items=新哈希集(numDocs);
对于(int i=numDocs-1;i>=0;i--){
stringid=reader.document(i.get)(“id”);
if(项目包含(id)){
writer.tryDeleteDocument(reader,i);
System.out.println(“id为\”+id+“\”标记为删除的文档”);
}
否则{
项目。添加(id);
}
}
writer.commit();
}
捕获(可丢弃的e){
e、 printStackTrace();
}
}
}