Lucene是一个开源的全文检索引擎,它可以帮助用户快速地搜索出想要的信息。Lucene的核心原理是建立一个索引,将文本转化为可以被搜索的数据,然后根据用户输入的关键字来进行匹配。
Lucene的工作原理如下:
1. 首先,Lucene会对文本进行分词处理,将文本分割成一个个单词。 2. 然后,Lucene会对单词进行建立索引,将单词和它所在文本之间建立联系。 3. 接着,当用户输入关键字时,Lucene会根据用户输入的关键字来匹配相应的单词。 4. 最后,Lucene会根据匹配到的单词来找出相应的文本并显示出来。
总之,Lucene是一个很好用的全文检索引擎,它能够帮助用户快速地找到想要的信息。它通过对文本进行分词、建立索引、匹配单词以及显示相应文本来实现快速、准确地信息检索。
搜索过程是进行搜索的过程。
下表列出了在搜索过程中使用的类。
类 | 描述 |
---|---|
IndexSearcher | 读取/搜索索引处理后创建的索引。 |
Term | 搜索的最低单位。它类似于索引过程中的字段。 |
Query | 抽象类,包含各种实用程序方法,是所有类型查询的父类。 |
TermQuery | TermQuery是一个查询对象,我们可以使用它来创建许多复杂的查询。 |
TopDocs | TopDocs存储前N个搜索结果。 |
以下代码显示如何搜索索引的文件。
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; import org.apache.lucene.util.Version; public class Main { private Main() {} public static void main(String[] args) throws Exception { String usage = "Usage:tjava SearchFiles [-index dir] [-field f] [-repeat n] [-queries file] [-query string] [-raw] [-paging hitsPerPage]nnSee http://lucene.apache.org/core/4_1_0/demo/ for details."; if (args.length > 0 && ("-h".equals(args[0]) || "-help".equals(args[0]))) { System.out.println(usage); 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("There must be at least 1 hit per page."); 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(Version.LUCENE_4_10_0); 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(Version.LUCENE_4_10_0, field, analyzer); while (true) { if (queries == null && queryString == null) { // prompt the user System.out.println("Enter query: "); } 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); } } } }
Java XML教程 -Java DOM编辑属性以下代码显示如何向元素添加属性。import java.io.StringWriter;import javax.xml.parsers.Docum...
Java线程教程 -Java线程优先级所有线程都有优先级。优先级由1到10之间的整数表示。优先级为1的线程优先级最低。优先级为10的线程...
JavaFX教程 -JavaFX滑块滑块可以显示和与一系列数值进行交互。滑块控件有两件事:一个轨道和一个可拖动的拇指。在轨道上,我们可...
Java日期时间 -Java特定区域格式我们可以从不同的语言环境创建DateTimeFormatter。DateTimeFormatter ofLocalizedDate(FormatSty...