Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按id删除lucene文档_Lucene - Fatal编程技术网

按id删除lucene文档

按id删除lucene文档,lucene,Lucene,如何从Lucene索引中删除单个文档? 没有方法deleteDocument(intDocID),我也找不到一个基于docId只选择一个文档的查询 使用Lucene 4.10.3 谢谢您将永远不会在公共api中看到docId(int),因为docId可以随着每次提交(和合并…)而更改。 所以你必须使用 在solr中,您可以但在内部,这与删除文档(新术语(“id”,id))相同。您将永远不会在公共api中看到docId(int),因为docId可以随着每次提交(和合并…)而更改。 所以你必须使用

如何从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();
}
}
}