﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-软件工程学习</title><link>http://www.blogjava.net/hujiongbusiness/</link><description>java学习</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 06:20:07 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 06:20:07 GMT</pubDate><ttl>60</ttl><item><title>lucene的例子</title><link>http://www.blogjava.net/hujiongbusiness/archive/2009/06/21/lucene.html</link><dc:creator>胡炯</dc:creator><author>胡炯</author><pubDate>Sun, 21 Jun 2009 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/hujiongbusiness/archive/2009/06/21/lucene.html</guid><wfw:comment>http://www.blogjava.net/hujiongbusiness/comments/283447.html</wfw:comment><comments>http://www.blogjava.net/hujiongbusiness/archive/2009/06/21/lucene.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/hujiongbusiness/comments/commentRss/283447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hujiongbusiness/services/trackbacks/283447.html</trackback:ping><description><![CDATA[<h1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 24pt">&nbsp;&nbsp;&nbsp; Lucene的例子<br />
</span></h1>
lucene爬数据库中的数据无非也是查询数据。所有我们用lucene搜索数据主要有下面几个步骤：(代码紧供参考)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一&nbsp; ，&nbsp;<span style="color: red">&nbsp;从数据库中查数据 ====爬数据&nbsp;&nbsp;-------------1<br />
<br />
</span>&nbsp;&nbsp;&nbsp;public ArrayList&lt;BaseItem&gt; getDate(String sql) throws SQLException {<br />
&nbsp;&nbsp;ArrayList&lt;BaseItem&gt; item = new ArrayList&lt;BaseItem&gt;();<br />
&nbsp;&nbsp;ConnBase dataConn = new ConnBase();//数据库连接<br />
&nbsp;&nbsp;conn = dataConn.DBconn();<br />
&nbsp;&nbsp;ps = conn.prepareStatement(sql);<br />
&nbsp;&nbsp;rs = ps.executeQuery();<br />
&nbsp;&nbsp;// jdbcTemplate.execute(sql);<br />
&nbsp;&nbsp;while (rs.next()) {<br />
&nbsp;&nbsp;&nbsp;BaseItem i = new BaseItem();<br />
&nbsp;&nbsp;&nbsp;i.setTitle(rs.getString("title")); // 对应你的Blog表里的title<br />
&nbsp;&nbsp;&nbsp;i.setContent(rs.getString("content")); // 取表里的博客内容<br />
&nbsp;&nbsp;&nbsp;i.setUr("SingleArticle_lucene.action?id=" + rs.getInt("blogId")); // 如 a. action ?id=8<br />
&nbsp;&nbsp;&nbsp;item.add(i);<br />
&nbsp;&nbsp;} // 把数据库里的数据取出来<br />
&nbsp;&nbsp;return item;<br />
&nbsp;}<br />
&nbsp;&nbsp; 二 ，<span style="color: #ff0000">&nbsp;// 建立索引存放的位置 ------本方法是创建 在C盘--------------------2</span><span style="color: #ff0000"><br />
<br />
<p><span style="color: #000000">&nbsp;public void CreateFileIndex(String dir) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;/* 这里放索引文件的位置 */<br />
&nbsp;&nbsp;&nbsp;File indexDir = new File("c:\\" + dir); // 存放 检索文件的路径<br />
&nbsp;&nbsp;&nbsp;if (!indexDir.exists()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;indexDir.mkdirs();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;// 创建标准文本分析器， 标准的是可以支持的中文的</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp;Analyzer luceneAnalyzer = new StandardAnalyzer();<br />
&nbsp;&nbsp;&nbsp;indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true);<br />
&nbsp;&nbsp;&nbsp;// 可以说是创建一个新的写入工具<br />
&nbsp;&nbsp;&nbsp;// 第一个参数是要索引建立在哪个目录里<br />
&nbsp;&nbsp;&nbsp;// 第二个参数是新建一个文本分析器,这里用的是标准的大家也可以自己写一个<br />
&nbsp;&nbsp;&nbsp;// 第三个参数如果是true，在建立索引之前先将c: \\index目录清空<br />
&nbsp;&nbsp;&nbsp;indexWriter.setMaxFieldLength(100000);<br />
&nbsp;&nbsp;&nbsp;indexWriter.optimize();<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("建立索引失败!!!");<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
</span></p>
<br />
<br />
三 <span style="color: #ff0000">， // 添加数据到索引里去-----------------3</span><br />
<br />
<span style="color: #000000">&nbsp;public String createIndex(String title, String url, String content) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;// 增加document到索引去<br />
&nbsp;&nbsp;&nbsp;// document对象，相当于数据库中一条记录<br />
&nbsp;&nbsp;&nbsp;Document document = new Document();<br />
&nbsp;&nbsp;&nbsp;// Field对象，相当于数据库中字段<br />
&nbsp;&nbsp;&nbsp;Field FiledTitle = new Field("title", title, Field.Store.YES,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field.Index.ANALYZED);// Field.Index.ANALYZED 这就能进行索引了, 如果设置为NO的话就不能检索<br />
&nbsp;&nbsp;&nbsp;Field FiledContent = new Field("content", content, Field.Store.YES,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field.Index.ANALYZED);<br />
&nbsp;&nbsp;&nbsp;Field FieldBody = new Field("url", url, Field.Store.YES,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field.Index.NO); <br />
&nbsp;&nbsp;&nbsp;document.add(FieldBody);<br />
&nbsp;&nbsp;&nbsp;document.add(FiledContent);<br />
&nbsp;&nbsp;&nbsp;document.add(FiledTitle);<br />
&nbsp;&nbsp;&nbsp;indexWriter.addDocument(document);<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;return "建立索引失败!!!!!!";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return "建立索引成功!!!!!!!";<br />
&nbsp;}<br />
</span><br />
四 ， <span style="color: #ff0000">// 关闭索引================================== 4</span><br />
<br />
<span style="color: #000000">&nbsp;public void close() throws IOException {<br />
&nbsp;&nbsp;this.indexWriter.close();&nbsp;&nbsp;&nbsp; //<span style="color: #ff0000">&nbsp;这里非常的重要，不关闭直接导致你的索引创建不成功</span><br />
&nbsp;}<br />
</span><br />
五&nbsp; ， <span style="color: #ff0000">// 查询索引的方法 ===============================5</span><br />
<br />
<p><span style="color: #000000">&nbsp;public ArrayList&lt;Document&gt; getQueryDate(String info)<br />
&nbsp;&nbsp;&nbsp;throws CorruptIndexException, IOException,<br />
&nbsp;&nbsp;&nbsp;org.apache.lucene.queryParser.ParseException {<br />
&nbsp;&nbsp;ArrayList&lt;Document&gt; doc = new ArrayList&lt;Document&gt;();<br />
&nbsp;&nbsp;String queryString = info;<br />
//&nbsp;&nbsp; Hits hits = null;<br />
//&nbsp;&nbsp; Query query = null;<br />
//&nbsp;&nbsp; QueryParser qp = null;<br />
//&nbsp;&nbsp; String dir = "c:\\hujiong"; // 一定要跟你建索引的位置 一致<br />
//&nbsp;&nbsp;<br />
//&nbsp;&nbsp; // 建立索引检索对象<br />
//&nbsp;&nbsp; IndexSearcher searcher = new IndexSearcher(dir);<br />
//&nbsp;&nbsp; // 分词器<br />
//&nbsp;&nbsp; Analyzer analyzer = new StandardAnalyzer();<br />
//&nbsp;&nbsp; qp = new QueryParser("content", analyzer);// 这里上面只写了一个按Content查找.<br />
//&nbsp;&nbsp; 下面添加的是title, 查找<br />
//&nbsp;&nbsp; query = qp.parse(queryString);<br />
//&nbsp;&nbsp;<br />
//&nbsp;&nbsp; if (searcher != null) {<br />
//&nbsp;&nbsp; hits = searcher.search(query);<br />
//&nbsp;&nbsp; doc = new ArrayList&lt;Document&gt;();<br />
//&nbsp;&nbsp; for (int i = 0; i &lt; hits.length(); i++) {<br />
//&nbsp;&nbsp; doc.add(hits.doc(i));<br />
//&nbsp;&nbsp; }<br />
//&nbsp;&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;IndexSearcher searcher = new IndexSearcher("c:\\hujiong");<br />
&nbsp;&nbsp;Analyzer analyzer = new StandardAnalyzer();<br />
&nbsp;&nbsp;Query query = null;<br />
&nbsp;&nbsp;if (searcher != null) {<br />
&nbsp;&nbsp;&nbsp;// 合并你搜索的字段, 增强你的搜索能力!!<br />
&nbsp;&nbsp;&nbsp;BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BooleanClause.Occur.SHOULD };<br />
&nbsp;&nbsp;&nbsp;query = MultiFieldQueryParser.parse(queryString, new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"title", "content" }, clauses, analyzer);&nbsp; // 这里就是在两个范围内进行收索 , 不过这些索引的字段必须要在添加数据到索引的时候设置它<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;TopDocCollector collector = new TopDocCollector(5); // 设置返回的最大数目，就返回前100条<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;searcher.search(query, collector);<br />
&nbsp;&nbsp;&nbsp;ScoreDoc[] hits1 = collector.topDocs().scoreDocs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 返回的结果他是一个数组<br />
&nbsp;&nbsp;&nbsp;if (hits1.length &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; hits1.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc1 = searcher.doc(hits1[i].doc); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 这是从这个返回的数组里面迭代每一个数据，&nbsp; 它的值是Document<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(doc1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(doc1.get("title") + "-----title");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(doc1.get("content") + "-------content");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("没有数据");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return doc;</span></p>
<p><span style="color: #000000">&nbsp;}</span></p>
<p><span style="color: #000000"><span style="color: #ff0000">//上面注释的一段代码是紧对单个field查询， 下面是支持多个field查询&nbsp;&nbsp;<br />
//上面的例子只需要改变第一步，就可以查多个表的数据，&nbsp;你只需在getDate(String sql)中的sql语句改变为你要查询的表的sql语句，<br />
//该方法中&nbsp; </span><br />
<span style="font-size: 14pt">while (rs.next()) {<br />
&nbsp;&nbsp;&nbsp;BaseItem i = new BaseItem();<br />
&nbsp;&nbsp;&nbsp;i.setTitle(rs.getString("title")); // 对应你的Blog表里的title<br />
&nbsp;&nbsp;&nbsp;i.setContent(rs.getString("content")); // 取表里的博客内容<br />
&nbsp;&nbsp;&nbsp;i.setUr("SingleArticle_lucene.action?id=" + rs.getInt("blogId")); // 如 a. action ?id=8<br />
&nbsp;&nbsp;&nbsp;item.add(i);<br />
&nbsp;&nbsp;} </span>// 把数据库里的数据取出来<br />
<span style="color: #ff0000">也要和你查询的表的字段对应就可以。。。</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的五个步骤的代码写的非常清楚， 想学习的人，一看就懂了 ， 这里还缺少一个按id查询的方法， 这是当你查出来的结果<br />
在页面上显示的时候，像百度查出来的一样， 所有需要一个id查询的方法。 就像我上面的例子用到一个按id查找blog的方法，这样就<br />
可以查询出来后， 可以点击查看单个文章。&nbsp;</span></span></p>
<img src ="http://www.blogjava.net/hujiongbusiness/aggbug/283447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hujiongbusiness/" target="_blank">胡炯</a> 2009-06-21 13:00 <a href="http://www.blogjava.net/hujiongbusiness/archive/2009/06/21/lucene.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>