博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】一个lucene的官网例子
阅读量:6567 次
发布时间:2019-06-24

本文共 13559 字,大约阅读时间需要 45 分钟。

创建索引:

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

 //************************************************************************************************************************

新增部分基础概念的梳理:参考lucene 实战

1、基本概念
lucence 可以认为分为两大组件:
1)索引组件
a、内容获取:即将原始的内容材料,可以是数据库、网站(爬虫)、文本转换为lucence的Docment
Docment 为若干个带值得域
b、文档分析:利用分词器对文档进行分析;
c、建立索引:根据文档分析的结构建立索引文件;
2)搜索组件
a、建立查询:即将用户请求转换为搜索引擎支持的查询对象格式;
b、执行搜索查询;并反馈Document结果集;
2、官方样例代码分析
**索引组件部分工作
1、创建一个包含某个分词器的IndexWriter
private IndexWriter writer;
writer = new IndexWriter(IndexDir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
2、遍历被索引的文件(即原始内容)将其转换为Document
Docment doc = new Docment();
doc.add(new Field("contents", new FileReader(f));
doc.add(new Field("filename"), f.getName(), Field.Store.Yes, Field.Index.NOT_ANALYZED);
3、针对该Docment创建索引
writer.addDocment(doc);
**搜索组件部分工作
1、打开索引文件
IndexSearcher is = new IndexSearcher(IndexDir);
2、创建一个查询对象
QueryParser parser = new QueryParser(Version.LUCENE_30, "contents", new StandardAnalyzer());
Query query = parser("要找的查询关键字");
3、执行查询并返回结果
TopDocs hits = is.search(query, 10);

转载于:https://www.cnblogs.com/Fredric-2013/p/4433161.html

你可能感兴趣的文章
HTTP长连接和短连接以及推送服务原理(转)
查看>>
问卷设计入门
查看>>
input子系统分析之三:驱动模块
查看>>
jquery 选择时间(小时)区间(四)
查看>>
jquery 选择时间(小时)区间(二)
查看>>
WebService的编写与调用
查看>>
(模板)字符串哈希
查看>>
input:focus
查看>>
java中String,int,Integer,char、double类型转换
查看>>
Hdoj 2544
查看>>
nginx转发端口路由器再转发
查看>>
在eclipse里的 flex 没有可视化的编辑
查看>>
python 列出出当前目录及所有子目录下的文件
查看>>
RabbitMQ错误检查
查看>>
OSI模型
查看>>
对于数据库连接池的一些思考和MyBatis的集成与使用
查看>>
[SDOI2016]征途
查看>>
[JSOI2018]军训列队
查看>>
[TJOI2013]最长上升子序列
查看>>
Extjs之window异步拦截关闭事件beforeClose的实现
查看>>