Lucene删除文档操作

Python ww9992019com 发表于 5 天前

<div style="width:100%;float:left;" class="article-content">

                <input type="hidden" name="article_id" id="article_id" value="5997">
                <input type="hidden" name="catid" id="catid" value="0">

                <p>

删除文档是另一个重要的操作,索引处理的一部分。此操作用于当已经索引内容被更新和索引变得无效或索引变得尺寸非常大,那么为了减少尺寸和更新索引,可以使用删除操作执行。</p>

<p>

我们删除文档包含字段到IndexWriter,IndexWriter用于更新索引。</p>

<p>

现在,我们将展示一个循序渐进的过程,获得一个任意文档来删除,通过一个基本的例子。</p>

<h2>

删除索引的文档。</h2>

<ul>

<li>

    <p>

        创建到删除过时的文本,使用 Lucene 文档的方法。</p>

</li>

</ul>

<pre class="prettyprint">

private void deleteDocument(File file) throws IOException{

//delete indexes for a file

writer.deleteDocument(new Term(LuceneConstants.FILE_NAME,file.getName()));

writer.commit();

System.out.println("index contains deleted files: "+writer.hasDeletions());

System.out.println("index contains documents: "+writer.maxDoc());

System.out.println("index contains deleted documents: "+writer.numDoc());

}
</pre>

<h2>

创建IndexWriter</h2>

<ul>

<li>

    <p>

        IndexWriter 类作为它在索引过程中创建/更新索引的核心组成部分。</p>

</li>

<li>

    <p>

        创建IndexWriter的对象。</p>

</li>

<li>

    <p>

        创建其应指向位置,其中索引是存储一个 lucene 目录。</p>

</li>

<li>

    <p>

        初始化索引目录,有标准的分析版本信息和其他所需/可选参数创建 IndexWricrter 对象。</p>

</li>

</ul>

<pre class="prettyprint">

private IndexWriter writer;

public Indexer(String indexDirectoryPath) throws IOException{

//this directory will contain the indexes

Directory indexDirectory =

  FSDirectory.open(new File(indexDirectoryPath));

//create the indexer

writer = new IndexWriter(indexDirectory,

  new StandardAnalyzer(Version.LUCENE_36),true,

  IndexWriter.MaxFieldLength.UNLIMITED);

}
</pre>

<h2>

删除文档,并开始重建索引过程</h2>

<p>

下面两个是删除文档的方式。</p>

<ul>

<li>

    <p>

        deleteDocuments(Term) - 删除所有包含这个词条的文件。</p>

</li>

<li>

    <p>

        deleteDocuments(Term[]) - 删除全部包含任何阵列中的词条的文档。</p>

</li>

<li>

    <p>

        deleteDocuments(Query) - 删除所有与查询匹配的文档。</p>

</li>

<li>

    <p>

        deleteDocuments(Query[]) - 删除所有匹配阵列中的查询的文档。</p>

</li>

<li>

    <p>

        deleteAll - 删除所有文件。</p>

</li>

</ul>

<pre class="prettyprint">

private void indexFile(File file) throws IOException{

System.out.println("Deleting index for "+file.getCanonicalPath());

deleteDocument(file);

}
</pre>

<h2>

应用程序示例</h2>

<p>

让我们创建一个测试Lucene的应用程序来测试索引处理。</p>

<table class="src">

<tbody>

    <tr>

        <th class="fivepct">

            步骤</th>

        <th>

            描述</th>

    </tr>

    <tr>

        <td>

            1</td>

        <td>

            创建一个LuceneFirstApplication在包packagecom.yiibai.lucene下。也可以使用EJB创建的项目</td>

    </tr>

    <tr>

        <td>

            2</td>

        <td>

            创建LuceneConstants.java,TextFileFilter.java和Indexer.java。保持其它的文件不变</td>

    </tr>

    <tr>

        <td>

            3</td>

        <td>

            创建LuceneTester.java 如下所述</td>

    </tr>

    <tr>

        <td>

            4</td>

        <td>

            清理和构建应用程序,以确保业务逻辑按要求工作</td>

    </tr>

</tbody>

</table>

<p>

<i>LuceneConstants.java</i></p>

<p>

这个类是用来提供可应用于示例应用程序中使用的各种常量。</p>

<pre class="prettyprint">

package com.yiibai.lucene;

public class LuceneConstants {

public static final String CONTENTS="contents";

public static final String FILE_NAME="filename";

public static final String FILE_PATH="filepath";

public static final int MAX_SEARCH = 10;

}
</pre>

<p>

<i>TextFileFilter.java</i></p>

<p>

此类用于 .txt 文件过滤器</p>

<pre class="prettyprint">

package com.yiibai.lucene;

import java.io.File;

import java.io.FileFilter;

public class TextFileFilter implements FileFilter {

@Override

public boolean accept(File pathname) {

  return pathname.getName().toLowerCase().endsWith(".txt");

}

}
</pre>

<p>

<i>Indexer.java</i></p>

<p>

这个类是用于索引的原始数据,这样我们就可以使用Lucene库,使其可搜索。</p>

<pre class="prettyprint">

package com.yiibai.lucene;

import java.io.File;

import java.io.FileFilter;

import java.io.FileReader;

import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.FSDirectory;

import org.apache.lucene.util.Version;

