官术网_书友最值得收藏!

3.2.5 更新索引庫中的索引文檔

對于分詞列來說,直接更新索引中的值很困難。可以采用先刪除舊文檔,然后再向索引增加傳入的新文檔的方法實現更新索引。

通過IndexWriter.updateDocument方法更新文檔。

        indexWriter.updateDocument(new Term("url", "http://www.lietu.com"), document);

如果只希望更新個別列而保持其他的列不動就會有問題。為了解決這個問題,可以搜索索引中的當前文檔,改變要改變的列,然后把修改后的文檔作為參數傳給updateDocument()。

        public void searchAndUpdateDocument(IndexWriter writer,
                                        IndexSearcher searcher,
                                        Document updateDoc,
                                        Term term) throws IOException {
              TermQuery query = new TermQuery(term);


              TopDocs hits = searcher.search(query, 10);


              if (hits.scoreDocs.length == 0) {
                      throw new IllegalArgumentException("索引中沒有匹配的結果");
              } else if (hits.scoreDocs.length > 1) {
                      throw new IllegalArgumentException("Given Term matches
                        more than 1 document in the index.");
              } else {
                      int docId = hits.scoreDocs[0].doc;


                      //找出舊的文檔
                      Document doc = searcher.doc(docId);


                      List<Field> replacementFields = updateDoc.getFields();
                      for (Field field : replacementFields) {
                            String name = field.name();
                            String currentValue = doc.get(name);
                            if (currentValue ! = null) {
                                  //替換列值
                                  Field = new Field(name, term.text());
                                  //刪除所有出現的值舊列
                                  doc.removeFields(name);


                                  //插入替換列
                                  doc.add(field);
                            } else {
                                  //新加到列
                                  doc.add(field);
                            }
                    }


                    //把舊文檔更改后重新寫入索引
                    writer.updateDocument(term, doc);
              }
      }
主站蜘蛛池模板: 五莲县| 鲁甸县| 定边县| 镶黄旗| 铜鼓县| 高阳县| 大英县| 平顶山市| 商南县| 西华县| 呼图壁县| 唐河县| 烟台市| 西华县| 马鞍山市| 涟源市| 静乐县| 中卫市| 渝中区| 安乡县| 万安县| 旬邑县| 内丘县| 青川县| 皋兰县| 沧州市| 收藏| 西和县| 赤城县| 天津市| 安平县| 印江| 仁怀市| 浦城县| 花垣县| 孟州市| 安新县| 浦县| 彭州市| 博兴县| 大新县|