电影网站开发视频,崇左网站建设,比亚迪新能源汽车价格,深圳网站建设前十名Lucene教程 - Lucene索引文件 索引是识别文档并为搜索准备文档的过程。
下表列出了索引过程中常用的类。
类描述IndexWriter在索引过程中创建/更新索引。Directory表示索引的存储位置。Analyzer分析文档并从文本中获取标记/单词。Document带有字段的虚拟文档。分析仪可以处理…Lucene教程 - Lucene索引文件 索引是识别文档并为搜索准备文档的过程。
下表列出了索引过程中常用的类。
类描述IndexWriter在索引过程中创建/更新索引。Directory表示索引的存储位置。Analyzer分析文档并从文本中获取标记/单词。Document带有字段的虚拟文档。分析仪可以处理文档。Field索引过程的最低单位。它表示键值对其中键用于标识索引值。
例子
以下代码显示了如何使用Lucene索引文本文件。
/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the License); you may not use this file except in compliance with* the License. You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an AS IS BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Date;/** Index all text files under a directory.* p* This is a command-line application demonstrating simple Lucene indexing.* Run it with no command-line arguments for usage information.*/
public class Main {private Main() {}/** Index all text files under a directory. */public static void main(String[] args) {String usage java IndexFiles [-index INDEX_PATH] [-docs DOCS_PATH] [-update]\n\n This indexes the documents in DOCS_PATH, creating a Lucene index in INDEX_PATH that can be searched with SearchFiles;String indexPath index;String docsPath null;boolean create true;for(int i0;iargs.length;i) {if (-index.equals(args[i])) {indexPath args[i1];i;} else if (-docs.equals(args[i])) {docsPath args[i1];i;} else if (-update.equals(args[i])) {create false;}}if (docsPath null) {System.err.println(Usage: usage);System.exit(1);}final File docDir new File(docsPath);if (!docDir.exists() || !docDir.canRead()) {System.out.println(Document directory docDir.getAbsolutePath() does not exist or is not readable, please check the path);System.exit(1);}Date start new Date();try {System.out.println(Indexing to directory indexPath ...);Directory dir FSDirectory.open(new File(indexPath));// :Post-Release-Update-Version.LUCENE_XY:Analyzer analyzer new StandardAnalyzer(Version.LUCENE_4_10_0);IndexWriterConfig iwc new IndexWriterConfig(Version.LUCENE_4_10_0, analyzer);if (create) {// Create a new index in the directory, removing any// previously indexed documents:iwc.setOpenMode(OpenMode.CREATE);} else {// Add new documents to an existing index:iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);}// Optional: for better indexing performance, if you// are indexing many documents, increase the RAM// buffer. But if you do this, increase the max heap// size to the JVM (eg add -Xmx512m or -Xmx1g)://// iwc.setRAMBufferSizeMB(256.0);IndexWriter writer new IndexWriter(dir, iwc);indexDocs(writer, docDir);// NOTE: if you want to maximize search performance,// you can optionally call forceMerge here. This can be// a terribly costly operation, so generally its only// worth it when your index is relatively static (ie// youre done adding documents to it)://// writer.forceMerge(1);writer.close();Date end new Date();System.out.println(end.getTime() - start.getTime() total milliseconds);} catch (IOException e) {System.out.println( caught a e.getClass() \n with message: e.getMessage());}}/*** Indexes the given file using the given writer, or if a directory is given,* recurses over files and directories found under the given directory.* * NOTE: This method indexes one document per input file. This is slow. For good* throughput, put multiple documents into your input file(s). An example of this is* in the benchmark module, which can create line doc files, one document per line,* using the* a href../../../../../contrib-benchmark/org/apache/lucene/benchmark/byTask/tasks/WriteLineDocTask.html* WriteLineDocTask/a.* * param writer Writer to the index where the given file/dir info will be stored* param file The file to index, or the directory to recurse into to find files to index* throws IOException If there is a low-level I/O error*/static void indexDocs(IndexWriter writer, File file)throws IOException {// do not try to index files that cannot be readif (file.canRead()) {if (file.isDirectory()) {String[] files file.list();// an IO error could occurif (files ! null) {for (int i 0; i files.length; i) {indexDocs(writer, new File(file, files[i]));}}} else {FileInputStream fis;try {fis new FileInputStream(file);} catch (FileNotFoundException fnfe) {// at least on windows, some temporary files raise this exception with an access denied message// checking if the file can be read doesnt helpreturn;}try {// make a new, empty documentDocument doc new Document();// Add the path of the file as a field named path. Use a// field that is indexed (i.e. searchable), but dont tokenize // the field into separate words and dont index term frequency// or positional information:Field pathField new StringField(path, file.getPath(), Field.Store.YES);doc.add(pathField);// Add the last modified date of the file a field named modified.// Use a LongField that is indexed (i.e. efficiently filterable with// NumericRangeFilter). This indexes to milli-second resolution, which// is often too fine. You could instead create a number based on// year/month/day/hour/minutes/seconds, down the resolution you require.// For example the long value 2011021714 would mean// February 17, 2011, 2-3 PM.doc.add(new LongField(modified, file.lastModified(), Field.Store.NO));// Add the contents of the file to a field named contents. Specify a Reader,// so that the text of the file is tokenized and indexed, but not stored.// Note that FileReader expects the file to be in UTF-8 encoding.// If thats not the case searching for special characters will fail.doc.add(new TextField(contents, new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))));if (writer.getConfig().getOpenMode() OpenMode.CREATE) {// New index, so we just add the document (no old document can be there):System.out.println(adding file);writer.addDocument(doc);} else {// Existing index (an old copy of this document may have been indexed) so // we use updateDocument instead to replace the old one matching the exact // path, if present:System.out.println(updating file);writer.updateDocument(new Term(path, file.getPath()), doc);}} finally {fis.close();}}}}
}