一个lucense的官网例子

创建索引:

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;



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;

import org.apache.lucene.index.Term;

import org.apache.lucene.index.IndexWriterConfig.OpenMode;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.FSDirectory;

import org.apache.lucene.util.Version;



public class CreateLuceneIndex {



    public static void main(String[] args) {

        if (args == null || args.length <= 0) {

            args = new String[] { 

                    "-index", 

                    "E:\\00.学习\\03.软件\\JAVA\\lu01\\index",

                    "-docs", 

                    "E:\\00.学习\\03.软件\\JAVA\\lu01\\doc" };

        }

        String indexPath = ""; 

        String docsPath = null; 

        boolean create = true;

        for (int i = 0; i < args.length; i++) {

            if ("-index".equals(args[i])) {

                indexPath = args[i + 1];

                i++;

            } else if ("-docs".equals(args[i])) {

                docsPath = args[i + 1];

                i++;

            } else if ("-update".equals(args[i])) {

                create = false;

            }

        }



        if (docsPath == null) {

            System.err.println("资源文件所在目录为空,请指定资源文件所在目录!!!");

            System.exit(1);

        }



        final File docDir = new File(docsPath);

        if (!docDir.exists() || !docDir.canRead()) {

            System.out.println("资源文件目录 '" + docDir.getAbsolutePath()

                    + "' 不存在或不可读,请检查!");

            System.exit(1);

        }



        Date start = new Date();

        try {

            System.out.println("建立索引文件到该目录 '" + indexPath + "'...");



            Directory dir = FSDirectory.open(new File(indexPath));

            Analyzer analyzer = new StandardAnalyzer();

            IndexWriterConfig iwc = new IndexWriterConfig(

                    Version.LUCENE_4_10_2, analyzer);

            if (create) {

                iwc.setOpenMode(OpenMode.CREATE);

            } else { iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); }

           IndexWriter writer = new IndexWriter(dir, iwc);

            indexDocs(writer, docDir);

            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());

        }

    }



    /**

     * 将资源文件索引到指定目录下,生成磁盘的索引文件

     * 

     * @param writer

     *            索引文件

     * @param file

     *            资源文件

     */

    static void indexDocs(IndexWriter writer, File file) throws IOException {

        if (!file.canRead()) {

            return;

        }

        if (file.isDirectory()) {

            String[] files = file.list();

            if (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) {

                return;

            }

            try {                

                Document doc = new Document();

                Field pathField = new StringField("path", file.getPath(),

                        Field.Store.YES);

                doc.add(pathField);

                doc.add(new LongField("modified", file.lastModified(),

                        Field.Store.NO));



                doc.add(new TextField("contents", new BufferedReader(

                        new InputStreamReader(fis, StandardCharsets.UTF_8))));



                if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {

                    System.out.println("adding " + file);

                    writer.addDocument(doc);

                } else {

                    System.out.println("updating " + file);

                    writer.updateDocument(new Term("path", file.getPath()), doc);

                }

            } finally {

                fis.close();

            }

        }

    }

}

 

全文检索:

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.nio.charset.StandardCharsets;

import java.util.Date;



import org.apache.lucene.analysis.Analyzer;

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

import org.apache.lucene.document.Document;

import org.apache.lucene.index.DirectoryReader;

import org.apache.lucene.index.IndexReader;

import org.apache.lucene.queryparser.classic.QueryParser;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.ScoreDoc;

import org.apache.lucene.search.TopDocs;

import org.apache.lucene.store.FSDirectory;



public class SearchFiles {



