Java tutorial
package com.paladin.sys.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.queryParser.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; import org.apache.lucene.util.Version; import java.io.*; import java.util.Date; import static java.lang.System.err; import static java.lang.System.out; /** * Simple command-line based search demo. */ public class SearchFiles { private static short numPerPage = 10; private SearchFiles() { } /** * Simple command-line based search demo. * * @throws Exception */ public static void main(String[] args) throws Exception { final String usage = "Usage:\tjava org.apache.lucene.demo.SearchFiles [-index dir] [-field f] " + "[-repeat n] [-queries file] [-query string] [-raw] [-paging numPerPage]\n\n" + "See http://lucene.apache.org/java/4_0/demo.html for details."; args = new String[] { "-index", "D:\\myData\\luceneIdx" }; if (args.length > 0 && ("-h".equals(args[0]) || "-help".equals(args[0]))) { out.println(usage); System.exit(0); } String index = "index"; String field = "contents"; int repeat = 0; boolean raw = false; String queryString = null; 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 ("-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])) { numPerPage = Short.parseShort(args[i + 1]); if (numPerPage <= 0) { err.println("?1?:("); System.exit(1); } i++; } } IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(index))); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31); BufferedReader buffered_reader = new BufferedReader(new InputStreamReader(System.in, "UTF-8")); QueryParser parser = new QueryParser(Version.LUCENE_31, field, analyzer); while (true) { out.print(": "); String key = queryString != null ? queryString : buffered_reader.readLine(); if (key == null || key.trim().length() == 0) break; Query query = parser.parse(key); out.println(": " + query.toString(field)); if (repeat > 0) {// ??N Date start = new Date(); for (int i = 0; i < repeat; i++) { searcher.search(query, null, 100); } Date end = new Date(); out.println(": " + (end.getTime() - start.getTime()) + "ms"); } // ? doPagingSearch(buffered_reader, searcher, query, raw, queryString == null); if (queryString != null) break; } searcher.close(); } /** * This demonstrates a typical paging search scenario, where the search engine presents * pages of size n to the user. The user can then go to the next page if interested in * the next hits. * <p/> * When the query is executed for the first time, then only enough results are collected * to fill 5 result pages. If the user wants to page beyond this limit, then the query * is executed another time and all hits are collected. */ public static void doPagingSearch(final BufferedReader in, final IndexSearcher searcher, final Query query, boolean raw, boolean interactive) throws IOException { //?5? TopDocs top_result = searcher.search(query, 5 * numPerPage); // int total_hits = top_result.totalHits; out.println(" " + total_hits + " ??"); // ID int start = 0; int end = Math.min(total_hits, numPerPage);// ???? // ? ScoreDoc[] hits = top_result.scoreDocs; while (true) { if (end > hits.length) { out.print("?? " + total_hits + " ? 1 - " + hits.length + " ??(y/n) "); String line = in.readLine(); if (line.length() == 0 || line.charAt(0) == 'n') break; hits = searcher.search(query, total_hits).scoreDocs; } end = Math.min(hits.length, start + numPerPage); for (int i = start; i < end; i++) { if (raw) { 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) out.println(" : " + doc.get("title")); } else out.println((i + 1) + ". " + " path "); } // ?? if (!interactive || end == 0) break; // if (total_hits >= end) { boolean quit = false; while (true) { if (start - numPerPage >= 0) out.print("(p), "); if (start + numPerPage < total_hits) out.print("(n), "); out.println("(q) (...)"); 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 - numPerPage); break; } else if (line.charAt(0) == 'n') { if (start + numPerPage < total_hits) start += numPerPage; break; } else { try { int page = Integer.parseInt(line); if ((page - 1) * numPerPage < total_hits) { start = (page - 1) * numPerPage; break; } else out.println("??"); } catch (NumberFormatException e) { out.println("???"); } } } if (quit) break; end = Math.min(total_hits, start + numPerPage); } } } }