2016-09-02 16 views
0

現在、ドキュメントのリストと個々のドキュメントをApache Lucene Indexに追加できます。しかし、私は、インデックスからドキュメントを更新中に問題に直面しています:apache Luceneでドキュメントを削除または更新するには

マインアプローチは、ファイルがアップロードされるとすぐに、ディスクに書き込む前に、私はファイルがドライブ/フォルダに存在するかどうかをチェックし、ファイル名に

第2に、アップロードしたファイルをLuceneインデックスに追加しています。

しかし、私が遭遇している問題は、新しく追加された文書と古い文書が両方とも異なる内容の検索結果に表示されていることです。例については

:ファイル名には、テキストとSample_One.txtです:

これが初めてサンプルテキストです。

上記のファイルをインデックスから削除してから、新しいファイルコンテンツをインデックスに追加した後。これは、更新されたコンテンツとサンプルテキストです

は今、ファイルの内容が同じファイル名を持つ別のテキストで更新されます。

「サンプル」のようないくつかのテキストを検索しながら、結果はSample_One.txtは、古いものと新しい内容で2回ファイル見せています。

私は何かが紛失していることと、文書をインデックスに更新/削除する方法を知りたいと思います。

コードスニペットは、次のとおりです。

//Deleting the Document from the Index 
public void deleteDocumentsFromIndexUsingTerm(Document doc) throws IOException, ParseException { 
    Term fileTerm = new Term("file_name",doc.get("file_name")); 
    Term contentTerm = new Term("content", doc.get("content")); 
    Term docIDTerm = new Term("document_id", doc.get("document_id")); 

    File indexDir = new File(INDEX_DIRECTORY); 

    Directory directory = FSDirectory.open(indexDir.toPath()); 

    Analyzer analyzer = new StandardAnalyzer(); 
    IndexWriterConfig conf = new IndexWriterConfig(analyzer); 
    IndexWriter indexWriter = new IndexWriter(directory, conf); 

    System.out.println("Deleting the term with - "+doc.get("file_name")); 
    System.out.println("Deleting the term with contents - "+doc.get("content")); 

    indexWriter.deleteDocuments(fileTerm); 
    indexWriter.deleteDocuments(contentTerm); 
    indexWriter.deleteDocuments(docIDTerm); 
    indexWriter.commit(); 
    indexWriter.close(); 
} 

//スニペットが

final String INDEX_DIRECTORY = "D:\\Development\\Lucene_Indexer"; 
    long startTime = System.currentTimeMillis(); 
    List<ContentHandler> contentHandlerList = new ArrayList<ContentHandler>(); 

    String fileNames = (String)request.getAttribute("message"); 

    File file = new File("D:\\Development\\Resume_Sample\\"+fileNames); 

    ArrayList<File> fileList = new ArrayList<File>(); 
    fileList.add(file); 

    Metadata metadata = new Metadata(); 

    // BodyContentHandler set the value as -1 to evade the Text Limit Exception 
    ContentHandler handler = new BodyContentHandler(-1); 
    ParseContext context = new ParseContext(); 
    Parser parser = new AutoDetectParser(); 
    InputStream stream = new FileInputStream(file); 

    try { 
     parser.parse(stream, handler, metadata, context); 
     contentHandlerList.add(handler); 
    }catch (TikaException e) { 
     e.printStackTrace(); 
    }catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
      stream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    FieldType fieldType = new FieldType(); 
    fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS); 
    fieldType.setStoreTermVectors(true); 
    fieldType.setStoreTermVectorPositions(true); 
    fieldType.setStoreTermVectorPayloads(true); 
    fieldType.setStoreTermVectorOffsets(true); 
    fieldType.setStored(true); 


    Analyzer analyzer = new StandardAnalyzer(); 
    Directory directory = FSDirectory.open(new File(INDEX_DIRECTORY).toPath()); 
    IndexWriterConfig conf = new IndexWriterConfig(analyzer); 
    IndexWriter writer = new IndexWriter(directory, conf); 

    Iterator<ContentHandler> handlerIterator = contentHandlerList.iterator(); 
    Iterator<File> fileIterator = fileList.iterator(); 

while (handlerIterator.hasNext() && fileIterator.hasNext()) { 
    Document doc = new Document(); 

    String text = handlerIterator.next().toString(); 
    String textFileName = fileIterator.next().getName(); 

    String idOne = UUID.randomUUID().toString(); 

    Field idField = new Field("document_id",idOne,fieldType); 
    Field fileNameField = new Field("file_name", textFileName, fieldType); 
    Field contentField = new Field("content",text,fieldType); 


    doc.add(idField); 
    doc.add(contentField); 
    doc.add(fileNameField); 

    writer.addDocument(doc); 

    analyzer.close(); 
} 

writer.commit(); 
writer.deleteUnusedFiles(); 
long endTime = System.currentTimeMillis(); 

writer.close(); 

まず、私は更新された文書をインデックス化、その後のファイルがアップロードされるとすぐに文書を削除しています上のインデックスにドキュメントを追加します。

答えて

1

問題は、インデックス作成時にフィールドが分​​析されていますが、削除しようとしている用語がではなく、であると分析されています。

最良の解決策は、この目的のための識別子として使用するフィールドをStringFieldにすることです。このフィールドは、分析なしでインデックス付けされます。以下のような:

Field idField = new StringField("document_id", idOne); 
doc.add(idField); 

その場合には、あなたが(いずれかに意図したよりも多くの文書を削除しないように注意しなければならないのに別の方法として、あなたは、IndexWriter.deleteDocuments(Query...)を使用し、(QueryParserによって生成される)を分析したクエリに渡すことができますクエリによって見つかったの文書は、最良の結果だけでなく、削除されます)。

+0

美しく機能しました。あなたの提案は、2回目の私のために働いていました。 – anand

+0

こんにちは、luceneのAutoSuggestionに関するもう1つのトピックについて私を助けてください。質問stackoverflowリンクです:http:// stackoverflow。com/questions/39320279 /最初の検索後にlucene-in-first-search-iterationという自動提案 – anand

関連する問題