    public static void main(String[] args) throws Exception {

        args = new String[] { 

                "-index", 

                "E:\\00.学习\\03.软件\\JAVA\\lu01\\index" 

            };

        if (args.length > 0

                && ("-h".equals(args[0]) || "-help".equals(args[0]))) {

            System.exit(0);

        }



        String index = "index";

        String field = "contents";

        String queries = null;

        int repeat = 0;

        boolean raw = false;

        String queryString = null;

        int hitsPerPage = 10;



        for (int i = 0; i < args.length; i++) {

            if ("-index".equals(args[i])) {

                index = args[i + 1];

                i++;

            } else if ("-field".equals(args[i])) {

                field = args[i + 1];

                i++;

            } else if ("-queries".equals(args[i])) {

                queries = args[i + 1];

                i++;

            } else if ("-query".equals(args[i])) {

                queryString = args[i + 1];

                i++;

            } else if ("-repeat".equals(args[i])) {

                repeat = Integer.parseInt(args[i + 1]);

                i++;

            } else if ("-raw".equals(args[i])) {

                raw = true;

            } else if ("-paging".equals(args[i])) {

                hitsPerPage = Integer.parseInt(args[i + 1]);

                if (hitsPerPage <= 0) {

                    System.err.println("最少每页有1条数据");

                    System.exit(1);

                }

                i++;

            }

        }



        IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(

                index)));

        IndexSearcher searcher = new IndexSearcher(reader);

        // :Post-Release-Update-Version.LUCENE_XY:

        Analyzer analyzer = new StandardAnalyzer();



        BufferedReader in = null;

        if (queries != null) {

            in = new BufferedReader(new InputStreamReader(new FileInputStream(

                    queries), StandardCharsets.UTF_8));

        } else {

            in = new BufferedReader(new InputStreamReader(System.in,

                    StandardCharsets.UTF_8));

        }

        // :Post-Release-Update-Version.LUCENE_XY:

        QueryParser parser = new QueryParser(field,

                analyzer);

        while (true) {

            if (queries == null && queryString == null) { // prompt the user

                System.out.println("输入查询关键字: ");

            }



            String line = queryString != null ? queryString : in.readLine();



            if (line == null || line.length() == -1) {

                break;

            }



            line = line.trim();

            if (line.length() == 0) {

                break;

            }



            Query query = parser.parse(line);

            System.out.println("Searching for: " + query.toString(field));



            if (repeat > 0) { // repeat & time as benchmark

                Date start = new Date();

                for (int i = 0; i < repeat; i++) {

                    searcher.search(query, null, 100);

                }

                Date end = new Date();

                System.out.println("Time: " + (end.getTime() - start.getTime())

                        + "ms");

            }



            doPagingSearch(in, searcher, query, hitsPerPage, raw,

                    queries == null && queryString == null);



            if (queryString != null) {

                break;

            }

        }

        reader.close();

    }



    public static void doPagingSearch(BufferedReader in,

            IndexSearcher searcher, Query query, int hitsPerPage, boolean raw,

            boolean interactive) throws IOException {



        // Collect enough docs to show 5 pages

        TopDocs results = searcher.search(query, 5 * hitsPerPage);

        ScoreDoc[] hits = results.scoreDocs;



        int numTotalHits = results.totalHits;

        System.out.println(numTotalHits + " total matching documents");



        int start = 0;

        int end = Math.min(numTotalHits, hitsPerPage);



        while (true) {

            if (end > hits.length) {

                System.out

                        .println("Only results 1 - " + hits.length + " of "

                                + numTotalHits

                                + " total matching documents collected.");

                System.out.println("Collect more (y/n) ?");

                String line = in.readLine();

                if (line.length() == 0 || line.charAt(0) == 'n') {

                    break;

                }



                hits = searcher.search(query, numTotalHits).scoreDocs;

            }



            end = Math.min(hits.length, start + hitsPerPage);



            for (int i = start; i < end; i++) {

                if (raw) { // output raw format

                    System.out.println("doc=" + hits[i].doc + " score="

                            + hits[i].score);

                    continue;

                }



                Document doc = searcher.doc(hits[i].doc);

                String path = doc.get("path");

                if (path != null) {

                    System.out.println((i + 1) + ". " + path);

                    String title = doc.get("title");

                    if (title != null) {

                        System.out.println("   Title: " + doc.get("title"));

                    }

                } else {

                    System.out.println((i + 1) + ". "

                            + "No path for this document");

                }



            }



            if (!interactive || end == 0) {

                break;

            }



            if (numTotalHits >= end) {

                boolean quit = false;

                while (true) {

                    System.out.print("Press ");

                    if (start - hitsPerPage >= 0) {

                        System.out.print("(p)revious page, ");

                    }

                    if (start + hitsPerPage < numTotalHits) {

                        System.out.print("(n)ext page, ");

                    }

                    System.out

                            .println("(q)uit or enter number to jump to a page.");



                    String line = in.readLine();

                    if (line.length() == 0 || line.charAt(0) == 'q') {

                        quit = true;

                        break;

                    }

                    if (line.charAt(0) == 'p') {

                        start = Math.max(0, start - hitsPerPage);

                        break;

                    } else if (line.charAt(0) == 'n') {

                        if (start + hitsPerPage < numTotalHits) {

                            start += hitsPerPage;

                        }

                        break;

                    } else {

                        int page = Integer.parseInt(line);

                        if ((page - 1) * hitsPerPage < numTotalHits) {

                            start = (page - 1) * hitsPerPage;

                            break;

                        } else {

                            System.out.println("No such page");

                        }

                    }

                }

                if (quit)

                    break;

                end = Math.min(numTotalHits, start + hitsPerPage);

            }

        }

    }

}

 

你可能感兴趣的:(例子)