Lucene开发笔记(持续更新)

Posted on 2006-04-04 10:15  火鸟  阅读(386)  评论(0)    收藏  举报

一.建立查询对象的索引;

IndexSqlCreator.java


 import java.util.Iterator;
 import java.util.List;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexWriter;
 
 public class IndexSqlCreator
 {
    //建立索引的根目录,使用XML或Properties文件配置;
    private static final String INDEX_PATH="sqlindex";
    /** *//**
     * @param args
     */
    public void createIndex()
    {
        try
       {
            //建立索引,定义解析器;
            IndexWriter iw = new IndexWriter(IndexSqlCreator.INDEX_PATH,
                   new StandardAnalyzer(), true);
            //获得
            List l = SqlDocument.getDoc();
            for (Iterator it = l.iterator(); it.hasNext();)
            {
                iw.addDocument((Document) it.next());
            }
            iw.optimize();
            iw.close();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
SqlDocument.java


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;

import net.sf.hibernate.Query;
import net.sf.hibernate.Session;

public class SqlDocument
{
    private static final Logger logger =Logger.getLogger(SqlDocument.class);
    public static List getDoc()
    {
        List l_r=new ArrayList();
        try
        {
            /**//*
             * 以数据库中内容为数据源建立索引;
             */
            Session session = HibernateUtil.currentSession();
            Query query = session
                    .createQuery("from cn.neto.lyf.User as ui where ui.username like ?");
            query.setString(0, "%za%");
            List ql = query.list();
            /** *//**
             * 遍历所有数据源生成索引文档;
             * 可以使用任意数据,如文件,文档作为数据源;
             */
            for(Iterator it=ql.iterator();it.hasNext();)
            {
                User item=(User)it.next();
                Document doc=new Document();
                //不需要建立索引的字段,一般为表的主键;
                doc.add(new Field("id",item.getUserid().toString(),Field.Store.YES,Field.Index.NO));;
                //需要建立索引的字段,一般为需要查询的内容;
                doc.add(new Field("password",item.getPassword(),Field.Store.YES,Field.Index.UN_TOKENIZED));
                doc.add(new Field("username",item.getUsername(),Field.Store.YES,Field.Index.UN_TOKENIZED));
                //如果字段中包含中文,使用Field.Index.TOKENIZED;
                doc.add(new Field("realname",item.getRealname(),Field.Store.YES,Field.Index.TOKENIZED));
                doc.add(new Field("position",item.getPosition(),Field.Store.YES,Field.Index.NO));
                l_r.add(doc);
            }

        } catch (Exception e)
        {
            logger.error("ERROR",e.fillInStackTrace());
            e.printStackTrace();
        }
        return l_r;
    }
}


二.查询内容:

SearchDemo.java


 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.Hits;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Searcher;
 
public class SearchDemo
{

    public static void main(String[] args)
    {
        try
        {
            Searcher ss = new IndexSearcher("sqlindex");
            Analyzer aa = new StandardAnalyzer();
            BufferedReader r = new BufferedReader(new InputStreamReader(
                   System.in));
            while (true)
            {
                System.out.print("Query :");
                String name = r.readLine();
                if (name.toLowerCase().equals("exit"))//退出标志
                {
                    System.exit(-1);
                } else
                {
                    //建立查询分析器,确定分析的关键字'realname';
                    QueryParser qp = new QueryParser("realname", aa);
                    Query q=qp.parse(name);
                    System.out.println("[statment]:" + q.toString("realname"));
                    Hits hits = ss.search(q);
                    final int HIT_PAGE = 10;
                    System.out.println(hits.length()+ " result!");
                    for (int i = 0; i < hits.length(); i += HIT_PAGE)//遍历收缩结果
                    {
                        int end = Math.min(hits.length(), i + HIT_PAGE);
                        for (int l = i; l < end; l++)
                        {
                            Document doc = hits.doc(l);
                            System.out.println(l + "::" + doc.get("username"));
                            System.out.println(doc.get("password"));
                            System.out.println(doc.get("realname"));
                            System.out.println(doc.get("position"));
                        }
                        if (hits.length() > end)
                        {
                            System.out.print("more y/n?");
                            String flag = r.readLine();
                            if (flag.toLowerCase().equals("n"))
                            {
                                break;
                            }
                            if (flag.toLowerCase().equals("y"))
                            {
                                continue;
                            } else
                                break;
                        }
                    }
                }
            }

        } catch (Exception e)
        {
            e.printStackTrace();
        }

    }

}

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3