public class Indexer {

private IndexWriter writer;

public Indexer(String indexDirectoryPath) throws IOException{

  //this directory will contain the indexes

  Directory indexDirectory =

     FSDirectory.open(new File(indexDirectoryPath));



  //create the indexer

  writer = new IndexWriter(indexDirectory,

     new StandardAnalyzer(Version.LUCENE_36),true,

     IndexWriter.MaxFieldLength.UNLIMITED);

}

public void close() throws CorruptIndexException, IOException{

  writer.close();

}

private void deleteDocument(File file) throws IOException{

  //delete indexes for a file

  writer.deleteDocuments(

     new Term(LuceneConstants.FILE_NAME,file.getName()));



  writer.commit();

}

private void indexFile(File file) throws IOException{

  System.out.println("Deleting index: "+file.getCanonicalPath());

  deleteDocument(file);

}

public int createIndex(String dataDirPath, FileFilter filter)

  throws IOException{

  //get all files in the data directory

  File[] files = new File(dataDirPath).listFiles();



  for (File file : files) {

     if(!file.isDirectory()

        &amp;&amp; !file.isHidden()

        &amp;&amp; file.exists()

        &amp;&amp; file.canRead()

        &amp;&amp; filter.accept(file)

     ){

        indexFile(file);

     }

  }

  return writer.numDocs();

}

}
</pre>

<p>

<i>LuceneTester.java</i></p>

<p>

这个类是用来测试的Lucene库的索引能力</p>

<pre class="prettyprint">

package com.yiibai.lucene;

import java.io.IOException;

public class LuceneTester {

String indexDir = "E:\Lucene\Index";

String dataDir = "E:\Lucene\Data";

Indexer indexer;

public static void main(String[] args) {

  LuceneTester tester;

  try {

     tester = new LuceneTester();

     tester.createIndex();

  } catch (IOException e) {

     e.printStackTrace();

  }

}

private void createIndex() throws IOException{

  indexer = new Indexer(indexDir);

  int numIndexed;

  long startTime = System.currentTimeMillis();

  numIndexed = indexer.createIndex(dataDir, new TextFileFilter());

  long endTime = System.currentTimeMillis();

  indexer.close();

}

}
</pre>

<h2>

数据和索引目录的创建</h2>

<p>

使用10个文件从 record1.txt 到 record10.txt 的文本文件包含简单的名称以及学生的其他细节,并把它们放在目录 E:LuceneData。这些数据用于测试。索引目录路径应创建为E:LuceneIndex。运行此程序后,就可以看到该文件夹中创建的索引文件的列表。</p>

<h2>

运行程序:</h2>

<p>

一旦创建源,创造了原始数据,数据目录和索引目录来完成,准备好这一步是编译和运行程序。要做到这一点,在LuceneTester.Java文件选项卡中使用Eclipse IDE 的Run选项,或使用Ctrl+ F11来编译和运行应用程序LuceneTester。如果应用程序一切正常,将在Eclipse IDE控制台打印以下消息:</p>

<pre class="result">

Deleting index E:LuceneData
ecord1.txt

Deleting index E:LuceneData
ecord10.txt

Deleting index E:LuceneData
ecord2.txt

Deleting index E:LuceneData
ecord3.txt

Deleting index E:LuceneData
ecord4.txt

Deleting index E:LuceneData
ecord5.txt

Deleting index E:LuceneData
ecord6.txt

Deleting index E:LuceneData
ecord7.txt

Deleting index E:LuceneData
ecord8.txt

Deleting index E:LuceneData
ecord9.txt

10 File indexed, time taken: 109 ms
</pre>

<p>

一旦成功地运行程序,将有以下的索引目录中的内容:</p>

<img alt="Lucene Index Directory" src="/uploads/allimg/141129/1R4263450-0.jpg">

<div>

 </div>



                <br>
                <p style="text-align:center;float:left;width:100%;margin-top:24px;margin-bottom:18px;">
                        <button class="layui-btn layui-btn-danger" id="btn-reward"> ¥ 我要打赏 </button>  
                        <button class="layui-btn" id="article-perfect">
                            <i class="layui-icon layui-icon-edit"></i>教程纠错
                        </button>
                        <button class="layui-btn layui-btn-normal" id="action-collection">
                            <i class="layui-icon layui-icon-rate"></i>收藏
                        </button>
                </p>



                <div style="width:100%;margin-bottom: 16px; height: 32px;margin-top:18px;float:left;">

                    <span style="float:left;">上一篇:<a href="http://f2e.im/u/ww9992019com" title="Lucene更新文档操作"><i class="layui-icon"></i>
                            Lucene更新文档操作</a></span>
                                            <span style="float:right;">下一篇:<a href="http://f2e.im/u/ww9992019com" style="float:right;" title="下一篇:Lucene Field选项"><i class="layui-icon"></i>
                            Lucene Field选项</a></span>
                                            <div id="googlead" style="float:left;margin-top:8px;">
                        <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
                        <!-- yiibai下方 -->
                        <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-1090193214637198" data-ad-slot="6494738921"></ins>
                        <script>
                            (adsbygoogle = window.adsbygoogle || []).push({});
                        </script>
                    </div>
                </div>

                <div style="width:100%;margin-top:18px;float:left;">


            </div>
暂无回复,说出你的观点吧
登录后即可参与回复