IndexModifier.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:23k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2005 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using Analyzer = Lucene.Net.Analysis.Analyzer;
  18. using Document = Lucene.Net.Documents.Document;
  19. using Directory = Lucene.Net.Store.Directory;
  20. using FSDirectory = Lucene.Net.Store.FSDirectory;
  21. namespace Lucene.Net.Index
  22. {
  23. /// <summary> A class to modify an index, i.e. to delete and add documents. This
  24. /// class hides {@link IndexReader} and {@link IndexWriter} so that you
  25. /// do not need to care about implementation details such as that adding
  26. /// documents is done via IndexWriter and deletion is done via IndexReader.
  27. /// 
  28. /// <p>Note that you cannot create more than one <code>IndexModifier</code> object
  29. /// on the same directory at the same time.
  30. /// 
  31. /// <p>Example usage:
  32. /// 
  33. /// <!-- ======================================================== -->
  34. /// <!-- = Java Sourcecode to HTML automatically converted code = -->
  35. /// <!-- =   Java2Html Converter V4.1 2004 by Markus Gebhard  markus@jave.de   = -->
  36. /// <!-- =     Further information: http://www.java2html.de     = -->
  37. /// <div align="left" class="java">
  38. /// <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  39. /// <tr>
  40. /// <!-- start source code -->
  41. /// <td nowrap="nowrap" valign="top" align="left">
  42. /// <code>
  43. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Analyzer&nbsp;analyzer&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">StandardAnalyzer</font><font color="#000000">()</font><font color="#000000">;</font><br/>
  44. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;create&nbsp;an&nbsp;index&nbsp;in&nbsp;/tmp/index,&nbsp;overwriting&nbsp;an&nbsp;existing&nbsp;one:</font><br/>
  45. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">IndexModifier&nbsp;indexModifier&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">IndexModifier</font><font color="#000000">(</font><font color="#2a00ff">&#34;/tmp/index&#34;</font><font color="#000000">,&nbsp;analyzer,&nbsp;</font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
  46. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Document&nbsp;doc&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Document</font><font color="#000000">()</font><font color="#000000">;</font><br/>
  47. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">doc.add</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Field</font><font color="#000000">(</font><font color="#2a00ff">&#34;id&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;1&#34;</font><font color="#000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED</font><font color="#000000">))</font><font color="#000000">;</font><br/>
  48. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">doc.add</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Field</font><font color="#000000">(</font><font color="#2a00ff">&#34;body&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;a&nbsp;simple&nbsp;test&#34;</font><font color="#000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED</font><font color="#000000">))</font><font color="#000000">;</font><br/>
  49. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">indexModifier.addDocument</font><font color="#000000">(</font><font color="#000000">doc</font><font color="#000000">)</font><font color="#000000">;</font><br/>
  50. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">deleted&nbsp;=&nbsp;indexModifier.delete</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Term</font><font color="#000000">(</font><font color="#2a00ff">&#34;id&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;1&#34;</font><font color="#000000">))</font><font color="#000000">;</font><br/>
  51. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#2a00ff">&#34;Deleted&nbsp;&#34;&nbsp;</font><font color="#000000">+&nbsp;deleted&nbsp;+&nbsp;</font><font color="#2a00ff">&#34;&nbsp;document&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br/>
  52. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">indexModifier.flush</font><font color="#000000">()</font><font color="#000000">;</font><br/>
  53. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#000000">indexModifier.docCount</font><font color="#000000">()&nbsp;</font><font color="#000000">+&nbsp;</font><font color="#2a00ff">&#34;&nbsp;docs&nbsp;in&nbsp;index&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br/>
  54. /// <font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">indexModifier.close</font><font color="#000000">()</font><font color="#000000">;</font></code>
  55. /// </td>
  56. /// <!-- end source code -->
  57. /// </tr>
  58. /// </table>
  59. /// </div>
  60. /// <!-- =       END of automatically generated HTML code       = -->
  61. /// <!-- ======================================================== -->
  62. /// 
  63. /// <p>Not all methods of IndexReader and IndexWriter are offered by this
  64. /// class. If you need access to additional methods, either use those classes
  65. /// directly or implement your own class that extends <code>IndexModifier</code>.
  66. /// 
  67. /// <p>Although an instance of this class can be used from more than one
  68. /// thread, you will not get the best performance. You might want to use
  69. /// IndexReader and IndexWriter directly for that (but you will need to
  70. /// care about synchronization yourself then).
  71. /// 
  72. /// <p>While you can freely mix calls to add() and delete() using this class,
  73. /// you should batch you calls for best performance. For example, if you
  74. /// want to update 20 documents, you should first delete all those documents,
  75. /// then add all the new documents.
  76. /// 
  77. /// </summary>
  78. /// <author>  Daniel Naber
  79. /// </author>
  80. public class IndexModifier
  81. {
  82. private void  InitBlock()
  83. {
  84. maxBufferedDocs = IndexWriter.DEFAULT_MAX_BUFFERED_DOCS;
  85. maxFieldLength = IndexWriter.DEFAULT_MAX_FIELD_LENGTH;
  86. mergeFactor = IndexWriter.DEFAULT_MERGE_FACTOR;
  87. }
  88. protected internal IndexWriter indexWriter = null;
  89. protected internal IndexReader indexReader = null;
  90. protected internal Directory directory = null;
  91. protected internal Analyzer analyzer = null;
  92. protected internal bool open = false;
  93. // Lucene defaults:
  94. protected internal System.IO.StreamWriter infoStream = null;
  95. protected internal bool useCompoundFile = true;
  96. protected internal int maxBufferedDocs;
  97. protected internal int maxFieldLength;
  98. protected internal int mergeFactor;
  99. /// <summary> Open an index with write access.
  100. /// 
  101. /// </summary>
  102. /// <param name="directory">the index directory
  103. /// </param>
  104. /// <param name="analyzer">the analyzer to use for adding new documents
  105. /// </param>
  106. /// <param name="create"><code>true</code> to create the index or overwrite the existing one;
  107. /// <code>false</code> to append to the existing index
  108. /// </param>
  109. public IndexModifier(Directory directory, Analyzer analyzer, bool create)
  110. {
  111. InitBlock();
  112. Init(directory, analyzer, create);
  113. }
  114. /// <summary> Open an index with write access.
  115. /// 
  116. /// </summary>
  117. /// <param name="dirName">the index directory
  118. /// </param>
  119. /// <param name="analyzer">the analyzer to use for adding new documents
  120. /// </param>
  121. /// <param name="create"><code>true</code> to create the index or overwrite the existing one;
  122. /// <code>false</code> to append to the existing index
  123. /// </param>
  124. public IndexModifier(System.String dirName, Analyzer analyzer, bool create)
  125. {
  126. InitBlock();
  127. Directory dir = FSDirectory.GetDirectory(dirName, create);
  128. Init(dir, analyzer, create);
  129. }
  130. /// <summary> Open an index with write access.
  131. /// 
  132. /// </summary>
  133. /// <param name="file">the index directory
  134. /// </param>
  135. /// <param name="analyzer">the analyzer to use for adding new documents
  136. /// </param>
  137. /// <param name="create"><code>true</code> to create the index or overwrite the existing one;
  138. /// <code>false</code> to append to the existing index
  139. /// </param>
  140. public IndexModifier(System.IO.FileInfo file, Analyzer analyzer, bool create)
  141. {
  142. InitBlock();
  143. Directory dir = FSDirectory.GetDirectory(file, create);
  144. Init(dir, analyzer, create);
  145. }
  146. /// <summary> Initialize an IndexWriter.</summary>
  147. /// <throws>  IOException </throws>
  148. protected internal virtual void  Init(Directory directory, Analyzer analyzer, bool create)
  149. {
  150. this.directory = directory;
  151. lock (this.directory)
  152. {
  153. this.analyzer = analyzer;
  154. indexWriter = new IndexWriter(directory, analyzer, create);
  155. open = true;
  156. }
  157. }
  158. /// <summary> Throw an IllegalStateException if the index is closed.</summary>
  159. /// <throws>  IllegalStateException </throws>
  160. protected internal virtual void  AssureOpen()
  161. {
  162. if (!open)
  163. {
  164. throw new System.SystemException("Index is closed");
  165. }
  166. }
  167. /// <summary> Close the IndexReader and open an IndexWriter.</summary>
  168. /// <throws>  IOException </throws>
  169. protected internal virtual void  CreateIndexWriter()
  170. {
  171. if (indexWriter == null)
  172. {
  173. if (indexReader != null)
  174. {
  175. indexReader.Close();
  176. indexReader = null;
  177. }
  178. indexWriter = new IndexWriter(directory, analyzer, false);
  179. indexWriter.SetInfoStream(infoStream);
  180. indexWriter.SetUseCompoundFile(useCompoundFile);
  181. indexWriter.SetMaxBufferedDocs(maxBufferedDocs);
  182. indexWriter.SetMaxFieldLength(maxFieldLength);
  183. indexWriter.SetMergeFactor(mergeFactor);
  184. }
  185. }
  186. /// <summary> Close the IndexWriter and open an IndexReader.</summary>
  187. /// <throws>  IOException </throws>
  188. protected internal virtual void  CreateIndexReader()
  189. {
  190. if (indexReader == null)
  191. {
  192. if (indexWriter != null)
  193. {
  194. indexWriter.Close();
  195. indexWriter = null;
  196. }
  197. indexReader = IndexReader.Open(directory);
  198. }
  199. }
  200. /// <summary> Make sure all changes are written to disk.</summary>
  201. /// <throws>  IOException </throws>
  202. public virtual void  Flush()
  203. {
  204. lock (directory)
  205. {
  206. AssureOpen();
  207. if (indexWriter != null)
  208. {
  209. indexWriter.Close();
  210. indexWriter = null;
  211. CreateIndexWriter();
  212. }
  213. else
  214. {
  215. indexReader.Close();
  216. indexReader = null;
  217. CreateIndexReader();
  218. }
  219. }
  220. }
  221. /// <summary> Adds a document to this index, using the provided analyzer instead of the
  222. /// one specific in the constructor.  If the document contains more than
  223. /// {@link #SetMaxFieldLength(int)} terms for a given field, the remainder are
  224. /// discarded.
  225. /// </summary>
  226. /// <seealso cref="IndexWriter.AddDocument(Document, Analyzer)">
  227. /// </seealso>
  228. /// <throws>  IllegalStateException if the index is closed </throws>
  229. public virtual void  AddDocument(Document doc, Analyzer docAnalyzer)
  230. {
  231. lock (directory)
  232. {
  233. AssureOpen();
  234. CreateIndexWriter();
  235. if (docAnalyzer != null)
  236. indexWriter.AddDocument(doc, docAnalyzer);
  237. else
  238. indexWriter.AddDocument(doc);
  239. }
  240. }
  241. /// <summary> Adds a document to this index.  If the document contains more than
  242. /// {@link #SetMaxFieldLength(int)} terms for a given field, the remainder are
  243. /// discarded.
  244. /// </summary>
  245. /// <seealso cref="IndexWriter.AddDocument(Document)">
  246. /// </seealso>
  247. /// <throws>  IllegalStateException if the index is closed </throws>
  248. public virtual void  AddDocument(Document doc)
  249. {
  250. AddDocument(doc, null);
  251. }
  252. /// <summary> Deletes all documents containing <code>term</code>.
  253. /// This is useful if one uses a document field to hold a unique ID string for
  254. /// the document.  Then to delete such a document, one merely constructs a
  255. /// term with the appropriate field and the unique ID string as its text and
  256. /// passes it to this method.  Returns the number of documents deleted.
  257. /// </summary>
  258. /// <returns> the number of documents deleted
  259. /// </returns>
  260. /// <seealso cref="IndexReader.DeleteDocuments(Term)">
  261. /// </seealso>
  262. /// <throws>  IllegalStateException if the index is closed </throws>
  263. public virtual int DeleteDocuments(Term term)
  264. {
  265. lock (directory)
  266. {
  267. AssureOpen();
  268. CreateIndexReader();
  269. return indexReader.DeleteDocuments(term);
  270. }
  271. }
  272. /// <summary> Deletes all documents containing <code>term</code>.
  273. /// This is useful if one uses a document field to hold a unique ID string for
  274. /// the document.  Then to delete such a document, one merely constructs a
  275. /// term with the appropriate field and the unique ID string as its text and
  276. /// passes it to this method.  Returns the number of documents deleted.
  277. /// </summary>
  278. /// <returns> the number of documents deleted
  279. /// </returns>
  280. /// <seealso cref="IndexReader.DeleteDocuments(Term)">
  281. /// </seealso>
  282. /// <throws>  IllegalStateException if the index is closed </throws>
  283. /// <deprecated> Use {@link #DeleteDocuments(Term)} instead.
  284. /// </deprecated>
  285. public virtual int Delete(Term term)
  286. {
  287. return DeleteDocuments(term);
  288. }
  289. /// <summary> Deletes the document numbered <code>docNum</code>.</summary>
  290. /// <seealso cref="IndexReader.DeleteDocument(int)">
  291. /// </seealso>
  292. /// <throws>  IllegalStateException if the index is closed </throws>
  293. public virtual void  DeleteDocument(int docNum)
  294. {
  295. lock (directory)
  296. {
  297. AssureOpen();
  298. CreateIndexReader();
  299. indexReader.DeleteDocument(docNum);
  300. }
  301. }
  302. /// <summary> Deletes the document numbered <code>docNum</code>.</summary>
  303. /// <seealso cref="IndexReader.DeleteDocument(int)">
  304. /// </seealso>
  305. /// <throws>  IllegalStateException if the index is closed </throws>
  306. /// <deprecated> Use {@link #DeleteDocument(int)} instead.
  307. /// </deprecated>
  308. public virtual void  Delete(int docNum)
  309. {
  310. DeleteDocument(docNum);
  311. }
  312. /// <summary> Returns the number of documents currently in this index.</summary>
  313. /// <seealso cref="IndexWriter.DocCount()">
  314. /// </seealso>
  315. /// <seealso cref="IndexReader.NumDocs()">
  316. /// </seealso>
  317. /// <throws>  IllegalStateException if the index is closed </throws>
  318. public virtual int DocCount()
  319. {
  320. lock (directory)
  321. {
  322. AssureOpen();
  323. if (indexWriter != null)
  324. {
  325. return indexWriter.DocCount();
  326. }
  327. else
  328. {
  329. return indexReader.NumDocs();
  330. }
  331. }
  332. }
  333. /// <summary> Merges all segments together into a single segment, optimizing an index
  334. /// for search.
  335. /// </summary>
  336. /// <seealso cref="IndexWriter.Optimize()">
  337. /// </seealso>
  338. /// <throws>  IllegalStateException if the index is closed </throws>
  339. public virtual void  Optimize()
  340. {
  341. lock (directory)
  342. {
  343. AssureOpen();
  344. CreateIndexWriter();
  345. indexWriter.Optimize();
  346. }
  347. }
  348. /// <summary> If non-null, information about merges and a message when
  349. /// {@link #GetMaxFieldLength()} is reached will be printed to this.
  350. /// <p>Example: <tt>index.setInfoStream(System.err);</tt>
  351. /// </summary>
  352. /// <seealso cref="IndexWriter.SetInfoStream(PrintStream)">
  353. /// </seealso>
  354. /// <throws>  IllegalStateException if the index is closed </throws>
  355. public virtual void  SetInfoStream(System.IO.StreamWriter infoStream)
  356. {
  357. lock (directory)
  358. {
  359. AssureOpen();
  360. if (indexWriter != null)
  361. {
  362. indexWriter.SetInfoStream(infoStream);
  363. }
  364. this.infoStream = infoStream;
  365. }
  366. }
  367. /// <throws>  IOException </throws>
  368. /// <seealso cref="IndexModifier.SetInfoStream(PrintStream)">
  369. /// </seealso>
  370. public virtual System.IO.TextWriter GetInfoStream()
  371. {
  372. lock (directory)
  373. {
  374. AssureOpen();
  375. CreateIndexWriter();
  376. return indexWriter.GetInfoStream();
  377. }
  378. }
  379. /// <summary> Setting to turn on usage of a compound file. When on, multiple files
  380. /// for each segment are merged into a single file once the segment creation
  381. /// is finished. This is done regardless of what directory is in use.
  382. /// </summary>
  383. /// <seealso cref="IndexWriter.SetUseCompoundFile(boolean)">
  384. /// </seealso>
  385. /// <throws>  IllegalStateException if the index is closed </throws>
  386. public virtual void  SetUseCompoundFile(bool useCompoundFile)
  387. {
  388. lock (directory)
  389. {
  390. AssureOpen();
  391. if (indexWriter != null)
  392. {
  393. indexWriter.SetUseCompoundFile(useCompoundFile);
  394. }
  395. this.useCompoundFile = useCompoundFile;
  396. }
  397. }
  398. /// <throws>  IOException </throws>
  399. /// <seealso cref="IndexModifier.SetUseCompoundFile(boolean)">
  400. /// </seealso>
  401. public virtual bool GetUseCompoundFile()
  402. {
  403. lock (directory)
  404. {
  405. AssureOpen();
  406. CreateIndexWriter();
  407. return indexWriter.GetUseCompoundFile();
  408. }
  409. }
  410. /// <summary> The maximum number of terms that will be indexed for a single field in a
  411. /// document.  This limits the amount of memory required for indexing, so that
  412. /// collections with very large files will not crash the indexing process by
  413. /// running out of memory.<p/>
  414. /// Note that this effectively truncates large documents, excluding from the
  415. /// index terms that occur further in the document.  If you know your source
  416. /// documents are large, be sure to set this value high enough to accomodate
  417. /// the expected size.  If you set it to Integer.MAX_VALUE, then the only limit
  418. /// is your memory, but you should anticipate an OutOfMemoryError.<p/>
  419. /// By default, no more than 10,000 terms will be indexed for a field.
  420. /// </summary>
  421. /// <seealso cref="IndexWriter.SetMaxFieldLength(int)">
  422. /// </seealso>
  423. /// <throws>  IllegalStateException if the index is closed </throws>
  424. public virtual void  SetMaxFieldLength(int maxFieldLength)
  425. {
  426. lock (directory)
  427. {
  428. AssureOpen();
  429. if (indexWriter != null)
  430. {
  431. indexWriter.SetMaxFieldLength(maxFieldLength);
  432. }
  433. this.maxFieldLength = maxFieldLength;
  434. }
  435. }
  436. /// <throws>  IOException </throws>
  437. /// <seealso cref="IndexModifier.SetMaxFieldLength(int)">
  438. /// </seealso>
  439. public virtual int GetMaxFieldLength()
  440. {
  441. lock (directory)
  442. {
  443. AssureOpen();
  444. CreateIndexWriter();
  445. return indexWriter.GetMaxFieldLength();
  446. }
  447. }
  448. /// <summary> The maximum number of terms that will be indexed for a single field in a
  449. /// document.  This limits the amount of memory required for indexing, so that
  450. /// collections with very large files will not crash the indexing process by
  451. /// running out of memory.<p/>
  452. /// Note that this effectively truncates large documents, excluding from the
  453. /// index terms that occur further in the document.  If you know your source
  454. /// documents are large, be sure to set this value high enough to accomodate
  455. /// the expected size.  If you set it to Integer.MAX_VALUE, then the only limit
  456. /// is your memory, but you should anticipate an OutOfMemoryError.<p/>
  457. /// By default, no more than 10,000 terms will be indexed for a field.
  458. /// </summary>
  459. /// <seealso cref="IndexWriter.SetMaxBufferedDocs(int)">
  460. /// </seealso>
  461. /// <throws>  IllegalStateException if the index is closed </throws>
  462. public virtual void  SetMaxBufferedDocs(int maxBufferedDocs)
  463. {
  464. lock (directory)
  465. {
  466. AssureOpen();
  467. if (indexWriter != null)
  468. {
  469. indexWriter.SetMaxBufferedDocs(maxBufferedDocs);
  470. }
  471. this.maxBufferedDocs = maxBufferedDocs;
  472. }
  473. }
  474. /// <throws>  IOException </throws>
  475. /// <seealso cref="IndexModifier.SetMaxBufferedDocs(int)">
  476. /// </seealso>
  477. public virtual int GetMaxBufferedDocs()
  478. {
  479. lock (directory)
  480. {
  481. AssureOpen();
  482. CreateIndexWriter();
  483. return indexWriter.GetMaxBufferedDocs();
  484. }
  485. }
  486. /// <summary> Determines how often segment indices are merged by addDocument().  With
  487. /// smaller values, less RAM is used while indexing, and searches on
  488. /// unoptimized indices are faster, but indexing speed is slower.  With larger
  489. /// values, more RAM is used during indexing, and while searches on unoptimized
  490. /// indices are slower, indexing is faster.  Thus larger values (&gt; 10) are best
  491. /// for batch index creation, and smaller values (&lt; 10) for indices that are
  492. /// interactively maintained.
  493. /// <p>This must never be less than 2.  The default value is 10.
  494. /// 
  495. /// </summary>
  496. /// <seealso cref="IndexWriter.SetMergeFactor(int)">
  497. /// </seealso>
  498. /// <throws>  IllegalStateException if the index is closed </throws>
  499. public virtual void  SetMergeFactor(int mergeFactor)
  500. {
  501. lock (directory)
  502. {
  503. AssureOpen();
  504. if (indexWriter != null)
  505. {
  506. indexWriter.SetMergeFactor(mergeFactor);
  507. }
  508. this.mergeFactor = mergeFactor;
  509. }
  510. }
  511. /// <throws>  IOException </throws>
  512. /// <seealso cref="IndexModifier.SetMergeFactor(int)">
  513. /// </seealso>
  514. public virtual int GetMergeFactor()
  515. {
  516. lock (directory)
  517. {
  518. AssureOpen();
  519. CreateIndexWriter();
  520. return indexWriter.GetMergeFactor();
  521. }
  522. }
  523. /// <summary> Close this index, writing all pending changes to disk.
  524. /// 
  525. /// </summary>
  526. /// <throws>  IllegalStateException if the index has been closed before already </throws>
  527. public virtual void  Close()
  528. {
  529. lock (directory)
  530. {
  531. if (!open)
  532. throw new System.SystemException("Index is closed already");
  533. if (indexWriter != null)
  534. {
  535. indexWriter.Close();
  536. indexWriter = null;
  537. }
  538. else
  539. {
  540. indexReader.Close();
  541. indexReader = null;
  542. }
  543. open = false;
  544. }
  545. }
  546. public override System.String ToString()
  547. {
  548. return "Index@" + directory;
  549. }
  550. /*
  551. // used as an example in the javadoc:
  552. public static void main(String[] args) throws IOException {
  553. Analyzer analyzer = new StandardAnalyzer();
  554. // create an index in /tmp/index, overwriting an existing one:
  555. IndexModifier indexModifier = new IndexModifier("/tmp/index", analyzer, true);
  556. Document doc = new Document();
  557. doc.add(new Field("id", "1", Field.Store.YES, Field.Index.UN_TOKENIZED));
  558. doc.add(new Field("body", "a simple test", Field.Store.YES, Field.Index.TOKENIZED));
  559. indexModifier.addDocument(doc);
  560. int deleted = indexModifier.delete(new Term("id", "1"));
  561. System.out.println("Deleted " + deleted + " document");
  562. indexModifier.flush();
  563. System.out.println(indexModifier.docCount() + " docs in index");
  564. indexModifier.close();
  565. }*/
  566. }
  567. }