⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lucenesearcher.java

📁 java写的blog
💻 JAVA
字号:
/*
 * Created on 2004-11-1
 * Author: Xuefeng, Copyright (C) 2004, Xuefeng.
 */
package org.crystalblog.search;

import java.io.*;
import java.util.*;

import org.springframework.core.io.Resource;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;

import org.crystalblog.domain.*;
import org.crystalblog.web.filter.HighlightFilter;

/**
 * Lucene searcher facade.
 * 
 * @author Xuefeng
 */
public class LuceneSearcher {

    private int optimize = 20;

    private String directory; // lucene base directory
    private Analyzer analyzer = new StandardAnalyzer();

    public void setDirectory(Resource resource) {
        try {
            directory = resource.getFile().getPath();
            if(!new File(directory).isDirectory())
                throw new Exception("Directory is not exist: " + directory);
            System.out.println("[INFO] Lucene indexer directory: " + directory);
        }
        catch(Exception e) {
            throw new RuntimeException("[WARNING] Failed in init lucene. Message: " + e.getMessage());
        }
    }

    // search: num is [10, 100]
    public SearchResult search(String q, int num, int page) {
        if(q==null || page<=0 || num<10 || num>100)
            return SearchResult.EMPTY;
        q = q.trim();
        if(q.equals(""))
            return SearchResult.EMPTY;
        Searcher searcher = null;
        try {
            searcher = new IndexSearcher(directory);
            Query query = QueryParser.parse(q, "content", new StandardAnalyzer());
            Hits hits = searcher.search(query);
            if(hits != null){
                int results = hits.length();
                if(results==0)
                    return SearchResult.EMPTY;
                System.out.println("found " + results + " results.");
                // how many pages:
                int pages = results / num + (results%num==0 ? 0 : 1);
                // start from:
                int start = num * (page-1);
                if(start>=results) { // out of page
                    page = 1;
                    start = 0;
                }
                // and end at:
                int end = start + num;
                if(end>=results)
                    end = results-1;
                // load all result items:
                List resultItems = new ArrayList(end-start+1);
                String[] keywords = q.split("[+ ]");
                for(int i = start;i <= end; i++) {
                    Document doc = hits.doc(i);
                    resultItems.add(new ResultItem(
                        doc.get("articleId"),
                        doc.get("title"),
                        doc.get("summary"),
                        /* if we want to highlight the keyword */
                        HighlightFilter.highlight(doc.get("content"), keywords),
                        doc.get("createdDate"),
                        doc.get("updatedDate")
                        )
                    );
                    System.out.println("[Result] " + i + ": in article " + doc.get("articleId"));
                }
                return new SearchResult(q, results, start+1, end+1, num, page, pages, resultItems);
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        finally {
            if(searcher!=null) {
                try { searcher.close(); } catch(Exception e) {}
            }
        }
        return SearchResult.EMPTY;
    }

    public SearchResult searchByAccount(int accountId, String q, int num, int page) {
        //
        return null;
    }

    // index the article:
    public void index(Article article) {
        System.out.println("[INFO] Try to index article: " + article.getTitle());
        System.out.println("article content:\n" + article.getContent());
        IndexWriter indexWriter = null;
        try {
            indexWriter = new IndexWriter(directory, new StandardAnalyzer(), false);
            Document doc = new Document();
            doc.add(Field.Keyword("articleId", "" + article.getArticleId()));
            doc.add(Field.Keyword("accountId", "" + article.getAccountId()));
            doc.add(Field.Keyword("createdDate", article.getCreatedDate().toString()));
            doc.add(Field.Keyword("updatedDate", article.getUpdatedDate().toString()));
            doc.add(Field.Text("title", article.getTitle()));
            doc.add(Field.Text("summary", article.getSummary()));
            doc.add(Field.Text("content", article.getContent()));
            indexWriter.addDocument(doc);
            if(article.getArticleId() % optimize == 0)
                indexWriter.optimize();
        }
        catch(IOException ioe) {
            ioe.printStackTrace();
        }
        finally {
            if(indexWriter!=null) {
                try { indexWriter.close(); } catch(Exception e) {}
            }
        }
    }

    // unindex the article:
    public void unindex(int articleId) {
        System.out.println("[INFO] Try to unindex article: ");
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -