﻿<?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-CONAN ZONE</title><link>http://www.blogjava.net/conans/</link><description>你越挣扎我就越兴奋</description><language>zh-cn</language><lastBuildDate>Mon, 11 May 2026 17:18:05 GMT</lastBuildDate><pubDate>Mon, 11 May 2026 17:18:05 GMT</pubDate><ttl>60</ttl><item><title>Solr 获取searcher实例分析(转)</title><link>http://www.blogjava.net/conans/articles/380686.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 13 Jun 2012 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/380686.html</guid><description><![CDATA[<strong>每一个搜索请求都会持有一个searcher的引用，而不是创建一个新的searcher，处理完后会释放掉这个引用</strong>。<br /><br />Solr在初始化化时，通过SolrCore核心类要做很多的初始化工作，包过读取solrconfig.xml配置文件里的内容，代码如下：<br />&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>booleanQueryMaxClauseCou<wbr>nt(); //设置布尔查询最多个数。<br />&nbsp;<wbr> &nbsp;<wbr> initListeners();&nbsp;<wbr> //读取配置文件的search实例的监听器。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> initDeletionPolicy();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> initIndex();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> initWriters();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> initQParsers();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> initValueSourceParsers();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> this.searchComponents = loadSearchComponents();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> // Processors initialized before the handlers<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> updateProcessorChains = loadUpdateProcessorChain<wbr>s();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> reqHandlers = new RequestHandlers(this);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> reqHandlers.initHandlersFromConfig( solrConfig );<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> highlighter = initHighLighter();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> // Handle things that should eventually go away<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> initDeprecatedSupport();<br /><br />loadSearchComponents方法就是初始化indexSearch实例。详细说明如下：<br />getSearcher &#8211; (forceNew, returnSearcher, waitSearcher-Futures)<br />关注solr全局三个点调用getSearcher函数 : solrCore初始化时(false, false, null)，QueryComponent处理查询<br />请求时(false, true, null)，UpdateHandler在处理commit请求时(true, false, new Future[1])<br />---------<br />1.solrCore初始化时<br />根据solrconfig配置的IndexReaderFactory&amp;DirectoryFactory获取索引的IndexReader，再使用这个reader<br />封装一个SolrIndexReader，再使用这个SolrIndexReader封装一个RefCounted(searcher的引用计数器，当搜索<br />组件获取一个组件后引用++，用完后调用close引用--，当引用数为0时将这个引用从core管理的一个当前被使用的<br />searcher的链表移除，同时调用searcher.close回收资源)，将这个引用添加到core管理的一个当前被使用的searcher<br />的链表里如果firstSearcherListeners不为空则回调这些监听器，这个回调是交给core的一个newSingleThreadExecutor去<br />做的，再往这个线程池里添加一个任务:将这个RefCounted设置为core当前最新的searcher的引用计数器<br />最后返回null，因为returnSearcher=false<br />在solrCore初始化时这样做的主要目的是在初始化时就加载好IndexSearcher，搜索请求来了之后能立即返回，<br />而不必等待加载IndexSearcher<br />---------<br />2.QueryComponent处理查询请求时<br />由于core当前最新的searcher的引用计数器不为null且这个获取IndexSearcher的请求不是强制要求获取最新的，且<br />returnSearcher=true故直接返回core当前最新的searcher的引用计数器，且这个引用计数器做++<br />这里面还有段当前searcher的引用计数器为null的逻辑，但是没有发现有什么情况会导致这种情况发生故不累述了<br />---------<br />3.UpdateHandler在处理commit请求时<br />首先到core管理的一个当前被使用的searcher的链表里获取目前最新的searcher；同时会加载索引目录下的<br />index.properties文件(如果存在的话)，拿到KEY=&#8217;index&#8217;的值，其指明目前索引的存放地方；如果获取的目录和当前<br />最新的searcher使用的目录一致且solrConfig.reopenReaders为true则获取通过searher.reader.reopen获取<br />最新的reader -&gt; 封装成searcher，否则直接IndexReader.open获取reader。<br />获取到searcher后的一段逻辑[RefCount封装，添加到searchers链表]和core初始化时是一样的，接下来的逻辑是<br />如果solrConfig.useColdSearcher为TRUE其当前searcher的引用为null-导致来自QueryComponent的请求阻塞<br />[现在还没发现什么情况会导致searcher的引用为null]<br />立即将这个新的searcher的引用设置为core当前最新的searcher的引用计数器，这样来自QueryComponent的请求<br />拿到这个引用后返回，当时这时这个新建的searcher是没有经过其前一个searcher的cache热身的，同时这样会导致这个<br />新建的searcher不会进行热身活动<br />如果solrConfig.useColdSearcher为FALSE则会往线程池里添加一个热身的任务<br />如果newSearcherListeners不为空则回调这些监听器，也是给线程池的任务<br />最后如果先前没有做将新的searcher的引用设置为core当前最新的searcher的引用计数器的行为的话，则往线程池添加<br />一个任务 &#8211; 将新的searcher的引用设置为core当前最新的searcher的引用计数器<br />最后返回null，因为returnSearcher=false <br /><br />from:<a href="http://blog.sina.com.cn/s/blog_56fd58ab0100v3tp.html">http://blog.sina.com.cn/s/blog_56fd58ab0100v3tp.html</a><img src ="http://www.blogjava.net/conans/aggbug/380686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-06-13 14:17 <a href="http://www.blogjava.net/conans/articles/380686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>olr 性能调优 NO_NORMS(转)</title><link>http://www.blogjava.net/conans/articles/380685.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 13 Jun 2012 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/380685.html</guid><description><![CDATA[<div id="sina_keyword_ad_area2" class="articalContent  ">
<h3>indexed fields</h3>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> indexed fields 的数量将会影响以下的一些性能：</p>
<ul><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>索引时的时候的内存使用量</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 索引段的合并时间</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>优化时间</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 索引的大小</li></ul>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 我们可以通过 将 omitNorms=&#8220;true&#8221; 来减少indexed fields数量增加所带来的影响。</p>
<h3>&nbsp;<wbr>&nbsp;<wbr> stored fields</h3>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Retrieving the stored fields&nbsp;<wbr> 确实是一种开销。这个开销，受每个文档所存储的字节影响很大。每个文档的所占用的空间越大，文档就显的更稀疏，这样从硬盘中读取数据，就需要更多的i/o操作（通常，我们在存储比较大的域的时候，就会考虑这样的事情，比如存储一篇文章的文档。）</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 可以考虑将比较大的域放到solr外面来存储。如果你觉得这样做会有些别扭的话，可以考虑使用压缩的域，但是这样会加重cpu在存储和读取域的时候的负担。不过这样却是可以较少i/0的负担。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果，你并不是总是使用 stored fields 的话，可以使用stored field的延迟加载，这样可以节省很多的性能，尤其是使用compressed field 的时候。</p>
<h2>&nbsp;<wbr>Configuration Considerations</h2>
<h3>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> mergeFactor</h3>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 这个是合并因子，这个参数大概决定了segment(索引段)的数量。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 合并因子这个值告诉lucene，在什么时候，要将几个segment合并成为一个segment, 合并因子就像是一个数字系统的基数一样。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 比如说，如果你将合并因子设成10，那么每往索引中添加1000个文档的时候，就会创建一个新的索引段。当第10个大小为1000的索引段添加进来的时候，这十个索引段就会被合并成一个大小为10，000的索引段。当十个大小为10，000的索引段生成的时候，它们就会被合并成一个大小为100，000 的索引段。如此类推下去。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 这个值可以在 solrconfig.xml 中的 *mainIndex*中设置。（不用管indexDefaults中设置）</p>
<h3>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> mergeFactor Tradeoffs</h3>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 较高的合并因子</p>
<ul><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 会提高索引速度</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 较低频率的合并，会导致 更多的索引文件，这会降低索引的搜索效率</li></ul>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 较低的合并因子</p>
<ul><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 较少数量的索引文件，能加快索引的搜索速度。</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 较高频率的合并，会降低索引的速度。</li></ul>
<h2>Cache autoWarm Count Considerations</h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 当一个新的 searcher 打开的时候，它缓存可以被预热，或者说使用从旧的searcher的缓存的数据来&#8220;自动加热&#8221;。autowarmCount是这样的一个参数，它表示从旧缓存中拷贝到新缓存中的对象数量。autowarmCount这个参数将会影响&#8220;自动预热&#8221;的时间。有些时候，我们需要一些折中的考虑，seacher启动的时间和缓存加热的程度。当然啦，缓存加热的程度越好，使用的时间就会越长，但往往，我们并不希望过长的seacher启动时间。这个autowarm 参数可以在solrconfig.xml文件中被设置。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 详细的配置可以参考solr的wiki。</p>
<h2>Cache hit rate（缓存命中率）</h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 我们可以通过solr的admin界面来查看缓存的状态信息。提高solr缓存的大小往往是提高性能的捷径。当你使用面搜索的时候，你或许可以注意一下filterCache,这个是由solr实现的缓存。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br /></p>
<h2>Explicit Warming of Sort Fields&nbsp;<wbr></h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果你有许多域是基于排序的，那么你可以在"newSearcher"和"firstSearcher"event listeners中添加一些明显需要预热的查询，这样FieldCache 就会缓存这部分内容。</p>
<h2>&nbsp;<wbr>Optimization Considerations</h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 优化索引，是我们经常会做的事情，比如，当我们建立好索引，然后这个索引不会再变更的情况，我们就会做一次优化了。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 但，如果你的索引经常会改变，那么你就需要好好的考虑下面的因素的。</p>
<ul><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>当越来越多的索引段被加进索引，查询的性能就会降低， lucene对索引段的数量有一个上限的限制，当超过这个限制的时候，索引段可以自动合并成为一个。</li><li>在同样没有缓存的情况下，一个没有经过优化的索引的性能会比经过优化的索引的性能少10%&#8230;&#8230;</li><li>自动加热的时间将会变长，因为它依赖于搜索。</li><li>&nbsp;<wbr>优化将会对索引的分发产生影响。</li><li>&nbsp;<wbr>在优化期间，文件的大小将会是索引的两倍，不过最终将会回到它原来的大小，或者会更小一点。</li></ul>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 优化，会将所有的索引段合并成为一个索引段，所以，优化这个操作其实可以帮助避免&#8220;too many files&#8221;这个问题，这个错误是由文件系统抛出的。</p>
<h2>Updates and Commit Frequency Tradeoffs</h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果从机太经常从主机更新的话，从机的性能是会受到影响的。为了避免，由于这个问题而引起的性能下降，我们还必须了解从机是怎样执行更新的，这样我们才能更准确去调节一些相关的参数（commit的频率，spappullers,autowarming/autocount）,这样，从机的更新才不会太频繁。</p>
<ol><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>执行commit操作会让solr新生成一个snapshot。如果将postCommit参数设成true的话，optimization也会执行snapShot.</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> slave上的Snappuller程序一般是在crontab上面执行的，它会去master询问，有没有新版的snapshot。一旦发现新的版本，slave就会把它下载下来，然后snapinstall.</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 每次当一个新的searcher被open的时候，会有一个缓存预热的过程，预热之后，新的索引才会交付使用。</li></ol>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 这里讨论三个有关的参数：</p>
<ul><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <strong>number/frequency of snapshots</strong> &nbsp;<wbr> ----snapshot的频率。</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <strong>snappullers 是</strong> &nbsp;<wbr> 在crontab中的，它当然可以每秒一次、每天一次、或者其他的时间间隔一次运行。它运行的时候，只会下载slave上没有的，并且最新的版本。</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <strong>Cache autowarming</strong> 可以在solrconfig.xml文件中配置。</li></ul>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>如果，你想要的效果是频繁的更新slave上的索引，以便这样看起来比较像&#8220;实时索引&#8221;。那么，你就需要让snapshot尽可能频繁的运行，然后也让 snappuller频繁的运行。这样，我们或许可以每5分钟更新一次，并且还能取得不错的性能，当然啦，cach的命中率是很重要的，恩，缓存的加热时间也将会影响到更新的频繁度。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> cache对性能是很重要的。一方面，新的缓存必须拥有足够的缓存量，这样接下来的的查询才能够从缓存中受益。另一方面，缓存的预热将可能占用很长一段时间，尤其是，它其实是只使用一个线程，和一个cpu在工作。snapinstaller太频繁的话，solr slave将会处于一个不太理想的状态，可能它还在预热一个新的缓存，然而一个更新的searcher被opern了。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>怎么解决这样的一个问题呢，我们可能会取消第一个seacher，然后去处理一个更新seacher，也即是第二个。然而有可能第二个seacher 还没有被使用上的时候，第三个又过来了。看吧，一个恶性的循环，不是。当然也有可能，我们刚刚预热好的时候就开始新一轮的缓存预热，其实，这样缓存的作用压根就没有能体现出来。出现这种情况的时候，降低snapshot的频率才是硬道理。</p>
<h2>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Query Response Compression</h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 在有些情况下，我们可以考虑将solr xml response 压缩后才输出。如果response非常大，就会触及NIc i/o限制。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 当然压缩这个操作将会增加cpu的负担，其实，solr一个典型的依赖于cpu处理速度的服务，增加这个压缩的操作，将无疑会降低查询性能。但是，压缩后的数据将会是压缩前的数据的6分之一的大小。然而solr的查询性能也会有15%左右的消耗。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 至于怎样配置这个功能，要看你使用的什么服务器而定，可以查阅相关的文档。</p>
<h2>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Embedded vs HTTP Post</h2>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 使用embeded 来建立索引，将会比使用xml格式来建立索引快50%。</p>
<h2>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>RAM Usage Considerations（内存方面的考虑）</h2>
<h3>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> OutOfMemoryErrors</h3>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果你的solr实例没有被指定足够多的内存的话，java virtual machine也许会抛outof memoryError，这个并不对索引数据产生影响。但是这个时候，任何的 adds/deletes/commits操作都是不能够成功的。</p>
<h3>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>Memory allocated to the Java VM</h3>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 最简单的解决这个方法就是，当然前提是java virtual machine 还没有使用掉你全部的内存，增加运行solr的java虚拟机的内存。</p>
<h4>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Factors affecting memory usage（影响内存使用量的因素）</h4>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 我想，你或许也会考虑怎样去减少solr的内存使用量。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 其中的一个因素就是input document的大小。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 当我们使用xml执行add操作的时候，就会有两个限制。</p>
<ul><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> document中的field都是会被存进内存的，field有个属性叫maxFieldLength，它或许能帮上忙。</li><li>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 每增加一个域，也是会增加内存的使用的。</li></ul></div><img src ="http://www.blogjava.net/conans/aggbug/380685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-06-13 14:16 <a href="http://www.blogjava.net/conans/articles/380685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solr Cache使用介绍及分析(转)</title><link>http://www.blogjava.net/conans/articles/380684.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 13 Jun 2012 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/380684.html</guid><description><![CDATA[本文将介绍Solr查询中涉及到的Cache使用及相关的实现。Solr查询的核心类就是SolrIndexSearcher， 
<p>每个core通常在 同一时刻只由当前的SolrIndexSearcher供上层的handler使用</p>
<p>（当切换SolrIndexSearcher时可能会有两个同时提供服务），而Solr的各种Cache是依附于SolrIndexSearcher的，SolrIndexSearcher在则Cache 生，SolrIndexSearcher亡则Cache被清空close掉。</p>
<p>Solr中的应用Cache有filterCache、 queryResultCache、documentCache等，这些Cache都是SolrCache的实现类，</p>
<p>并且是 SolrIndexSearcher的成员变量，各自有着不同的逻辑和使命，下面分别予以介绍和分析。</p>
<h2>1、SolrCache接口实现类</h2>
<p>Solr提供了两种SolrCache接口实现类：solr.search.LRUCache和solr.search.FastLRUCache。</p>
<p>FastLRUCache是1.4版本中引入的，其速度在普遍意义上要比LRUCache更fast些。<br />下面是对SolrCache接口主要方法的注释：</p>
<div align="left">public interface SolrCache{publicObjectinit(Mapargs,Objectpersistence, CacheRegenerator regenerator);<br />publicintsize();<br />publicObjectput(Objectkey,Objectvalue);<br />publicObjectget(Objectkey);publicvoidclear();voidwarm(SolrIndexSearcher searcher, SolrCache old)throwsIOException;<br />publicvoidclose();}<br />
<h3>1.1、solr.search.LRUCache</h3>LRUCache可配置参数如下：<br />
<p>1）size：cache中可保存的最大的项数，默认是1024<br />2）initialSize：cache初始化时的大小，默认是1024。<br />3）autowarmCount：<br />当切换SolrIndexSearcher时，可以对新生成的SolrIndexSearcher做autowarm（预热）处理。<br />autowarmCount表示从旧的SolrIndexSearcher中取多少项来在新的SolrIndexSearcher中被重新生成，</p>
<p>如何重新生成由CacheRegenerator实现。在当前的1.4版本的Solr中，这个autowarmCount只能取预热的项数，</p>
<p>将来的4.0版本可以指定为已有cache项数的百分比，以便能更好的平衡autowarm的开销及效果。</p>
<p>如果不指定该参数，则表示不做autowarm处理。实现上，LRUCache直接使用LinkedHashMap来缓存数据，</p>
<p>由initialSize来限定cache的大小，淘汰策略也是使用LinkedHashMap的内置的LRU方式，</p>读写操作都是对map的全局锁，所以并发性效果方面稍差。 
<h3>1.2、solr.search.FastLRUCache</h3>在配置方面，FastLRUCache除了需要LRUCache的参数，还可有选择性的指定下面的参数：<br />
<p>1）minSize：当cache达到它的最大数，淘汰策略使其降到minSize大小，默认是0.9*size。<br />2）acceptableSize：当淘汰数据时，期望能降到minSize，但可能会做不到，则可勉为其难的降到acceptableSize，</p>
<p>默认是0.95*size。</p>
<p>3）cleanupThread：相比LRUCache是在put操作中同步进行淘汰工作，FastLRUCache可选择由独立的线程来做，</p>
<p>也就是配置cleanupThread的时候。当cache大小很大时，每一次的淘汰数据就可能会花费较长时间，</p>
<p>这对于提供查询请求的线程来说就不太合适，由独立的后台线程来做就很有必要。实现上，</p>
<p>FastLRUCache内部使用了ConcurrentLRUCache来缓存数据，它是个加了LRU淘汰策略的ConcurrentHashMap，</p>
<p>所以其并发性要好很多，这也是多数Java版Cache的极典型实现。</p>
<h2>2、filterCache</h2>filterCache存储了无序的lucene document id集合，该cache有3种用途：<br />
<p>1）filterCache<br />存储了filter queries(&#8220;fq&#8221;参数)得到的document id集合结果。Solr中的query参数有两种，即q和fq。如果fq存在，</p>
<p>Solr是先查询fq（因为fq可以多个，所以多个fq查询是个取结果交集 的过程），之后将fq结果和q结果取并。</p>
<p>在这一过程中，filterCache就是key为单个fq（类型为Query），value为documentid集合（类型为DocSet）的cache。</p>
<p>对于fq为range query来说，filterCache表现出其有价值的一面。<br />2）filterCache<br />还可用于facet查询（http://wiki.apache.org/solr/SolrFacetingOverview），facet查询中各<br />facet的计数是通过对满足query条件的document<br />id集合（可涉及到filterCache）的处理得到的。因为统计各facet计数可能会涉及到所有的doc<br />id，所以filterCache的大小需要能容下索引的文档数。<br />3）如果solfconfig.xml中配置了&lt;useFilterForSortedQuery/&gt;，</p>
<p>那么如果查询有filter（此filter是一需要过滤的DocSet，而不是fq，我未见得它有什么用），</p>则使用filterCache。<br />
<p>下面是filterCache的配置示例：</p>&lt;!-- Internal cache used by SolrIndexSearcher for filters (DocSets),unordered sets of *all* documents<br /><pre>that match a query.When a new searcher is opened, its caches may be prepopulatedor "autowarmed"<br />
&nbsp;<wbr>using data from caches in the old searcher.autowarmCount is the number of items to prepopulate. <br />
 For LRUCache,the prepopulated items will be the most recently accessed items.--&gt;<br />
&lt;filterCacheclass="solr.LRUCache"size="16384"initialSize="4096"/&gt;
</pre><br />
<p>对于是否使用filterCache及如何配置filterCache大小，需要根据应用特点、统计、效果、经验等各方面来评估。</p>
<p>对于使用fq、facet的应用，对filterCache的调优是很有必要的。</p>
<h2>3、queryResultCache</h2>顾名思义，queryResultCache是对查询结果的缓存（SolrIndexSearcher中的cache缓存的都是document id set），<br />这个结果就是针对查询条件的完全有序的结果。 下面是它的配置示例：<br />&lt;!-- queryResultCache caches results of searches - ordered lists ofdocument ids (DocList) based on a query, a sort, and the rangeof documents requested.--&gt;<br /><pre>&lt;queryResultCacheclass="solr.LRUCache"size="16384"initialSize="4096"/&gt;
</pre>缓存的key是个什么结构呢？就是下面的类（key的hashcode就是QueryResultKey的成员变量hc）：<br /><pre>publicQueryResultKey(Query query, List&lt;Query&gt;filters, Sort sort,intnc_flags)<br />
 {<br />
     this.query=query;<br />
     this.sort=sort;<br />
     this.filters=filters;<br />
     this.nc_flags=nc_flags;<br />
     inth=query.hashCode();<br />
     if(filters!=null)h^=filters.hashCode();<br />
     sfields=(this.sort!=null)?this.sort.getSort():defaultSort;<br />
    for(SortField sf:sfields)<br />
    { // mix the bits so that sortFields are position dependent<br />
 // so that a,b won't hash to the same value as b,ah^=(h&lt;&lt;8)|(h&gt;&gt;&gt;25);<br />
 // reversible hashif(sf.getField()!=null)h+=sf.getField().hashCode();h+=sf.getType();<br />
 if(sf.getReverse())h=~h;if(sf.getLocale()!=null)h+=sf.getLocale().hashCode();<br />
 if(sf.getFactory()!=null)h+=sf.getFactory().hashCode();}hc=h;<br />
 }
</pre>因为查询参数是有start和rows的，所以某个QueryResultKey可能命中了cache，但start和rows却不在cache的<br />document id set范围内。当然，document id<br />set是越大命中的概率越大，但这也会很浪费内存，这就需要个参数：queryResultWindowSize来指定document id<br />set的大小。Solr中默认取值为50,可配置，WIKI上的解释很深简单明了：<br />&lt;!-- An optimization for use with the queryResultCache. When a searchis requested, a superset of the requested number<br /><pre>of document idsare collected.  For example, of a search for a particular queryrequests matching documents 10 <br />
through 19, and queryWindowSize is 50,then documents 0 through 50 will be collected and cached.  <br />
Any furtherrequests in that range can be satisfied via the cache.--&gt;<br />
&lt;queryResultWindowSize&gt;50&lt;/queryResultWindowSize&gt;<br />
相比filterCache来说，queryResultCache内存使用上要更少一些，但它的效果如何就很难说。<br />
就索引数据来说，通常我们只是在索引上存储应用主键id，再从数据库等数据源获取其他需要的字段。<br />
这使得查询过程变成，首先通过solr得到document id set，再由Solr得到应用id集合，<br />
最后从外部数据源得到完成的查询结果。如果对查询结果正确性没有苛刻的要求，可以在Solr之外独立的缓存完整的<br />
<br />
查询结果（定时作废），这时queryResultCache就不是很有必要，否则可以考虑使用queryResultCache。当然，如果发现在<br />
queryResultCache生命周期内，query重合度很低，也不是很有必要开着它。 
</pre>
<h2>4、documentCache</h2><pre>又顾名思义，documentCache用来保存&lt;doc_id,document&gt;对的。如果使用documentCache，就尽可能开大<br />
<br />
些，至少要大过&lt;max_results&gt; *&lt;max_concurrent_queries&gt;，否则因为cache的淘汰，<br />
一次请求期间还需要重新获取document一次。也要注意document中存储的字段的多少，避免大量的内存消耗。<br />
下面是documentCache的配置示例：&lt;!-- documentCache caches Lucene Document objects (the stored fields for each document).--&gt;<br />
</pre><pre>&lt;documentCacheclass="solr.LRUCache"size="16384"initialSize="16384"/&gt;
</pre><pre>5、User/Generic Caches <br />
Solr支持自定义Cache，只需要实现自定义的regenerator即可，下面是配置示例：&lt;!-- Example of a generic cache.  These caches may be accessed by namethrough SolrIndexSearcher.getCache(),<br />
</pre><pre>cacheLookup(), and cacheInsert().The purpose is to enable easy caching of user/application level data.<br />
The regenerator argument should be specified as an implementationof solr.search.CacheRegenerator if<br />
&nbsp;<wbr>autowarming is desired.--&gt;&lt;!--&lt;cache name="yourCacheNameHere"class="solr.LRUCache"size="4096"<br />
initialSize="2048"regenerator="org.foo.bar.YourRegenerator"/&gt;--&gt;
</pre><pre>6、The Lucene FieldCache <br />
lucene中有相对低级别的FieldCache，Solr并不对它做管理，所以，lucene的FieldCache还是由lucene的IndexSearcher来搞。 
</pre>
<h2>7、autowarm</h2><pre>上面有提到autowarm，autowarm触发的时机有两个，一个是创建第一个Searcher时（firstSearcher），一个是创建个新<br />
<br />
Searcher（newSearcher）来代替当前的Searcher。在Searcher提供请求服务前，Searcher中的各个Cache可以<br />
做warm处理，处理的地方通常是SolrCache的init方法，而不同cache的warm策略也不一样。<br />
1）filterCache：filterCache注册了下面的CacheRegenerator，就是由旧的key查询索引得到新值put到新cache中。solrConfig.filterCacheConfig.setRegenerator(newCacheRegenerator(){publicbooleanregenerateI<wbr>tem<br />
</pre><pre>(SolrIndexSearcher newSearcher, SolrCache newCache, SolrCache oldCache,ObjectoldKey,ObjectoldVal)<br />
throwsIOException{newSearcher.cacheDocSet((Query)oldKey,null,false);returntrue;}});<br />
 2）queryResultCache：queryResultCache的autowarm不在SolrCache的init（也就是说，不是去遍历已<br />
 有的queryResultCache中的query key执行查询），而是通过SolrEventListener接口的void<br />
newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher<br />
currentSearcher)方法，来执行配置中特定的query查询，达到显示的预热lucene FieldCache的效果。<br />
queryResultCache的配置示例如下：<br />
&lt;listenerevent="newSearcher"class="solr.QuerySenderListener"&gt;&lt;arrname="queries"&gt;&lt;!-- seed common sort fields --&gt;&lt;lst&gt;<br />
</pre><pre>&lt;strname="q"&gt;anything&lt;/str&gt;&lt;strname="sort"&gt;name desc price desc populartiy desc&lt;/str&gt;&lt;/lst&gt;&lt;/arr&gt;<br />
&lt;/listener&gt;&lt;listenerevent="firstSearcher"class="solr.QuerySenderListener"&gt;&lt;arrname="queries"&gt;<br />
&lt;!-- seed common sort fields --&gt;&lt;lst&gt;&lt;strname="q"&gt;anything&lt;/str&gt;&lt;strname="sort"&gt;<br />
name desc, price desc, populartiy desc&lt;/str&gt;&lt;/lst&gt;&lt;!-- seed common facets and filter queries --&gt;<br />
&lt;lst&gt;&lt;strname="q"&gt;anything&lt;/str&gt;&lt;strname="facet.field"&gt;category&lt;/str&gt;<br />
&lt;strname="fq"&gt;inStock:true&lt;/str&gt;&lt;strname="fq"&gt;price:[0 TO 100]&lt;/str&gt;&lt;/lst&gt;&lt;/arr&gt;&lt;/listener&gt;<br />
3）documentCache：因为新索引的document id和索引文档的对应关系发生变化，所以documentCache没有warm的过程，<br />
落得白茫茫一片真干净。尽管autowarm很好，也要注意autowarm带来的开销，这需要在实际中检验其warm的开销，<br />
也要注意Searcher的切换频率，避免因为warm和切换影响Searcher提供正常的查询服务。<br />
<br />
8、参考文章 <br />
http://wiki.apache.org/solr/SolrCaching
</pre></div><img src ="http://www.blogjava.net/conans/aggbug/380684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-06-13 14:12 <a href="http://www.blogjava.net/conans/articles/380684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solr 的客户端调用solrj 建索引+分页查询 </title><link>http://www.blogjava.net/conans/articles/379556.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379556.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在&nbsp;solr 3.5 配置及应用(一) 讲过一了&nbsp;solr 3.5的详细配置，本节我们讲利用solr 的客户端调用solr的应用了！一、利用SolrJ操作solr API&nbsp; &nbsp; &nbsp;使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ是封装了httpClient方法，来操作solr的API的。SolrJ底层还...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/379556.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/379556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 15:05 <a href="http://www.blogjava.net/conans/articles/379556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solr的facet查询</title><link>http://www.blogjava.net/conans/articles/379555.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379555.html</guid><description><![CDATA[solr将以导航为目的的查询结果称为facet. 它并不会修改查询结果信息, 只是在查询结果上根据分类添加了count信息, 然后用户根据count信息做进一步的查询, 比如淘宝的查询列表中, 上面会表示不同的类目相关查询结果的数量. <br /><br />比如搜索数码相机, 在搜索结果栏会根据厂商, 分辨率等维度列出, 这里厂商, 分辨率就是一个个facet. <br /><br />然后在厂商下面会有nikon, canon, sony等品牌, 这个叫约束(constraints) <br /><br />接下来是根据选择, 列出当前的导航路径, 这个叫面包屑(breadcrumb). <br /><br />solr有几种facet: <br />普通facet, 比如从厂商品牌的维度建立fact <br />查询facet, 比如根据价格查询时, 将根据价格, 设置多个区间, 比如0-10, 10-20, 20-30等 <br />日期facet, 也是一种特殊的范围查询, 比如按照月份进行facet. <br /><br />facet的主要好处就是可以任意对搜索条件进行组合, 避免无效搜索, 改善搜索体验. <br /><br />facet都是在查询时通过参数指定. 比如 <br />在http api中这样写: 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">"</span><span style="color: #ff0000">&amp;facet</span><span style="color: #000000">=true</span><span style="color: #ff0000">&amp;facet</span><span style="color: #000000">.field=manu"&nbsp;</span></div>java代码这样写： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SolrQuery(</span><span style="color: #000000">"</span><span style="color: #000000">*:*</span><span style="color: #000000">"</span><span style="color: #000000">).setFacet(</span><span style="color: #0000ff">true</span><span style="color: #000000">).addFacetField(</span><span style="color: #000000">"</span><span style="color: #000000">manu</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>而xml返回的结果为这样：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">lst&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="facet_fields"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">lst&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="manu"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">int&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Canon&nbsp;USA"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">17</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">int</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">int&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Olympus"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">12</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">int</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">int&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Sony"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">12</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">int</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">int&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Panasonic"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">9</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">int</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">int&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Nikon"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">4</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">int</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">lst</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">lst</span><span style="color: #0000ff">&gt;</span></div>通过java代码可以这样获取facet结果：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">List</span><span style="color: #000000">&lt;</span><span style="color: #000000">FacetField</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;facetFields&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;queryResponse.getFacetFields();</span></div>在已有的查询基础上增加facet query,可以这样写：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">solrQuery.addFacetQuery(</span><span style="color: #000000">"</span><span style="color: #000000">quality:[*&nbsp;TO&nbsp;10]</span><span style="color: #000000">"</span><span style="color: #000000">)</span></div>比如对价格按照指定的区间进行facet, 可以这样加上facet后缀: <br /><br />&amp;facet=true&amp;facet.query=price:[* TO 100] <br />&amp;facet.query=price:[100 TO 200];&amp;facet.query=[price:200 TO 300] <br />&amp;facet.query=price:[300 TO 400];&amp;facet.query=[price:400 TO 500] <br />&amp;facet.query=price:[500 TO *]<br /><br />如果要对价格在400到500期间的产品做进一步的搜索, 那么可以这样写(使用了solr的过滤查询): <br />
<div class="quote_title">引用</div>
<div class="quote_div">http://localhost:8983/solr/select?q=camera &amp;facet=on&amp;facet.field=manu&amp;facet.field=camera_type &amp;fq=price:[400 to 500]</div><br /><br />注意这里的facet field不再包含price了 <br /><br />如果这里对类型做进一步的查询, 那么query语句可以这样写: <br />
<div class="quote_title">引用</div>
<div class="quote_div">http://localhost:8983/solr/select?q=camera &amp;facet=on&amp;facet.field=manu &amp;fq=price:[400 to 500] &amp;fq=camera_type:SLR <br /></div><br /><br />facet的使用场景: <br />1.类目导航 <br />2.自动提示, 需要借助一个支持多值的tag field. <br />3.热门关键词排行, 也需要借助一个tag field <br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/conans/aggbug/379555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:52 <a href="http://www.blogjava.net/conans/articles/379555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新版SolrCloud概述</title><link>http://www.blogjava.net/conans/articles/379553.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379553.html</guid><description><![CDATA[在Lucene/Solr的SVN trunk中的SolrCloud已经可用, 在即将发布的4.0版本中将正式包含. <br /><br />目前SolrCloud已经成熟, 可以支持分布式索引和分布式搜索. 下面是我们一个项目采用新的SolrCloud的部署结构图: <br />
<div style="text-align: center"><img src="http://sematext.files.wordpress.com/2012/01/distributedsolr-arch.png"  alt="" /></div><br />看起来是否非常简单? 下面我们看看内部的一些实现细节. <br /><br /><strong>SolrCloud功能和架构</strong> <br />下面是SolrCloud一些不错的功能: <br />
<ul><li>中心化集群配置 </li><li>自动容灾 </li><li>近实时搜索 </li><li>领导选举 </li><li>索引持久化 </li></ul><br />另外SolrCloud也能被配置成: <br />分片(shard)索引 <br />每个shard可以有一个或多个副本(replica) <br /><br />多个shard和replica可以组成一个Collection(从图中可以看出就是一个SolrCloud), 多个Collection可以部署到一个SolrCloud集群. 而一个搜索请求可以同时搜索多个Collection. 其工作流程就像下图中那样. <br /><img src="http://sematext.files.wordpress.com/2012/01/distributedsolr-shardsreplicas.png"  alt="" /> <br /><br /><strong>SolrCloud Shard, Replica, Replication</strong> <br />就像上图那样, 一个新的doc将发送到一个SolrCloud集群中任何一个节点. doc能自动选择发送到哪一个Shard, 如果Shard有多个副本, doc会自动进行同步, 与原来的master/slave结构有所不同, 数据同步是实时的(原来则是定期批量同步). <br /><br /><strong>集群配置</strong> <br />SolrCloud集群的所有的配置存储在ZooKeeper. 一旦一个SolrCloud节点启动, 该节点的配置信息将发送到ZooKeeper上存储. <br /><br />Shard Replica除了作为容灾备份存在, 另外一个作用就是分散查询请求, 提高整个集群的查询能力. <br /><br /><strong>索引处理</strong> <br />索引文档的更新在Shard和Replica之间是自动和实时的. 因为不存在master server, doc可以发送到任何一个SolrCloud(也就是一个Collection), 然后由SolrCloud完成剩下的事情. 这样就不再存在以前master/slave的单点问题. <br /><br /><strong>搜索方式</strong> <br />有三种不同的搜索方式: <br />在单个Solr实例上搜索 <br />在单个Collection上搜索(即在一个Collection的多个Shard上搜索) <br />在指定的Shard上搜索 <br />在多个Collection上搜索, 并将最后merge的结果返回. <br /><br /><strong>运维管理</strong> <br />除了原来的标准core admin, 还增加了其他方式: <br />在一个Collection上创建一个Shard <br />新建一个Collection <br />增加节点. <br /><br /><strong>下一步计划</strong> <br /><a href="http://wiki.apache.org/solr/NewSolrCloudDesign">http://wiki.apache.org/solr/NewSolrCloudDesign</a><br />有新的SolrCloud设计方案. <img src ="http://www.blogjava.net/conans/aggbug/379553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:47 <a href="http://www.blogjava.net/conans/articles/379553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[译]lucene&amp;solr 2011年盘点</title><link>http://www.blogjava.net/conans/articles/379552.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379552.html</guid><description><![CDATA[原文:<a href="http://java.dzone.com/articles/lucene-solr-year-2011-review" target="_blank">http://java.dzone.com/articles/lucene-solr-year-2011-review</a> <br /><br />2011年已经过去, 在这里针对本年lucene和solr领域发生的点点滴滴进行一下回顾, 也算是对lucene和solr的一个盘点. <br /><br />lucene成为apache基金会项目已逾十年(实际上lucene存在的历史已超过10年), solr 作为apache基金项目也差不多度过了六个春秋. 而这两个项目的发展离不开Otis(<a href="http://twitter.com/otisg" target="_blank">http://twitter.com/otisg</a> )的长期努力. <br /><br />在这一年里, solr和lucene发生了非常显著的变化, 增加了大量新的功能, 而这个变化可以说超过以往任何一年. <br /><br />其中最激动人心的功能莫过于近实时搜索功能(Near Real-Time search <a href="http://search-lucene.com/?q=NRT" target="_blank">http://search-lucene.com/?q=NRT</a> )的实现, 即对文档的修改会立马出现在搜索结果中. 虽然NRT依然还在继续改进中, 但是很多用户已经开始使用该功能. <br /><br />字段折叠(Field Collapsing <a href="http://wiki.apache.org/solr/FieldCollapsing" target="_blank">http://wiki.apache.org/solr/FieldCollapsing</a> ) 也是solr社区中长期以来期待的一个功能. 这个功能已在今年实现. 现在solr和lucene用户可以基于字段和查询条件对结果集进行进行分组. 并实现了对分组进行控制. 此外还可以基于分组进行facet运算(而以前只能基于文档). <br /><br />在这一年, lucene也引入了faceting module(<a href="https://issues.apache.org/jira/browse/LUCENE-3079" target="_blank">https://issues.apache.org/jira/browse/LUCENE-3079</a> ), 从此以后, facet将不再是solr的专利. lucene用户可以进行facet运算了. <br /><br />从今年开始, 你可以通过使用Join module(<a href="http://wiki.apache.org/solr/Join" target="_blank">http://wiki.apache.org/solr/Join</a> ) 对父子关联的文档建索引, 这样我们可以在查询的过程中根据文档索引将父子文档进行连接. <br /><br />2011年, 在多语言支持方面(<a href="http://wiki.apache.org/solr/LanguageAnalysis#Stemming" target="_blank">http://wiki.apache.org/solr/LanguageAnalysis#Stemming</a> ) ,solr和lucene也取得了重大突破: 加入了KStemFilter English stemmer(<a href="http://wiki.apache.org/solr/LanguageAnalysis#Notes_about_solr.KStemFilterFactory" target="_blank">http://wiki.apache.org/solr/LanguageAnalysis#Notes_about_solr.KStemFilterFactory</a> ) , 提供了对Unicode 4完整的支持, 增加了对中文和日文的支持, 增加了一个新的stemmer保护机制. 降低了synonym filter对内存的消耗. 其中最大的一个增强是集成了Hunspell(<a href="http://wiki.apache.org/solr/LanguageAnalysis#Notes_about_solr.HunspellStemFilterFactory" target="_blank">http://wiki.apache.org/solr/LanguageAnalysis#Notes_about_solr.HunspellStemFilterFactory</a> ), 这样可以使用OpenOffice所支持的语言进行stemming处理. <br /><br />lucene 3.5.0的发布, 大幅度的降低了term词典的内存消耗(在对term词典处理时, 比以前减少了3~5倍). <br /><br />以前在使用lucene的时候, 如果对大数据量的搜索结果进行分页处理, 从头翻到尾会出现问题. 而在lucene 3.5.0这个版本, 通过引入searchAfter方法进行了彻底的解决. <br /><br />在这一年, lucene和solr提供了一个新的, 更高效, 更可靠的基于Term Vector的高亮功能. <br /><br />在这一年, solr集成了扩展的Dismax查询解析器(<a href="http://search-lucene.com/?q=Extended+Dismax" target="_blank">http://search-lucene.com/?q=Extended+Dismax</a> ), 进一步提高了搜索结果的质量. <br /><br />这一年, 你可以使用函数(<a href="http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function" target="_blank">http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function</a> )对搜索结果进行排序(比如根据某个值到指定点的距离进行排序), 并且提供了一个新的根据空间搜索过滤器. <br /><br />solr也提供了一个新的, 基于FST机器人(可以显著的降低内存消耗)的suggest (<a href="http://wiki.apache.org/solr/Suggester" target="_blank">http://wiki.apache.org/solr/Suggester</a> )/自动完成搜索功能, 如果你对这个功能感兴趣, 可以关注一下Sematext (<a href="http://sematext.com/products/autocomplete/index.html" target="_blank">http://sematext.com/products/autocomplete/index.html</a> )提供的自动完成搜索功能. <br /><br />这里还需要提到的就是solr即将提供的新的事务日志(transaction log <a href="https://issues.apache.org/jira/browse/SOLR-2700" target="_blank">https://issues.apache.org/jira/browse/SOLR-2700</a> )支持, 该支持将实现实时返回(real-time get <a href="https://issues.apache.org/jira/browse/SOLR-2656" target="_blank">https://issues.apache.org/jira/browse/SOLR-2656</a> )的功能, 即在添加一个文档之后你能立即根据id返回该文档. 事务日志也将用于SolrCloud分布式节点的恢复. <br /><br />说到SolrCloud(<a href="http://wiki.apache.org/solr/SolrCloud" target="_blank">http://wiki.apache.org/solr/SolrCloud</a> ) 这里(<a href="http://blog.sematext.com/2011/09/14/solr-digest-spring-summer-2011-part-2-solr-cloud-and-near-real-time-search/" target="_blank">http://blog.sematext.com/2011/09/14/solr-digest-spring-summer-2011-part-2-solr-cloud-and-near-real-time-search/</a> )还有一篇介绍. 对于SolrCloud, 用一句话来概括, 就是运用最新的设计原则并借助其他软件模块(比如zookeeper)更快速的搭建一套更强大solr分布式集群. 其核心思想就是拒绝单点故障, 采用中心化的集群和配置管理, 打破原有的master-slave架构, 做到容灾自动切换和动态调整. <br /><br />2010年将两个项目的开发进行整合之后, 这两个项目的发展非常迅猛. 在2011年, lucene和solr在众多committer们的大力支持下发布了5个版本. 三月, lucene和solr 3.1版本发布, 3个月后的6月4日, 3.2版本发布. 一个月之后, 7月1日, lucene和solr 3.3版本发布. 9月14日, 3.4版本发布, 11月, 3.5.0版本顺利发布. <br /><br />在2011年, lucene和solr相关的会议也不少, 首先登场是是5月份在旧金山举行的Lucene Revolution, otis在大会上做了题为"Search Analytics: What? Why? How?"(<a href="http://java.dzone.com/articles/lucene-solr-year-2011-review" target="_blank">http://java.dzone.com/articles/lucene-solr-year-2011-review</a> )的演讲, 其他干货猛击这里 (<a href="http://lucenerevolution.com/2011/agenda" target="_blank">http://lucenerevolution.com/2011/agenda</a> ) . 在六月份的Buzzwords大会上, otis在大会上做了"Search Analytics: What? Why? How?"的升级版演讲. 相关资料可参考官方网站: <a href="http://berlinbuzzwords.de/" target="_blank">http://berlinbuzzwords.de</a> . 10月份, 在巴塞罗那举行了专门针对lucene和solr的 Lucene Eurocon 2011 大会. Otis 在大会上做了主题为"Search Analytics: Business Value &amp; BigData NoSQL Backend"(<a href="http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/otis_gospodnetic_search_analytics_lucene_eurocon_2011.ppt" target="_blank">http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/otis_gospodnetic_search_analytics_lucene_eurocon_2011.ppt</a> )的主题演讲, 而Rafał(<a href="http://twitter.com//kucrafal" target="_blank">http://twitter.com//kucrafal</a> )在大会上做了"Explaining &amp; Visualizing Solr 'explain' information"(<a href="http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/Understanding%20and%20Visualizing%20Solr%20Explain%20information%20-%20Solr.pl%20-%20version%202.pdf" target="_blank">http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/Understanding%20and%20Visualizing%20Solr%20Explain%20information%20-%20Solr.pl%20-%20version%202.pdf</a> )的演讲. <br /><br />在2011年, lucene和solr又迎来了一批新的志同道合者: <br />&#8226;Andi Vajda <br />&#8226;Chris Male <br />&#8226;Dawid Weiss <br />&#8226;Erick Erickson <br />&#8226;Jan H&#248;ydahl <br />&#8226;Martin van Groningen <br />&#8226;Stanisław Osiński <br /><br />对于一个成功的开源项目, 相关的图书对使用者也是必不可少. 虽然今年Lucene in Action没有推出新的版本, 但是Rafał Kuć在今年7月给我们带来了它的新作"Solr 3.1 Cookbook". 在该书中,&nbsp; 为解决solr的一些常见问题, Rafał给出了他的答案. 而David Smiley 和 Eric Pugh在今年十一月推出了"Apache Solr 3 Enterprise Search Server"的新版本. <br /><br />至于2012年, lucene和solr会带来什么新的惊喜, 让我们拭目以待.  <img src ="http://www.blogjava.net/conans/aggbug/379552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:44 <a href="http://www.blogjava.net/conans/articles/379552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SolrJ生成索引</title><link>http://www.blogjava.net/conans/articles/379551.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379551.html</guid><description><![CDATA[代码很简单, 直接看就明白了, 可以在实际工作中借鉴, 原文在<a href="http://java.dzone.com/articles/indexing-solrj" target="_blank">这里</a>. 这个例子使用两种方式来演示如何生成全量索引: <br />一个是从db中通过sql生成全量索引 <br />一个是通过tika解析文件生成全量索引 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;SolrJExample;<br /><br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.solr.client.solrj.SolrServerException;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.solr.client.solrj.impl.XMLResponseParser;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.solr.client.solrj.response.UpdateResponse;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.solr.common.SolrInputDocument;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.tika.metadata.Metadata;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.tika.parser.AutoDetectParser;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.tika.parser.ParseContext;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.tika.sax.BodyContentHandler;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.ContentHandler;<br /><br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.File;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.FileInputStream;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.InputStream;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.sql.</span><span style="color: #000000">*</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.ArrayList;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Collection;<br /><br /></span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;Example&nbsp;class&nbsp;showing&nbsp;the&nbsp;skeleton&nbsp;of&nbsp;using&nbsp;Tika&nbsp;and<br />&nbsp;&nbsp;&nbsp;Sql&nbsp;on&nbsp;the&nbsp;client&nbsp;to&nbsp;index&nbsp;documents&nbsp;from<br />&nbsp;&nbsp;&nbsp;both&nbsp;structured&nbsp;documents&nbsp;and&nbsp;a&nbsp;SQL&nbsp;database.<br /><br />&nbsp;&nbsp;&nbsp;NOTE:&nbsp;The&nbsp;SQL&nbsp;example&nbsp;and&nbsp;the&nbsp;Tika&nbsp;example&nbsp;are&nbsp;entirely&nbsp;orthogonal.<br />&nbsp;&nbsp;&nbsp;Both&nbsp;are&nbsp;included&nbsp;here&nbsp;to&nbsp;make&nbsp;a<br />&nbsp;&nbsp;&nbsp;more&nbsp;interesting&nbsp;example,&nbsp;but&nbsp;you&nbsp;can&nbsp;omit&nbsp;either&nbsp;of&nbsp;them.<br /><br />&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SqlTikaExample&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;StreamingUpdateSolrServer&nbsp;_server;<br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;_start&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;AutoDetectParser&nbsp;_autoParser;<br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_totalTika&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_totalSql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Collection&nbsp;_docs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br /><br />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlTikaExample&nbsp;idxer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SqlTikaExample(</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8983/solr</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idxer.doTikaDocuments(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">/Users/Erick/testdocs</span><span style="color: #000000">"</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idxer.doSqlDocuments();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idxer.endIndexing();<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;SqlTikaExample(String&nbsp;url)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;SolrServerException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;a&nbsp;multi-threaded&nbsp;communications&nbsp;channel&nbsp;to&nbsp;the&nbsp;Solr&nbsp;server.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Could&nbsp;be&nbsp;CommonsHttpSolrServer&nbsp;as&nbsp;well.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_server&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StreamingUpdateSolrServer(url,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_server.setSoTimeout(</span><span style="color: #000000">1000</span><span style="color: #000000">);&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;socket&nbsp;read&nbsp;timeout</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_server.setConnectionTimeout(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;_server.setMaxRetries(</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;defaults&nbsp;to&nbsp;0.&nbsp;&nbsp;&gt;&nbsp;1&nbsp;not&nbsp;recommended.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;binary&nbsp;parser&nbsp;is&nbsp;used&nbsp;by&nbsp;default&nbsp;for&nbsp;responses</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_server.setParser(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XMLResponseParser());&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;One&nbsp;of&nbsp;the&nbsp;ways&nbsp;Tika&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;attempt&nbsp;to&nbsp;parse&nbsp;arbitrary&nbsp;files.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_autoParser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AutoDetectParser();<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Just&nbsp;a&nbsp;convenient&nbsp;place&nbsp;to&nbsp;wrap&nbsp;things&nbsp;up.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;endIndexing()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;SolrServerException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_docs.size()&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Are&nbsp;there&nbsp;any&nbsp;documents&nbsp;left&nbsp;over?</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_server.add(_docs,&nbsp;</span><span style="color: #000000">300000</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Commit&nbsp;within&nbsp;5&nbsp;minutes</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;_server.commit();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Only&nbsp;needs&nbsp;to&nbsp;be&nbsp;done&nbsp;at&nbsp;the&nbsp;end,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;commitWithin&nbsp;should&nbsp;do&nbsp;the&nbsp;rest.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Could&nbsp;even&nbsp;be&nbsp;omitted<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;assuming&nbsp;commitWithin&nbsp;was&nbsp;specified.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;endTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000">"</span><span style="color: #000000">Total&nbsp;Time&nbsp;Taken:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;(endTime&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;_start)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;milliseconds&nbsp;to&nbsp;index&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;_totalSql&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;SQL&nbsp;rows&nbsp;and&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;_totalTika&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;documents</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;I&nbsp;hate&nbsp;writing&nbsp;System.out.println()&nbsp;everyplace,<br />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;besides&nbsp;this&nbsp;gives&nbsp;a&nbsp;central&nbsp;place&nbsp;to&nbsp;convert&nbsp;to&nbsp;true&nbsp;logging<br />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;in&nbsp;a&nbsp;production&nbsp;system.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;log(String&nbsp;msg)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg);<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;*&nbsp;***************************Tika&nbsp;processing&nbsp;here<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Recursively&nbsp;traverse&nbsp;the&nbsp;filesystem,&nbsp;parsing&nbsp;everything&nbsp;found.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doTikaDocuments(File&nbsp;root)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;SolrServerException&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Simple&nbsp;loop&nbsp;for&nbsp;recursively&nbsp;indexing&nbsp;all&nbsp;the&nbsp;files<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;in&nbsp;the&nbsp;root&nbsp;directory&nbsp;passed&nbsp;in.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(File&nbsp;file&nbsp;:&nbsp;root.listFiles())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(file.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doTikaDocuments(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Get&nbsp;ready&nbsp;to&nbsp;parse&nbsp;the&nbsp;file.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentHandler&nbsp;textHandler&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BodyContentHandler();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Metadata&nbsp;metadata&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Metadata();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParseContext&nbsp;context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ParseContext();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;input&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(file);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Try&nbsp;parsing&nbsp;the&nbsp;file.&nbsp;Note&nbsp;we&nbsp;haven't&nbsp;checked&nbsp;at&nbsp;all&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;see&nbsp;whether&nbsp;this&nbsp;file&nbsp;is&nbsp;a&nbsp;good&nbsp;candidate.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_autoParser.parse(input,&nbsp;textHandler,&nbsp;metadata,&nbsp;context);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Needs&nbsp;better&nbsp;logging&nbsp;of&nbsp;what&nbsp;went&nbsp;wrong&nbsp;in&nbsp;order&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;track&nbsp;down&nbsp;"bad"&nbsp;documents.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(String.format(</span><span style="color: #000000">"</span><span style="color: #000000">File&nbsp;%s&nbsp;failed</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;file.getCanonicalPath()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Just&nbsp;to&nbsp;show&nbsp;how&nbsp;much&nbsp;meta-data&nbsp;and&nbsp;what&nbsp;form&nbsp;it's&nbsp;in.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dumpMetadata(file.getCanonicalPath(),&nbsp;metadata);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Index&nbsp;just&nbsp;a&nbsp;couple&nbsp;of&nbsp;the&nbsp;meta-data&nbsp;fields.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrInputDocument&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SolrInputDocument();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.addField(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;file.getCanonicalPath());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Crude&nbsp;way&nbsp;to&nbsp;get&nbsp;known&nbsp;meta-data&nbsp;fields.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Also&nbsp;possible&nbsp;to&nbsp;write&nbsp;a&nbsp;simple&nbsp;loop&nbsp;to&nbsp;examine&nbsp;all&nbsp;the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;metadata&nbsp;returned&nbsp;and&nbsp;selectively&nbsp;index&nbsp;it&nbsp;and/or<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;just&nbsp;get&nbsp;a&nbsp;list&nbsp;of&nbsp;them.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;One&nbsp;can&nbsp;also&nbsp;use&nbsp;the&nbsp;LucidWorks&nbsp;field&nbsp;mapping&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;accomplish&nbsp;much&nbsp;the&nbsp;same&nbsp;thing.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;author&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;metadata.get(</span><span style="color: #000000">"</span><span style="color: #000000">Author</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(author&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.addField(</span><span style="color: #000000">"</span><span style="color: #000000">author</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;author);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.addField(</span><span style="color: #000000">"</span><span style="color: #000000">text</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;textHandler.toString());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_docs.add(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_totalTika;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Completely&nbsp;arbitrary,&nbsp;just&nbsp;batch&nbsp;up&nbsp;more&nbsp;than&nbsp;one&nbsp;document<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;for&nbsp;throughput!</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_docs.size()&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Commit&nbsp;within&nbsp;5&nbsp;minutes.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateResponse&nbsp;resp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_server.add(_docs,&nbsp;</span><span style="color: #000000">300000</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(resp.getStatus()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000">"</span><span style="color: #000000">Some&nbsp;horrible&nbsp;error&nbsp;has&nbsp;occurred,&nbsp;status&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.getStatus());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_docs.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Just&nbsp;to&nbsp;show&nbsp;all&nbsp;the&nbsp;metadata&nbsp;that's&nbsp;available.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dumpMetadata(String&nbsp;fileName,&nbsp;Metadata&nbsp;metadata)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000">"</span><span style="color: #000000">Dumping&nbsp;metadata&nbsp;for&nbsp;file:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(String&nbsp;name&nbsp;:&nbsp;metadata.names())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(name&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;metadata.get(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000">"</span><span style="color: #000000">\n\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;*&nbsp;***************************SQL&nbsp;processing&nbsp;here<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doSqlDocuments()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(</span><span style="color: #000000">"</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #000000">"</span><span style="color: #000000">).newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000">"</span><span style="color: #000000">Driver&nbsp;Loaded<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DriverManager.getConnection(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc:mysql://192.168.1.103:3306/test?</span><span style="color: #000000">"</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">user=testuser&amp;password=test123</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;con.createStatement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;st.executeQuery(</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;id,title,text&nbsp;from&nbsp;test</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(rs.next())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;DO&nbsp;NOT&nbsp;move&nbsp;this&nbsp;outside&nbsp;the&nbsp;while&nbsp;loop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;or&nbsp;be&nbsp;sure&nbsp;to&nbsp;call&nbsp;doc.clear()</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrInputDocument&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SolrInputDocument();</span><span style="color: #000000">&amp;</span><span style="color: #000000">nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">title</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">text</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.addField(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.addField(</span><span style="color: #000000">"</span><span style="color: #000000">title</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;title);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.addField(</span><span style="color: #000000">"</span><span style="color: #000000">text</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;text);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_docs.add(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_totalSql;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Completely&nbsp;arbitrary,&nbsp;just&nbsp;batch&nbsp;up&nbsp;more&nbsp;than&nbsp;one<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;document&nbsp;for&nbsp;throughput!</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_docs.size()&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Commit&nbsp;within&nbsp;5&nbsp;minutes.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateResponse&nbsp;resp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_server.add(_docs,&nbsp;</span><span style="color: #000000">300000</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(resp.getStatus()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000">"</span><span style="color: #000000">Some&nbsp;horrible&nbsp;error&nbsp;has&nbsp;occurred,&nbsp;status&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.getStatus());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_docs.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(con&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br /></span></div><br /><br /><img src ="http://www.blogjava.net/conans/aggbug/379551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:43 <a href="http://www.blogjava.net/conans/articles/379551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solr调优参考</title><link>http://www.blogjava.net/conans/articles/379550.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379550.html</guid><description><![CDATA[<div><font style="background-color: #cce8cf">转自：<a href="http://rdc.taobao.com/team/jm/archives/1753">http://rdc.taobao.com/team/jm/archives/1753</a><br />共整理三部分，第一部分Solr常规处理，第二部分针对性性处理，前者比较通用，后者有局限性。务必根据具体应用特性，具体调节参数，对比性能。第三部分<br />solr查询相关的 
<p>&nbsp;</p>
<p>具体应用需要全面去把控，各个因素一起起作用。</p>
<p><span style="font-weight: bold">第一部分&lt;Solr常规的调优&gt;</span><br />E文连接 http://wiki.apache.org/solr/SolrPerformanceFactors</p>
<h2 style="margin: 0cm 0cm 0pt"><span lang="EN-US">Schema Design Considerations</span></h2>
<h3><span lang="EN-US">indexed fields</span></h3>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;indexed fields</span> 的数量将会影响以下的一些性能：</p>
<ul style="margin-top: 0cm" type="disc"><li><span style="font-family: 宋体">索引时的时候的内存使用量</span></li><li><span style="font-family: 宋体">索引段的合并时间</span></li><li><span style="font-family: 宋体">优化时间</span></li><li><span style="font-family: 宋体">索引的大小</span></li></ul>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>我们可以通过将<span lang="EN-US">omitNorms=&#8220;true&#8221;</span>来减少<span lang="EN-US">indexed fields</span>数量增加所带来的影响。</p>
<h3><span lang="EN-US">stored fields</span></h3>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;Retrieving the stored fields&nbsp;</span>确实是一种开销。这个开销，受每个文档所存储的字节影响很大。<strong>每个文档的所占用的空间越大，文档就显的更稀疏</strong>，这样从硬盘中读取数据，就需要更多的<span lang="EN-US">i/o</span>操作（通常，我们在存储比较大的域的时候，就会考虑这样的事情，比如存储一篇文章的文档。）</p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>可以考虑将比较大的域放到<span lang="EN-US">solr</span>外面来存储。如果你觉得这样做会有些别扭的话，可以考虑使用压缩的域，但是这样会加重<span lang="EN-US">cpu</span>在存储和读取域的时候的负担。不过这样却是可以较少<span lang="EN-US">i/0</span>的负担。</p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>如果，你并不是总是使用<span lang="EN-US">stored fields</span>的话，可以使用<span lang="EN-US">stored field</span>的延迟加载，这样可<strong>以节省很多的性能</strong>，尤其是使用<span lang="EN-US">compressed field</span> 的时候。</p>
<h2><span lang="EN-US">Configuration Considerations</span></h2>
<h3><span lang="EN-US">mergeFactor</span></h3>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>这个是合并因子，这个参数<strong>大概</strong>决定了<span lang="EN-US">segment(</span>索引段<span lang="EN-US">)</span>的数量。</p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>合并因子这个值告诉<span lang="EN-US">lucene</span>，在什么时候，要将几个<span lang="EN-US">segment</span>合并成为一个<span lang="EN-US">segment,</span> 合并因子就像是一个数字系统的<strong>基数</strong>一样。</p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>比如说，如果你将合并因子设成<span lang="EN-US">10</span>，那么每往索引中添加<span lang="EN-US">1000</span>个文档的时候，就会创建一个新的索引段。当第<span lang="EN-US">10</span>个大小为<span lang="EN-US">1000</span>的索引段添加进来的时候，这十个索引段就会被合并成一个大小为<span lang="EN-US">10</span>，<span lang="EN-US">000</span>的索引段。当十个大小为<span lang="EN-US">10</span>，<span lang="EN-US">000</span>的索引段生成的时候，它们就会被合并成一个大小为<span lang="EN-US">100</span>，<span lang="EN-US">000</span>的索引段。如此类推下去。</p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span><br />这个值可以在<span lang="EN-US">solrconfig.xml</span> 中的<br /><span lang="EN-US">*<strong>mainIndex</strong>*</span>中设置。（不用管<span lang="EN-US">indexDefaults</span>中设置）</p>
<h3><span lang="EN-US">&nbsp;mergeFactor Tradeoffs</span></h3>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;</span>较高的合并因子</p>
<ul style="margin-top: 0cm" type="disc"><li><span lang="EN-US">&nbsp;&nbsp;</span><span style="font-family: 宋体">会提高索引速度</span></li><li><span lang="EN-US">&nbsp;&nbsp;</span><span style="font-family: 宋体">较低频率的合并，会导致更多的索引文件，这会降低索引的搜索效率</span></li></ul>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;</span>较低的合并因子</p>
<ul style="margin-top: 0cm" type="disc"><li><span lang="EN-US">&nbsp;&nbsp;</span><span style="font-family: 宋体">较少数量的索引文件，能加快索引的搜索速度。</span></li><li><span lang="EN-US">&nbsp;&nbsp;</span><span style="font-family: 宋体">较高频率的合并，会降低索引的速度。</span></li></ul>
<h2><span lang="EN-US">HashDocSet Max Size Considerations</span></h2>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span>&nbsp;</span></span><span lang="EN-US"><span>&nbsp;</span>hashDocSet</span><span>是</span><span lang="EN-US">solrconfig.xml</span><span>中自定义优化选项</span><span lang="EN-US">,</span> <span><br />使用在</span><span lang="EN-US">filters(docSets)</span> <span><br />中，更小的</span><span lang="EN-US">sets</span><span>，表明更小的内存消耗、遍历、插入。</span></p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span>&nbsp;&nbsp;</span><br />hashDocSet</span><span>参数值最后基于索引文档总数来定，索引集合越大，</span><span lang="EN-US">hashDocSet</span><span>值也越大。</span></p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">Calulate 0.005 of the total number of documents that you are going to store.&nbsp; Try values on either &#8216;side&#8217; of that value to arrive at the best query times.  When query times seem to plateau, and performance doesn&#8217;t show much difference between the higher number and the lower, use the higher. </span></p>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">Note: hashDocSet is no longer part of Solr as of version 1.4.0, see <a href="https://issues.apache.org/jira/browse/SOLR-1169"><span style="color: windowtext; text-decoration: none">SOLR-1169</span></a>.</span></p>
<h2><span lang="EN-US">Cache autoWarm Count Considerations</span></h2>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>当一个新的<span lang="EN-US">searcher</span> 打开的时候，它缓存可以被预热，或者说<strong>使用从旧的<span lang="EN-US">searcher</span>的缓存的数据来<span lang="EN-US">&#8220;</span>自动加热<span lang="EN-US">&#8221;</span></strong>。<span lang="EN-US">autowarmCount</span>是这样的一个参数，它表示从旧缓存中拷贝到新缓存中的对象数量。<span lang="EN-US">autowarmCount</span>这个参数将会影响<span lang="EN-US">&#8220;</span><strong>自动预热<span lang="EN-US">&#8221;</span>的时间</strong>。有些时候，我们需要一些折中的考虑，<span lang="EN-US">seacher</span>启动的时间和缓存加热的程度。当然啦，缓存加热的程度越好，使用的时间就会越长，但往往，我们并不希望过长的<span lang="EN-US">seacher</span>启动时间。这个<span lang="EN-US">autowarm</span> 参数可以在<span lang="EN-US">solrconfig.xml</span>文件中被设置。</p>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;</span>详细的配置可以参考<span lang="EN-US">solr</span>的<span lang="EN-US">wiki</span>。</p>
<h2><span lang="EN-US">Cache hit rate</span>（缓存命中率）</h2>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>我们可以通过<span lang="EN-US">solr</span>的<span lang="EN-US">admin</span>界面来查看缓存的状态信息。<strong>提高<span lang="EN-US">solr</span>缓存的大小往往是提高性能的捷径</strong>。当你使用<strong>面搜索的时候</strong>，你或许可以注意一下<span lang="EN-US">filterCache,</span>这个是由<span lang="EN-US">solr</span>实现的缓存。</p>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;</span><br />详细的内容可以参考<span lang="EN-US">solrCaching</span>这篇<span lang="EN-US">wiki</span>。</p>
<h2><span lang="EN-US">Explicit Warming of Sort Fields&nbsp;</span></h2>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>如果你有许多域是基于排序的，那么你可以在<span lang="EN-US">&#8220;newSearcher&#8221;</span>和<span lang="EN-US">&#8220;firstSearcher&#8221;event<br />listeners</span>中添加一些明显需要预热的查询，这样<strong><span lang="EN-US">FieldCache</span> 就会缓存这部分内容</strong>。</p>
<h2><span lang="EN-US">Optimization Considerations</span></h2>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>优化索引，是我们经常会做的事情，比如，当我们建立好索引，然后这个索引<strong>不会再变更的情况</strong>，我们就会做一次优化了。</p>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>但，如果你的索引经常会改变，那么你就需要好好的考虑下面的因素的。</p>
<ul type="disc"><li><span style="font-family: 宋体">当越来越多的索引段被加进索引，查询的性能就会降低，</span> <span lang="EN-US">lucene</span><span style="font-family: 宋体">对索引段的数量有一个上限的限制，当超过这个限制的时候，索引段可以自动合并成为一个。</span></li><li><span style="font-family: 宋体">在同样没有缓存的情况下，一个没有经过优化的索引的性能会比经过优化的索引的性能少</span><span lang="EN-US">10%&#8230;&#8230;</span></li><li><span style="font-family: 宋体">自动加热的时间将会变长，因为它依赖于搜索。</span></li><li><span lang="EN-US">&nbsp;</span><strong><span style="font-family: 宋体">优化将会对索引的分发产生影响</span></strong><span style="font-family: 宋体">。</span></li><li><span lang="EN-US">&nbsp;</span><span style="font-family: 宋体">在优化期间，文件的大小将会是<strong>索引的两倍</strong>，不过最终将会回到它原来的大小，或者会更小一点。</span></li></ul>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>优化，会将所有的索引段合并成为一个索引段，所以，优化这个操作其实可以帮助避免<span lang="EN-US">&#8220;too many files&#8221;</span>这个问题，这个错误是由文件系统抛出的。</p>
<h2><span lang="EN-US">Updates and Commit Frequency Tradeoffs</span></h2>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;</span><br />如果从机 经常从 主机更新的话，从机的性能是会受到影响的。为了避免，由于这个问题而引起的性能下降，我们还必须了解从机是怎样执行更新的，这样我们才能更准确去调节一些相关的参数（<span lang="EN-US">commit</span>的频率，<span lang="EN-US">spappullers, autowarming/autocount</span>）<span lang="EN-US">,</span>这样，从机的更新才不会太频繁。</p>
<ol type="1"><li><span style="font-family: 宋体"><br />执行</span><span lang="EN-US">commit</span><span style="font-family: 宋体">操作会让</span><span lang="EN-US">solr</span><span style="font-family: 宋体">新生成一个</span><span lang="EN-US">snapshot</span><span style="font-family: 宋体">。如果将</span><span lang="EN-US">postCommit</span><span style="font-family: 宋体">参数设成</span><span lang="EN-US">true</span><span style="font-family: 宋体">的话，</span><span lang="EN-US">optimization</span><span style="font-family: 宋体">也会执行</span><span lang="EN-US">snapShot.</span></li><li><span lang="EN-US">slave</span><span style="font-family: 宋体">上的</span><span lang="EN-US">Snappuller</span><span style="font-family: 宋体">程序一般是在</span><span style="background: yellow" lang="EN-US">crontab</span><span style="font-family: 宋体">上面执行的，它会去</span><span lang="EN-US">master</span><span style="font-family: 宋体">询问，有没有新版的</span><span lang="EN-US">snapshot</span><span style="font-family: 宋体">。一旦发现新的版本，</span><span lang="EN-US">slave</span><span style="font-family: 宋体">就会把它下载下来，然后</span><span lang="EN-US">snapinstall.</span></li><li><span style="font-family: 宋体">每次当一个新的</span><span lang="EN-US">searcher</span><span style="font-family: 宋体">被</span><span lang="EN-US">open</span><span style="font-family: 宋体">的时候，会有一个缓存预热的过程，<strong>预热之后，新的索引才会交付使用。</strong></span></li></ol>
<p style="margin: 0cm 0cm 0pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;</span>这里讨论三个有关的参数：</p>
<ul style="margin-top: 0cm" type="disc"><li><span lang="EN-US">&nbsp;<strong><span>number/frequency of snapshots</span></strong>&nbsp; &#8212;-snapshot</span><span style="font-family: 宋体">的频率。</span></li><li><strong><span lang="EN-US">snappullers </span></strong><strong><span>是</span></strong><span lang="EN-US">&nbsp;</span> <span style="font-family: 宋体">在</span><span lang="EN-US">crontab</span><span style="font-family: 宋体">中的，它当然可以每秒一次、每天一次、或者其他的时间间隔一次运行。它运行的时候，只会下载</span><span lang="EN-US">slave</span><span style="font-family: 宋体">上没有的，并且最新的版本。</span></li><li><strong><span lang="EN-US">Cache autowarming</span></strong> <span style="font-family: 宋体">可以在</span><span lang="EN-US">solrconfig.xml</span><span style="font-family: 宋体">文件中配置。</span></li></ul>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>如果，你想要的效果是频繁的更新<span lang="EN-US">slave</span>上的索引，以便这样看起来比较像<span lang="EN-US">&#8220;</span>实时索引<span lang="EN-US">&#8221;</span>。那么，你就需要让<span lang="EN-US">snapshot</span>尽可能频繁的运行，然后也让<span lang="EN-US">snappuller</span>频繁的运行。这样，我们或许可以每<span lang="EN-US">5</span>分钟更新一次，并且还能取得不错的性能，当然啦，<span lang="EN-US">cach</span>的命中率是很重要的，恩，缓存的加热时间也将会影响到更新的频繁度。</p>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;<strong>&nbsp;<span style="background: yellow">cache</span></strong></span><strong><span style="background: yellow">对性能是很重要的</span></strong>。一方面，新的缓存必须拥有足够的缓存量，这样接下来的的查询才能够从缓存中受益。另一方面，缓存的预热将可能占用很长一段时间，尤其是，它其实是只使用一个线程，和一个<span lang="EN-US">cpu</span>在工作。<span lang="EN-US">snapinstaller</span>太频繁的话，<span lang="EN-US">solr<br />slave</span>将会处于一个不太理想的状态，可能它还在预热一个新的缓存，然而一个更新的<span lang="EN-US">searcher</span>被<span lang="EN-US">opern</span>了。</p>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>怎么解决这样的一个问题呢，我们可能会取消第一个<span lang="EN-US">seacher</span>，然后去处理一个更新<span lang="EN-US">seacher</span>，也即是第二个。然而有可能第二个<span lang="EN-US">seacher</span> 还没有被使用上的时候，第三个又过来了。看吧，一个恶性的循环，不是。当然也有可能，我们刚刚预热好的时候就开始新一轮的缓存预热，其实，这样缓存的作用压根就没有能体现出来。出现这种情况的时候，降低<span lang="EN-US">snapshot</span>的频率才是硬道理。</p>
<h2><span lang="EN-US">Query Response Compression</span></h2>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>在有些情况下，我们可以考虑将<span lang="EN-US">solr xml response</span> <strong>压缩后才输出</strong>。如果<span lang="EN-US">response</span>非常大，就会触及<span lang="EN-US">NIc i/o</span>限制。</p>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>当然压缩这个操作将会增加<span lang="EN-US">cpu</span>的负担，其实，<span lang="EN-US">solr</span>一个典型的依赖于<span lang="EN-US">cpu</span>处理速度的服务，增加这个压缩的操作，将无疑会降低查询性能。但是，压缩后的数据将会是压缩前的数据的<strong><span lang="EN-US">6</span>分之一的大小</strong>。然而<span lang="EN-US">solr</span>的查询性能也会有<span lang="EN-US">15%</span>左右的消耗。</p>
<p><span lang="EN-US">&nbsp;&nbsp;</span>至于怎样配置这个功能，要看你使用的什么服务器而定，可以查阅相关的文档。</p>
<h2><span lang="EN-US">Embedded vs HTTP Post</span></h2>
<p><span lang="EN-US">&nbsp;</span>使用<span lang="EN-US">embeded</span> 来建立索引，将会比使用<span lang="EN-US">xml</span>格式来建立索引快<span lang="EN-US">50%</span>。</p>
<h2><span lang="EN-US">RAM Usage Considerations</span>（内存方面的考虑）</h2>
<h3><span lang="EN-US">&nbsp;OutOfMemoryErrors</span></h3>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>如果你的<span lang="EN-US">solr</span>实例没有被指定足够多的内存的话，<span lang="EN-US">java virtual machine</span>也许会抛<span lang="EN-US">outof memoryError</span>，这个<strong>并不对索引数据产生影响</strong>。但是这个时候，任何的<span lang="EN-US">adds/deletes/commits</span>操作都是不能够成功的。</p>
<h3><span lang="EN-US">&nbsp;Memory allocated to the Java VM</span></h3>
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;</span>最简单的解决这个方法就是，当然前提是<span lang="EN-US">java virtual machine</span>还没有使用掉你全部的内存，增加运行<span lang="EN-US">solr</span>的<span lang="EN-US">java</span>虚拟机的内存。</p>
<h4><span lang="EN-US">&nbsp;Factors affecting memory usage</span><span style="font-family: 宋体">（影响内存使用量的因素）</span></h4>
<p style="margin: 0cm 0cm 0pt">我想，你或许也会考虑怎样去减少<span lang="EN-US">solr</span>的内存使用量。其中的一个因素就是<span lang="EN-US">input document</span>的大小。当我们使用<span lang="EN-US">xml</span>执行<span lang="EN-US">add</span>操作的时候，就会有两个限制。</p>
<ul style="margin-top: 0cm" type="disc"><li><span lang="EN-US">document</span><span style="font-family: 宋体">中的</span><span lang="EN-US">field</span><span style="font-family: 宋体">都是会被存进内存的，</span><span lang="EN-US">field</span><span style="font-family: 宋体">有个属性叫</span><span lang="EN-US">maxFieldLength</span><span style="font-family: 宋体">，它或许能帮上忙。</span></li><li><span style="font-family: 宋体">每增加一个域，也是会增加内存的使用的。</span></li></ul>
<p><span style="font-weight: bold">第二部分&lt;Solr特殊调优&gt;</span></p>
<p>1. 多core的时候</p>
<p>多core 如果同一时间进行core 切换，会导致内存、cpu压力过大，可以扩展Solr代码，限制最多同时core<br />切换的执行个数。保证不会出现高load或者高cpu 风险</p>
<p>2，应用较高安全</p>
<p>最后不低于2个结点工作，并且最好2个结点是跨机器的。<br />offline与online切换的时候，如果数据量不是很多，可以考虑index与search合一，如果数据量较大，超过5000w的时候，建议index<br />offline或者search结点之外的其他结点上执行index</p>
<p>3.cache参数配置</p>
<p>如果更新很频繁，导致commit和reopen频繁，如果可以的话，关闭cache.<br />如果访问中依赖cache提示性能，那么最好关闭cache warm，no facet 需求<br />或者开开启cache warm&nbsp; 有facet需要，对fieldvalue cache很依赖的话。<br />实时更新的话，通常document cache命中率比较低，完全可以不开启这个配置</p>
<p>4.reopen 和commit</p>
<p>如果可以的话，主磁盘索引，不参入segment合并，新的索引段走不同的目录。并且reopen的时候，主索引的不变动。</p>
<p>commit与reopen异步化</p>
<p>5.有一部分数据如果不变动，可以考虑使用memory cache 或者locale cache 平衡性能和空间开销，同时避免FGC</p>
<p>6.中间变量压缩、单例化</p>
<p>所有查询或者建索引过程中，尽量少创建对象，而通过set改变对象值，以及单例化，提升性能。一些较大中间变量，如果可以的话，采取一些整数压缩</p>
<p>7.对象表示重定义<br />例如日期、地区、url、byte等一些对象，可以考虑差值、区位码、可别部分、压缩等结构，使得内存开销降低间接使得内存使用率提高，获得更好性能。</p>
<p>8.index与store 隔离<br />就是index发挥它的查询性能，store发挥它的存储、响应性能。<br />也就是不要将所有的内容都放在index中，尽量使得field的属性stored=false</p>
<p>9. 使用solr、lucene最新版本</p>
<p>10. 共享分词实例<br />自定义的分词，务必使用单例。千万不要一个document创建一个分词对象</p>
<p><span style="font-weight: bold">第三部分 Solr查询</span></p>
<p>1. 对按指定域排序<br />展示的时候，对于数字的建议，展示最近1或者3个月数据。例如价格，防止作弊<br />dump或者建索引的时候，对数字加以上下界检测，及早发现数字本身正确，而实际意义不合理的数据</p>
<p>2. 排序可变性<br />默认的排序务必有自己的相关参数，并且平衡各方面需求。<br />排序要变，但是不至于大的波动。排序的细节不公开，但是排序的结果可以解释的清楚。</p>
<p>3.线上线下<br />有些分值可以线下完成，有些分值线上完成。看需求。</p>
<p>4.多域查询<br />如果默认查询多个域，不妨将多个域合成一个域，只差一个域</p>
<p>5.高亮<br />高亮可以在solr里面或者外面执行的，不一定在solr里面执行，可以在solr之外执行<br />同理，分词可以在线下执行好，dump只执行简单的空格分词即可</p>
<p>6.统计<br />facet统计可以先上与线下相结合，不一定完全依赖线上即时计数。</p>
<p>7.主动搜索<br />主动搜索查询串务必严格处理，既要去无效查询串，也要适当扩展查询串。<br />明确查询路径和hit=0的对应处理。</p><br /></font></div><img src ="http://www.blogjava.net/conans/aggbug/379550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:40 <a href="http://www.blogjava.net/conans/articles/379550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solr学习笔记-linux下配置solr(转)</title><link>http://www.blogjava.net/conans/articles/379549.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379549.html</guid><description><![CDATA[<p><span style="font-size: small">本文地址：</span></p>
<p><span style="line-height: 18px"><span style="font-size: small"></span></span></p>
<h3 style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"><a style="background-color: #108ac6; color: white; text-decoration: underline" href="http://zhoujianghai.iteye.com/blog/1540176"><span style="font-size: small">http://zhoujianghai.iteye.com/blog/1540176</span></a></h3>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px">&nbsp;</p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">首先介绍一下solr：</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"><span style="font-size: small">Apache Solr (读音:&nbsp;<span style="padding-bottom: 0px; line-height: 16px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">SOLer)&nbsp;</span>是一个开源、</span><span style="font-size: small">高性能、采用Java开发、</span><span style="font-size: small">基于<a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" href="http://www.oschina.net/p/lucene">Lucene</a>的全文搜索服务器</span><span style="font-size: small">，</span><span style="font-size: small">文档通过Http利用XML加到一个搜索集合中，查询该集合也是通过 http收到一个XML/<a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" href="http://www.oschina.net/project/search?q=JSON">JSON</a>响应来实现。</span><span style="font-size: small">Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成，每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性，默认情况下这个属性的名字是 id，在 Schema 配置文件（schema.xml）中使用：<code style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong>&lt;uniqueKey&gt;id&lt;/uniqueKey&gt;</strong></code>进行描述。solr有两个核心文件，solrconfig.xml和schema.xml。</span><span style="line-height: 26px; color: #333333; font-size: 14px">solrconfig.xml是solr的基础文件，里面配置了各种web请求处理器、请求响应处理器、日志、缓存等;</span><span style="line-height: 26px; color: #333333; font-size: 14px">schema.xml配置映射了各种数据类型的索引方案，分词器的配置、索引文档中包含的字段也在此配置。</span></span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">工作中主要用来分词和搜索，简单的工作原理是：利用分词器对数据源进行分词处理，然后根据分词结果建立索引库;查询的时候，利用分词器对查询语句进行分词，根据查询语句分词的结果在索引库中进行匹配，最后返回结果。</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"><br /></span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">废话少说，下面开始solr之旅吧：</span></span></span></p>
<p><strong><span style="font-size: x-small"><span style="font-size: small">一.安装JDK和Tomcat</span></span></strong></p>
<div><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">（1）：安装jdk &nbsp;下载jdk安装包，解压到jdk-1.x目录</span></span></span></div>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">（2）：安装tomcat，下载tomcat安装包，解压到apache-tomcat目录下</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">修改tomcat安装目录下的conf目录的server.xml</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">找到&lt;Connector port="8080" .../&gt;，加入<span style="line-height: 18px"><span style="color: black">URIEncoding=</span><span style="color: blue" class="string">"UTF-8"，为了</span></span>支持中文。</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: small">设置Java和tomcat环境变量</span></span></p>
<p><span style="font-size: x-small"><span style="font-size: small"><br /></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">上面两步比较简单，这里就只简单描述一下，不明白的可以网上查资料。</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: small"><br /></span></span></p>
<p><span style="font-size: x-small"><strong><span style="font-size: x-small"><span style="font-size: small">二. 安装solr</span></span></strong></span></p>
<p><span style="font-size: small"><span style="font-size: x-small"><span style="font-size: x-small">下载solr包，</span></span><span style="white-space: pre"><strong>http://labs.renren.com/apache-mirror/lucene/solr/3.5.0/apache-solr-3.5.0.zip</strong></span></span></p>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">解压缩到apache-solr目录，把apache-solr/dist目录下的apache-solr-3.5.0.war 复制到$TOMCAT_HOME/webapps目录下，重命名为solr.war</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">复制apache-solr/example/solr到tomcat根目录下（如果你想配置多core（实例），就复制apache-solr /example/multicore到tomcat根目录下，不用复制solr了），作为solr/home，以后也可以往该目录添加 core，每个core下面都可以有自己的配置文件。</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: small">在apache-tomcat/conf/Catalina/localhost/下创建solr.xml（跟webapps下的solr项目同名），指定solr.war和solr/home的位置，让tomcat启动时就自动加载该应用。</span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">solr.xml内容如下：</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">&lt;Context docBase="/home/zhoujh/java/apache-tomcat7/webapps/solr.war" debug="0" crossContext="true" &gt;</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">&nbsp; &nbsp;&lt;Environment name="solr/home" type="java.lang.String" value="/home/zhoujh/java/apache-tomcat7/solr" override="true" /&gt;</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">&lt;/Context&gt;</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">然后在tomcat的bin目录下执行./startup.sh，启动tomcat</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">在地址栏访问http://localhost:8080/solr/</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">将会出现solr欢迎界面和admin入口</span></span></span></p>
<p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small"><span style="font-size: x-small">注：如果出现<span style="color: #333333; font-size: 14px">org.apache.solr.common.SolrException: Error loading class 'solr.VelocityResponseWriter' 异常，最简单的</span><span style="color: #333333; font-size: 14px">解决方法：</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">找到</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">$TOMCAT_HOME/solr/</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">conf/solrconfig.xml，把</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&lt;queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" enable="${solr.velocity.enabled:true}"/&gt;注释掉或者</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">enable:false</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">即可。</span></span>如果一切顺利的话，现在可以看到solr的web管理界面了。不过要想实现分词的功能，得安装一个中文分词器，这里推荐<span>IKAnalyzer或</span><span>mmseg4j。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"><span>IKAnalyzer是一个开源的，基于java语言开发的轻量级的中文分词工具包，</span><span>采用了特有的&#8220;正向迭代最细粒度切分算法&#8220;，具有60万字/秒的高速处理能力，</span><span>采用了多子处理器分析模式，支持：英文字母（IP地址、Email、URL）、数字（日期，常用中文数量词，罗马数字，科学计数法），中文词汇（姓名、地名处理）等分词处理。</span><span>优化的词典存储，更小的内存占用。支持用户词典扩展定。</span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"><span>mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(<a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: #3e62a6; padding-top: 0px" href="http://technology.chtsai.org/mmseg/">http://technology.chtsai.org/mmseg/</a>&nbsp;)实现的中文分词器，并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。</span><span>MMSeg 算法有两种分词方法：Simple和Complex，都是基于正向最大匹配。Complex 加了四个规则过虑。官方说：词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。</span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong><span style="font-size: x-small"><span style="font-size: small">三. 配置中文分词器</span></span></strong></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">下面分别安装这两个中文分词器，当然选择安装其中一个也是可以的。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small">（1）<span style="color: #ff0000">安装<span>IKAnalyzer</span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">下载地址：<span style="font-size: 13px"><a style="border-bottom: #bbbbbb 1px dotted; background-color: #eeeeee; color: #555555; text-decoration: none" class="ext-link" href="http://code.google.com/p/ik-analyzer/downloads/list"><span style="padding-left: 12px; background-position: 50% 50%" class="icon">&nbsp;</span>http://code.google.com/p/ik-analyzer/downloads/list</a></span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">在当前目录下新建IKAnalyzer目录，解压到该目录下：unzip IKAnalyzer2012_u5.zip -d ./IKAnalyzer</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small">把IKAnalyzer目录下的IKAnalyzer2012.jar文件拷贝到 $TOMCAT_HOME/webapps/solr/WEB-INF/lib/下</span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small">配置schema.xml，编辑$TOMCAT_HOME/solr/conf/schema.xml，在文件中添加下面这个fieldtype</span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong><span style="color: #ff0000">注：下面的代码中多了很多&#8220;<span style="line-height: 18px"><span class="tag">&lt;</span><span class="tag-name">span</span>&nbsp;<span class="attribute">style</span>=<span class="attribute-value">"font-size:&nbsp;x-small;"</span><span class="tag">&gt;</span></span>&#8221;标签，这个是设置字体时iteye编辑器自己生成的。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">span&nbsp;</span><span style="color: #ff0000">style</span><span style="color: #0000ff">="font-size:&nbsp;x-small;"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">span&nbsp;</span><span style="color: #ff0000">style</span><span style="color: #0000ff">="font-size:&nbsp;x-small;"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">span&nbsp;</span><span style="color: #ff0000">style</span><span style="color: #0000ff">="font-size:&nbsp;small;"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">fieldType&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="solr.TextField"</span><span style="color: #ff0000">&nbsp;positionIncrementGap</span><span style="color: #0000ff">="100"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">analyzer&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="index"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tokenizer&nbsp;</span><span style="color: #ff0000">class&nbsp;</span><span style="color: #0000ff">=&nbsp;"org.wltea.analyzer.solr.IKTokenizerFactory"</span><span style="color: #ff0000">&nbsp;isMaxWordLength</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.StopFilterFactory"</span><span style="color: #ff0000">&nbsp;ignoreCase</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;words</span><span style="color: #0000ff">="stopwords.txt"</span><span style="color: #ff0000">&nbsp;enablePositionIncrements</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.WordDelimiterFilterFactory"</span><span style="color: #ff0000">&nbsp;generateWordParts</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;generateNumberParts</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;catenateWords</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;catenateNumbers</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;catenateAll</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;splitOnCaseChange</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.LowerCaseFilterFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.EnglishPorterFilterFactory"</span><span style="color: #ff0000">&nbsp;protected</span><span style="color: #0000ff">="protwords.txt"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.RemoveDuplicatesTokenFilterFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">analyzer&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="query"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tokenizer&nbsp;</span><span style="color: #ff0000">class&nbsp;</span><span style="color: #0000ff">=&nbsp;"org.wltea.analyzer.solr.IKTokenizerFactory"</span><span style="color: #ff0000">&nbsp;isMaxWordLength</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.SynonymFilterFactory"</span><span style="color: #ff0000">&nbsp;synonyms</span><span style="color: #0000ff">="synonyms.txt"</span><span style="color: #ff0000">&nbsp;ignoreCase</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;expand</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.StopFilterFactory"</span><span style="color: #ff0000">&nbsp;ignoreCase</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;words</span><span style="color: #0000ff">="stopwords.txt"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.WordDelimiterFilterFactory"</span><span style="color: #ff0000">&nbsp;generateWordParts</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;generateNumberParts</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;catenateWords</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;catenateNumbers</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;catenateAll</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;splitOnCaseChange</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.LowerCaseFilterFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.EnglishPorterFilterFactory"</span><span style="color: #ff0000">&nbsp;protected</span><span style="color: #0000ff">="protwords.txt"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="solr.RemoveDuplicatesTokenFilterFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fieldType</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span></div>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"></span></strong></p><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">添加一个索引字段field，并应用上面配置的fieldtype</span></span></span><br />
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="game_name"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;indexed</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;stored</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;required</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px">&nbsp;</p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">然后找到这一句：&lt;defaultSearchField&gt;text&lt;/defaultSearchField&gt;把它改成&lt;defaultSearchField&gt;game_name&lt;/defaultSearchField&gt;</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">在浏览器打开<a href="http://localhost:8080/solr/admin/analysis.jsp">http://localhost:8080/solr/admin/analysis.jsp</a>，就可以进行分词处理了。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">IKAnalyzer添加自定义分词词典：<span style="font-size: 13px">词典文件格式为无BOM的UTF-8编码的文本文件,文件扩展名不限，</span><span style="font-size: 13px">一次可以添加多个词库，每个词库以";"分开。把</span>IKAnalyzer 目录下的IKAnalyzer.cfg.xml和stopword.dic拷贝到$TOMCAT_HOME/webapps/solr/WEB_INF /classes目录下，可以自己新建一个mydic.dic文件，然后在IKAnalyzer.cfg.xml里进行配置。<br /></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">（2）<span style="color: #ff0000">安装mmseg4j</span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: 13px"><a style="border-bottom: #bbbbbb 1px dotted; color: #bb0000; text-decoration: none" class="ext-link" href="http://code.google.com/p/mmseg4j/downloads/list"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"><span style="padding-left: 12px; background-position: 50% 50%" class="icon"><span style="color: #bb0000">&nbsp;</span><span style="color: #000000">下载地址：</span></span><span style="color: #000000">http://code.google.com/p/mmseg4j/downloads/list</span></span></span></span></a></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small">在当前目录下新建mmseg4j目录，解压到该目录下：unzip mmseg4j-1.8.5.zip -d ./mmseg4j</span></span></p>
<p style="margin: 0px"><span style="font-size: x-small"><span style="font-size: small">把mmseg4j目录下的mmseg4j-all-1.8.5.jar文件拷贝到 $TOMCAT_HOME/webapps/solr/WEB-INF/lib/下</span></span></p>
<p style="margin: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small"><br /></span></span></span></p>
<p style="margin: 0px"><span style="font-size: x-small"><span style="font-size: small">配置schema.xml，编辑$TOMCAT_HOME/solr/conf/schema.xml，在文件中添加下面这个fieldtype</span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><br /></span></span></span></p>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">fieldtype&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="textComplex"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="solr.TextField"</span><span style="color: #ff0000">&nbsp;positionIncrementGap</span><span style="color: #0000ff">="100"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tokenizer&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"</span><span style="color: #ff0000">&nbsp;mode</span><span style="color: #0000ff">="complex"</span><span style="color: #ff0000">&nbsp;dicPath</span><span style="color: #0000ff">="/home/zhoujh/java/apache-tomcat7/solr/dict"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tokenizer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fieldtype</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fieldtype&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="textMaxWord"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="solr.TextField"</span><span style="color: #ff0000">&nbsp;positionIncrementGap</span><span style="color: #0000ff">="100"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tokenizer&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"</span><span style="color: #ff0000">&nbsp;mode</span><span style="color: #0000ff">="max-word"</span><span style="color: #ff0000">&nbsp;dicPath</span><span style="color: #0000ff">="/home/zhoujh/java/apache-tomcat7/solr/dict"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tokenizer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fieldtype</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fieldtype&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="textSimple"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="solr.TextField"</span><span style="color: #ff0000">&nbsp;positionIncrementGap</span><span style="color: #0000ff">="100"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tokenizer&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"</span><span style="color: #ff0000">&nbsp;mode</span><span style="color: #0000ff">="simple"</span><span style="color: #ff0000">&nbsp;dicPath</span><span style="color: #0000ff">="/home/zhoujh/java/apache-tomcat7/solr/dict"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tokenizer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">analyzer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fieldtype</span><span style="color: #0000ff">&gt;</span></div>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">注意：<span style="white-space: pre">dicPath的值改成你自己机器上相应的目录。</span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">然后修改之前添加的filed，让其使用mmseg4j分词器</span></span></span></p>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="game_name"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="textComplex"</span><span style="color: #ff0000">&nbsp;indexed</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;stored</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;required</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"><br /></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">配置mmseg4j分词词典：<span style="font-size: 13px">MMSEG4J的词库是可以动态加载的，</span><span style="font-size: 13px">词库的编码必须是UTF-8，</span><span>mmseg4j 默认从当前目录下的 data 目录读取上面的文件，当然也可以指定别的目录，比如我就放在自定义的dict目录下</span><span>。</span><span>自定义词库文件名必需是 "words" 为前缀和 ".dic" 为后缀。</span><span>如：/data/words-my.dic。</span></span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">这里直接把mmseg4j/data目录下的所有.dic文件拷贝到$TOMCAT_HOME/solr/dict目录下。共有：4个dic文件，chars.dic、units.dic、 words.dic、 words-my.dic。下面简单解释一下这几个文件的作用。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">1、chars.dic，是单个字，和对应的频率，一行一对，字在全面，频率在后面，中间用空格分开。这个文件的信息是 complex 模式要用到的。在最后一条过虑规则中使用了频率信息。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">2、units.dic，是单位的字，如：分、秒、年。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">3、words.dic，是核心的词库文件，一行一条，不需要其它任何数据（如词长）。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">4、words-my.dic，是自定义词库文件</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: small">在浏览器打开<a href="http://localhost:8080/solr/admin/analysis.jsp">http://localhost:8080/solr/admin/analysis.jsp</a>，就可以看到分词效果了。</span></span></span></p>
<p style="padding-bottom: 15px; margin: 0in; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small">现在，这两种分词方法都已配置好了，想用哪种就把查询的filed的type设置成哪种。</span></span></p>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"><br /></p>
<p style="padding-bottom: 0px; line-height: 1.5em; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; color: black; font-size: 16px; padding-top: 10px"></p><img src ="http://www.blogjava.net/conans/aggbug/379549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:38 <a href="http://www.blogjava.net/conans/articles/379549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solr 创建索引 From DataBase</title><link>http://www.blogjava.net/conans/articles/379547.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379547.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: The Data Import Handler FrameworkSolr includes a very popular contrib module for importing data known as the DataImportHandler (DIH in short). It's a data processing pipeline built specificallyfor S...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/379547.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/379547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:33 <a href="http://www.blogjava.net/conans/articles/379547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Apache Solr对数据库建立索引（包括处理CLOB、CLOB）</title><link>http://www.blogjava.net/conans/articles/379546.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379546.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下资料整理自网络，觉的有必要合并在一起，这样方便查看。主要分为两部分，第一部分是对《db-data-config.xml》的配置内容的讲解（属于高级内容），第二部分是DataImportHandler（属于基础）,第三部分是对db-data-config.xml的进阶（这个国内可能还没有人写过啊，我在google、baidu上都没有搜索到，最后可是拔代码，看solr的英文文档找的）第一部分是...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/379546.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/379546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:23 <a href="http://www.blogjava.net/conans/articles/379546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于solr schema.xml 和solrconfig.xml的解释</title><link>http://www.blogjava.net/conans/articles/379545.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379545.html</guid><description><![CDATA[<div id="blog_content" class="blog_content">
<p><strong><span style="font-size: medium">一、字段配置（schema）</span> </strong></p>
<p>&nbsp;</p>
<p>schema.xml位于solr/conf/目录下，类似于数据表配置文件，</p>
<p>定义了加入索引的数据的数据类型，主要包括type、fields和其他的一些缺省设置。</p>
<p>&nbsp;</p>
<p>1、先来看下type节点，这里面定义FieldType子节点，包括name,class,positionIncrementGap等一些参数。</p>
<ul><li>name：就是这个FieldType的名称。</li><li>class：指向org.apache.solr.analysis包里面对应的class名称，用来定义这个类型的行为。</li></ul>
<div>
<div>
<div><a title="view plain" href="http://blog.csdn.net/escaflone/article/details/5726320"></a></div></div>
<ol><li><span>&lt;</span> <span>schema</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"example"</span> <span>&nbsp;</span> <span>version</span> <span>=</span> <span>"1.2"</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span>&lt;</span> <span>types</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"string"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.StrField"</span> <span>&nbsp;</span> <span>sortMissingLast</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>omitNorms</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"boolean"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.BoolField"</span> <span>&nbsp;</span> <span>sortMissingLast</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>omitNorms</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldtype</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"binary"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.BinaryField"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"int"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.TrieIntField"</span> <span>&nbsp;</span> <span>precisionStep</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>omitNorms</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>positionIncrementGap</span> <span>=</span> <span>"0"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"float"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.TrieFloatField"</span> <span>&nbsp;</span> <span>precisionStep</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>omitNorms</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>positionIncrementGap</span> <span>=</span> <span>"0"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"long"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.TrieLongField"</span> <span>&nbsp;</span> <span>precisionStep</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>omitNorms</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>positionIncrementGap</span> <span>=</span> <span>"0"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"double"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.TrieDoubleField"</span> <span>&nbsp;</span> <span>precisionStep</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>omitNorms</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>positionIncrementGap</span> <span>=</span> <span>"0"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;...&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span>&lt;/</span> <span>types</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;...&nbsp;&nbsp;</span></li><li><span>&lt;/</span> <span>schema</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;</p>
<p>必要的时候fieldType还需要自己定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer，包括分词和过滤，如下：</p>
<div>
<div>
<div><a title="view plain" href="http://blog.csdn.net/escaflone/article/details/5726320">view plain</a> <a title="print" href="http://blog.csdn.net/escaflone/article/details/5726320">print</a> <a title="?" href="http://blog.csdn.net/escaflone/article/details/5726320">?</a> </div></div>
<ol><li><span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"text_ws"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.TextField"</span> <span>&nbsp;</span> <span>positionIncrementGap</span> <span>=</span> <span>"100"</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span>&lt;</span> <span>analyzer</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>tokenizer</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.WhitespaceTokenizerFactory"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;<span>&lt;/</span> <span>analyzer</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&lt;/</span> <span>fieldType</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>fieldType</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"text"</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.TextField"</span> <span>&nbsp;</span> <span>positionIncrementGap</span> <span>=</span> <span>"100"</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span>&lt;</span> <span>analyzer</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"index"</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--这个分词包是空格分词，在向索引库添加text类型的索引时，Solr会首先用空格进行分词&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后把分词结果依次使用指定的过滤器进行过滤，最后剩下的结果，才会加入到索引库中以备查询。&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意:Solr的analysis包并没有带支持中文的包，需要自己添加中文分词器，google下。&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--<span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>tokenizer</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.WhitespaceTokenizerFactory"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;in&nbsp;this&nbsp;example,&nbsp;we&nbsp;will&nbsp;only&nbsp;use&nbsp;synonyms&nbsp;at&nbsp;query&nbsp;time&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.SynonymFilterFactory"</span> <span>&nbsp;</span> <span>synonyms</span> <span>=</span> <span>"index_synonyms.txt"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>ignoreCase</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>expand</span> <span>=</span> <span>"false"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--<span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Case&nbsp;insensitive&nbsp;stop&nbsp;word&nbsp;removal.&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;<span>enablePositionIncrements</span> <span>=</span> <span>true</span> <span>&nbsp;in&nbsp;both&nbsp;the&nbsp;index&nbsp;and&nbsp;query&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analyzers&nbsp;to&nbsp;leave&nbsp;a&nbsp;'gap'&nbsp;for&nbsp;more&nbsp;accurate&nbsp;phrase&nbsp;queries.&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--<span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.StopFilterFactory"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>ignoreCase</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>words</span> <span>=</span> <span>"stopwords.txt"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>enablePositionIncrements</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.WordDelimiterFilterFactory"</span> <span>&nbsp;</span> <span>generateWordParts</span> <span>=</span> <span>"1"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>generateNumberParts</span> <span>=</span> <span>"1"</span> <span>&nbsp;</span> <span>catenateWords</span> <span>=</span> <span>"1"</span> <span>&nbsp;</span> <span>catenateNumbers</span> <span>=</span> <span>"1"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>catenateAll</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>splitOnCaseChange</span> <span>=</span> <span>"1"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.LowerCaseFilterFactory"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.SnowballPorterFilterFactory"</span> <span>&nbsp;</span> <span>language</span> <span>=</span> <span>"English"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>protected</span> <span>=</span> <span>"protwords.txt"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;/</span> <span>analyzer</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>analyzer</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"query"</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>tokenizer</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.WhitespaceTokenizerFactory"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.SynonymFilterFactory"</span> <span>&nbsp;</span> <span>synonyms</span> <span>=</span> <span>"synonyms.txt"</span> <span>&nbsp;</span> <span>ignoreCase</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>expand</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.StopFilterFactory"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>ignoreCase</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>words</span> <span>=</span> <span>"stopwords.txt"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>enablePositionIncrements</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.WordDelimiterFilterFactory"</span> <span>&nbsp;</span> <span>generateWordParts</span> <span>=</span> <span>"1"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>generateNumberParts</span> <span>=</span> <span>"1"</span> <span>&nbsp;</span> <span>catenateWords</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>catenateNumbers</span> <span>=</span> <span>"0"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>catenateAll</span> <span>=</span> <span>"0"</span> <span>&nbsp;</span> <span>splitOnCaseChange</span> <span>=</span> <span>"1"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.LowerCaseFilterFactory"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>filter</span> <span>&nbsp;</span> <span>class</span> <span>=</span> <span>"solr.SnowballPorterFilterFactory"</span> <span>&nbsp;</span> <span>language</span> <span>=</span> <span>"English"</span> <span>&nbsp;&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>protected</span> <span>=</span> <span>"protwords.txt"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;/</span> <span>analyzer</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&lt;/</span> <span>fieldType</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;</p>
<p>2、再来看下fields节点内定义具体的字段（类似数据库的字段），含有以下属性：</p>
<ul><li>name：字段名</li><li>type：之前定义过的各种FieldType</li><li>indexed：是否被索引</li><li>stored：是否被存储（如果不需要存储相应字段值，尽量设为false）</li><li>multiValued：是否有多个值（对可能存在多值的字段尽量设置为true，避免建索引时抛出错误）</li></ul>
<div>
<div>
<div><a title="view plain" href="http://blog.csdn.net/escaflone/article/details/5726320">view plain</a> <a title="print" href="http://blog.csdn.net/escaflone/article/details/5726320">print</a> <a title="?" href="http://blog.csdn.net/escaflone/article/details/5726320">?</a> </div></div>
<ol><li><span>&lt;</span> <span>fields</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"id"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"integer"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>required</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"name"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"text"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"summary"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"text"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"author"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"string"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"date"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"date"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"false"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"content"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"text"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"false"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"keywords"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"keyword_text"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"false"</span> <span>&nbsp;</span> <span>multiValued</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;!--拷贝字段--&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;</span> <span>field</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"all"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"text"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;</span> <span>stored</span> <span>=</span> <span>"false"</span> <span>&nbsp;</span> <span>multiValued</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </span></li><li><span>&lt;/</span> <span>fields</span> <span>&gt;</span> <span>&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;</p>
<p>3、建议建立一个拷贝字段，将所有的 全文本 字段复制到一个字段中，以便进行统一的检索：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 以下是拷贝设置：</p>
<div>
<div>
<div><a title="view plain" href="http://blog.csdn.net/escaflone/article/details/5726320">view plain</a> <a title="print" href="http://blog.csdn.net/escaflone/article/details/5726320">print</a> <a title="?" href="http://blog.csdn.net/escaflone/article/details/5726320">?</a> </div></div>
<ol><li><span>&lt;</span> <span>copyField</span> <span>&nbsp;</span> <span>source</span> <span>=</span> <span>"name"</span> <span>&nbsp;</span> <span>dest</span> <span>=</span> <span>"all"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>copyField</span> <span>&nbsp;</span> <span>source</span> <span>=</span> <span>"summary"</span> <span>&nbsp;</span> <span>dest</span> <span>=</span> <span>"all"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;</p>
<p>4、动态字段，没有具体名称的字段，用dynamicField字段</p>
<p>如：name为*_i，定义它的type为int，那么在使用这个字段的时候，任务以_i结果的字段都被认为符合这个定义。如name_i, school_i</p>
<div>
<div>
<div><a title="view plain" href="http://blog.csdn.net/escaflone/article/details/5726320">view plain</a> <a title="print" href="http://blog.csdn.net/escaflone/article/details/5726320">print</a> <a title="?" href="http://blog.csdn.net/escaflone/article/details/5726320">?</a> </div></div>
<ol><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_i"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"int"</span> <span>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_s"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"string"</span> <span>&nbsp;&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_l"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"long"</span> <span>&nbsp;&nbsp;&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_t"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"text"</span> <span>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_b"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"boolean"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_f"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"float"</span> <span>&nbsp;&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_d"</span> <span>&nbsp;&nbsp;</span> <span>type</span> <span>=</span> <span>"double"</span> <span>&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span></li><li><span>&lt;</span> <span>dynamicField</span> <span>&nbsp;</span> <span>name</span> <span>=</span> <span>"*_dt"</span> <span>&nbsp;</span> <span>type</span> <span>=</span> <span>"date"</span> <span>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span>indexed</span> <span>=</span> <span>"true"</span> <span>&nbsp;&nbsp;</span> <span>stored</span> <span>=</span> <span>"true"</span> <span>/&gt;</span> <span>&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: medium">schema.xml文档注释中的信息：</span> </strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1、为了改进性能，可以采取以下几种措施：</p>
<ul><li>将所有只用于搜索的，而不需要作为结果的field（特别是一些比较大的field）的stored设置为false</li><li>将不需要被用于搜索的，而只是作为结果返回的field的indexed设置为false</li><li>删除所有不必要的copyField声明</li><li>为了索引字段的最小化和搜索的效率，将所有的 text fields的index都设置成field，然后使用copyField将他们都复制到一个总的 text field上，然后对他进行搜索。</li><li>为了最大化搜索效率，使用java编写的客户端与solr交互（使用流通信）</li><li>在服务器端运行JVM（省去网络通信），使用尽可能高的Log输出等级，减少日志量。</li></ul>
<p>2、<span style="color: #0000ff">&lt;</span> <span style="color: #990000"><span>schema</span> <span>name</span> </span><span style="color: #0000ff">="</span> <strong>example</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">version</span> <span style="color: #0000ff">="</span> <strong>1.2</strong> <span style="color: #0000ff"><span>"</span> <span>&gt;</span> </span></p>
<ul><li>name：标识这个schema的名字</li><li>version：现在版本是1.2</li></ul>
<p>3、filedType</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">fieldType</span> <span style="color: #990000">name</span> <span style="color: #0000ff">="</span> <strong>string</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">class</span> <span style="color: #0000ff">="</span> <strong>solr.StrField</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">sortMissingLast</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">omitNorms</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<ul><li>name：标识而已。</li><li>class和其他属性决定了这个fieldType的实际行为。（class以solr开始的，都是在org.appache.solr.analysis包下）</li></ul>
<p>可选的属性：</p>
<ul><li>sortMissingLast和sortMissingFirst两个属性是用在可以内在使用String排序的类型上（包括：string,boolean,sint,slong,sfloat,sdouble,pdate）。</li><li>sortMissingLast="true"，没有该field的数据排在有该field的数据之后，而不管请求时的排序规则。</li><li>sortMissingFirst="true"，跟上面倒过来呗。</li><li>2个值默认是设置成false</li></ul>
<p>&nbsp;</p>
<p>StrField类型不被分析，而是被逐字地索引/存储。</p>
<p>StrField和TextField都有一个可选的属性&#8220;compressThreshold&#8221;，保证压缩到不小于一个大小（单位：char）</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000"><span>fieldType</span> <span>name</span> </span><span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">class</span> <span style="color: #0000ff">="</span> <strong>solr.TextField</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">positionIncrementGap</span> <span style="color: #0000ff">="</span> <strong>100</strong> <span style="color: #0000ff"><span>"</span> <span>&gt;</span> </span></p>
<p>&nbsp;</p>
<p>solr.TextField 允许用户通过分析器来定制索引和查询，分析器包括一个分词器（tokenizer）和多个过滤器（filter）</p>
<p>&nbsp;</p>
<ul><li>positionIncrementGap：可选属性，定义在同一个文档中此类型数据的空白间隔，避免短语匹配错误。</li></ul>
<p>name:&nbsp;&nbsp;&nbsp; 字段类型名&nbsp; <br />class:&nbsp;&nbsp;&nbsp; java类名&nbsp; <br />indexed:&nbsp;&nbsp;&nbsp; 缺省true。 说明这个数据应被搜索和排序，如果数据没有indexed，则stored应是true。&nbsp; <br />stored:&nbsp;&nbsp;&nbsp; 缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。&nbsp; <br />sortMissingLast:&nbsp;&nbsp;&nbsp; 指没有该指定字段数据的document排在有该指定字段数据的document的后面&nbsp; <br />sortMissingFirst:&nbsp;&nbsp;&nbsp; 指没有该指定字段数据的document排在有该指定字段数据的document的前面&nbsp; <br />omitNorms:&nbsp;&nbsp;&nbsp; 字段的长度不影响得分和在索引时不做boost时，设置它为true。一般文本字段不设置为true。&nbsp; <br />termVectors:&nbsp;&nbsp;&nbsp; 如果字段被用来做more like this 和highlight的特性时应设置为true。&nbsp; <br />compressed:&nbsp;&nbsp;&nbsp; 字段是压缩的。这可能导致索引和搜索变慢，但会减少存储空间，只有StrField和TextField是可以压缩，这通常适合字段的长度超过200个字符。&nbsp; <br />multiValued:&nbsp;&nbsp;&nbsp; 字段多于一个值的时候，可设置为true。&nbsp; <br />positionIncrementGap:&nbsp;&nbsp;&nbsp; 和multiValued<br />一起使用，设置多个值之间的虚拟空白的数量 <br /></p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">tokenizer</span> <span style="color: #990000">class</span> <span style="color: #0000ff">="</span> <strong>solr.WhitespaceTokenizerFactory</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p>空格分词，精确匹配。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">filter</span> <span style="color: #990000">class</span> <span style="color: #0000ff">="</span> <strong>solr.WordDelimiterFilterFactory</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">generateWordParts</span> <span style="color: #0000ff">="</span> <strong>1</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">generateNumberParts</span> <span style="color: #0000ff">="</span> <strong>1</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">catenateWords</span> <span style="color: #0000ff">="</span> <strong>1</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">catenateNumbers</span> <span style="color: #0000ff">="</span> <strong>1</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">catenateAll</span> <span style="color: #0000ff">="</span> <strong>0</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">splitOnCaseChange</span> <span style="color: #0000ff">="</span> <strong>1</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p>在分词和匹配时，考虑 "-"连字符，字母数字的界限，非字母数字字符，这样 "wifi"或"wi fi"都能匹配"Wi-Fi"。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">filter</span> <span style="color: #990000">class</span> <span style="color: #0000ff">="</span> <strong>solr.SynonymFilterFactory</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">synonyms</span> <span style="color: #0000ff">="</span> <strong>synonyms.txt</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">ignoreCase</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">expand</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p><span style="color: #000000">同义词&nbsp;</span> </p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">filter</span> <span style="color: #990000">class</span> <span style="color: #0000ff">="</span> <strong>solr.StopFilterFactory</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">ignoreCase</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">words</span> <span style="color: #0000ff">="</span> <strong>stopwords.txt</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">enablePositionIncrements</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p>在禁用字（stopword）删除后，在短语间增加间隔</p>
<p>stopword：即在建立索引过程中（建立索引和搜索）被忽略的词，比如is this等常用词。在conf/stopwords.txt维护。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4、fields</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">field</span> <span style="color: #990000">name</span> <span style="color: #0000ff">="</span> <strong>id</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">type</span> <span style="color: #0000ff">="</span> <strong>string</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">indexed</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">stored</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">required</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<ul><li>name：标识而已。</li><li>type：先前定义的类型。</li><li>indexed：是否被用来建立索引（关系到搜索和排序）</li><li>stored：是否储存</li><li>compressed：[false]，是否使用gzip压缩（只有TextField和StrField可以压缩）</li><li>mutiValued：是否包含多个值</li><li>omitNorms：是否忽略掉Norm，可以节省内存空间，只有全文本field和need an index-time boost的field需要norm。（具体没看懂，注释里有矛盾）</li><li>termVectors：[false]，当设置true，会存储 term vector。当使用MoreLikeThis，用来作为相似词的field应该存储起来。</li><li>termPositions：存储 term vector中的地址信息，会消耗存储开销。</li><li>termOffsets：存储 term vector 的偏移量，会消耗存储开销。</li><li>default：如果没有属性需要修改，就可以用这个标识下。</li></ul>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">field</span> <span style="color: #990000">name</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">type</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">indexed</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">stored</span> <span style="color: #0000ff">="</span> <strong>false</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">multiValued</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p>包罗万象（有点夸张）的field，包含所有可搜索的text fields，通过copyField实现。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">copyField</span> <span style="color: #990000">source</span> <span style="color: #0000ff">="</span> <strong>cat</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">dest</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<div>
<div><span><strong><span style="color: #ff0000">&nbsp;</span> </strong></span><span style="color: #0000ff">&lt;</span> <span style="color: #990000">copyField</span> <span style="color: #990000">source</span> <span style="color: #0000ff">="</span> <strong>name</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">dest</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></div></div>
<div>
<div><span><strong><span style="color: #ff0000">&nbsp;</span> </strong></span><span style="color: #0000ff">&lt;</span> <span style="color: #990000">copyField</span> <span style="color: #990000">source</span> <span style="color: #0000ff">="</span> <strong>manu</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">dest</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></div></div>
<div>
<div><span><strong><span style="color: #ff0000">&nbsp;</span> </strong></span><span style="color: #0000ff">&lt;</span> <span style="color: #990000">copyField</span> <span style="color: #990000">source</span> <span style="color: #0000ff">="</span> <strong>features</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">dest</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></div></div>
<div>
<div><span><strong><span style="color: #ff0000">&nbsp;</span> </strong></span><span style="color: #0000ff">&lt;</span> <span style="color: #990000">copyField</span> <span style="color: #990000">source</span> <span style="color: #0000ff">="</span> <strong>includes</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">dest</span> <span style="color: #0000ff">="</span> <strong>text</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></div></div>
<p>在添加索引时，将所有被拷贝field（如cat）中的数据拷贝到text field中</p>
<p>作用：</p>
<ul><li>将多个field的数据放在一起同时搜索，提供速度</li><li>将一个field的数据拷贝到另一个，可以用2种不同的方式来建立索引。</li></ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">dynamicField</span> <span style="color: #990000">name</span> <span style="color: #0000ff">="</span> <strong>*_i</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">type</span> <span style="color: #0000ff">="</span> <strong>int</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">indexed</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">stored</span> <span style="color: #0000ff">="</span> <strong>true</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p>&nbsp;</p>
<p>如果一个field的名字没有匹配到，那么就会用动态field试图匹配定义的各种模式。</p>
<ul><li>"*"只能出现在模式的最前和最后</li><li>较长的模式会被先去做匹配</li><li>如果2个模式同时匹配上，最先定义的优先</li></ul>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">dynamicField</span> <span style="color: #990000">name</span> <span style="color: #0000ff">="</span> <strong>*</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">type</span> <span style="color: #0000ff">="</span> <strong>ignored</strong> <span style="color: #0000ff">"</span> <span style="color: #990000">multiValued<span style="color: #0000ff">="</span> <span style="color: #000000"><strong>true</strong> </span><span style="color: #0000ff">"</span> </span><span style="color: #0000ff"><span>/&gt;</span> </span></p>
<p><span style="color: #0000ff"><span>如果通过上面的匹配都没找到，可以定义这个，然后定义个type，当String处理。（一般不会发生）</span> </span></p>
<p><span style="color: #0000ff"><span>但若不定义，找不到匹配会报错。</span> </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5、其他一些标签</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">uniqueKey</span> <span style="color: #0000ff">&gt;</span> <span><strong>id</strong> </span><span style="color: #0000ff">&lt;/</span> <span style="color: #990000">uniqueKey</span> <span style="color: #0000ff">&gt;</span> </p>
<p>文档的唯一标识，&nbsp;必须填写这个field（除非该field被标记required="false"），否则solr建立索引报错。</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">defaultSearchField</span> <span style="color: #0000ff">&gt;</span> <span><strong>text</strong> </span><span style="color: #0000ff">&lt;/</span> <span style="color: #990000">defaultSearchField</span> <span style="color: #0000ff">&gt;</span> </p>
<p>如果搜索参数中没有指定具体的field，那么这是默认的域。</p>
<p><span style="color: #0000ff">&lt;</span> <span style="color: #990000">solrQueryParser</span> <span style="color: #990000">defaultOperator</span> <span style="color: #0000ff">="</span> <strong>OR</strong> <span style="color: #0000ff"><span>"</span> <span>/&gt;</span> </span></p>
<p>配置搜索参数短语间的逻辑，可以是"AND|OR"。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: medium">二、solrconfig.xml</span> </strong></p>
<p>&nbsp;</p>
<p>1、索引配置</p>
<p>&nbsp;</p>
<p>mainIndex 标记段定义了控制Solr索引处理的一些因素.</p>
<ul><li>
<p>useCompoundFile：通过将很多 Lucene 内部文件整合到单一一个文件来减少使用中的文件的数量。这可有助于减少 Solr 使用的文件句柄数目，代价是降低了性能。除非是应用程序用完了文件句柄，否则 <code>false</code> 的默认值应该就已经足够。</p></li><li>useCompoundFile：通过将很多Lucene内部文件整合到一个文件，来减少使用中的文件的数量。这可有助于减少Solr使用的文件句柄的数目，代价是降低了性能。除非是应用程序用完了文件句柄，否则false的默认值应该就已经足够了。</li><li>mergeFacor：决定Lucene段被合并的频率。较小的值（最小为2）使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。（典型的时间与空间 的平衡配置）</li><li>maxBufferedDocs：在合并内存中文档和创建新段之前，定义所需索引的最小文档数。段是用来存储索引信息的Lucene文件。较大的值可使索引时间变快但会牺牲较多内存。</li><li>maxMergeDocs：控制可由Solr合并的 Document 的最大数。较小的值（&lt;10,000）最适合于具有大量更新的应用程序。</li><li>maxFieldLength：对于给定的Document，控制可添加到Field的最大条目数，进而阶段该文档。如果文档可能会很大，就需要增加这个数值。然后，若将这个值设置得过高会导致内存不足错误。</li><li>unlockOnStartup：告知Solr忽略在多线程环境中用来保护索引的锁定机制。在某些情况下，索引可能会由于不正确的关机或其他错误而一直处于锁定，这就妨碍了添加和更新。将其设置为true可以禁用启动索引，进而允许进行添加和更新。（锁机制）</li></ul>
<p>&nbsp;</p>
<p>&nbsp;2、查询处理配置</p>
<p>&nbsp;</p>
<p>query标记段中以下一些与缓存无关的特性：</p>
<ul><li>maxBooleanClauses：定义可组合在一起形成以个查询的字句数量的上限。正常情况1024已经足够。如果应用程序大量使用了通配符或范围查询，增加这个限制将能避免当值超出时，抛出TooMangClausesException。</li><li>enableLazyFieldLoading：如果应用程序只会检索Document上少数几个Field，那么可以将这个属性设置为 true。懒散加载的一个常见场景大都发生在应用程序返回一些列搜索结果的时候，用户常常会单击其中的一个来查看存储在此索引中的原始文档。初始的现实常常只需要现实很短的一段信息。若是检索大型的Document，除非必需，否则就应该避免加载整个文档。</li></ul>
<p>&nbsp;</p>
<p>query部分负责定义与在Solr中发生的时间相关的几个选项：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>概念：Solr（实际上是Lucene）使用称为Searcher的Java类来处理Query实例。Searcher将索引内容相关的数据加载到内存中。根据索引、CPU已经可用内存的大小，这个过程可能需要较长的一段时间。要改进这一设计和显著提高性能，Solr引入了一张&#8220;温暖&#8221;策略，即把这些新的Searcher联机以便为现场用户提供查询服务之前，先对它们进行&#8220;热身&#8221;。</p>
<ul><li>newSearcher和firstSearcher事件，可以使用这些事件来制定实例化新Searcher或第一个Searcher时，应该执行哪些查询。如果应用程序期望请求某些特定的查询，那么在创建新Searcher或第一个Searcher时就应该反注释这些部分并执行适当的查询。</li></ul>
<p>&nbsp;</p>
<p>query中的智能缓存：</p>
<p>&nbsp;</p>
<ul><li>filterCache：通过存储一个匹配给定查询的文档 id 的无序集，过滤器让 Solr 能够有效提高查询的性能。缓存这些过滤器意味着对Solr的重复调用可以导致结果集的快速查找。更常见的场景是缓存一个过滤器，然后再发起后续的精炼查询，这种查询能使用过滤器来限制要搜索的文档数。</li><li>queryResultCache：为查询、排序条件和所请求文档的数量缓存文档 id 的有序集合。</li><li>documentCache：缓存Lucene Document，使用内部Lucene文档id（以便不与Solr唯一id相混淆）。由于Lucene的内部Document id 可以因索引操作而更改，这种缓存不能自热。</li><li>Named caches：命名缓存是用户定义的缓存，可被 Solr定制插件 所使用。</li></ul>
<p>其中filterCache、queryResultCache、Named caches（如果实现了org.apache.solr.search.CacheRegenerator）可以自热。</p>
<p>每个缓存声明都接受最多四个属性：</p>
<ul><li>class：是缓存实现的Java名</li><li>size：是最大的条目数</li><li>initialSize：是缓存的初始大小</li><li>autoWarmCount：是取自旧缓存以预热新缓存的条目数。如果条目很多，就意味着缓存的hit会更多，只不过需要花更长的预热时间。</li></ul>
<p>对于所有缓存模式而言，在设置缓存参数时，都有必要在内存、cpu和磁盘访问之间进行均衡。统计信息管理页（管理员界面的Statistics）对于分析缓存的 hit-to-miss 比例以及微调缓存大小的统计数据都非常有用。而且，并非所有应用程序都会从缓存受益。实际上，一些应用程序反而会由于需要将某个永远也用不到的条目存储在缓存中这一额外步骤而受到影响。</p></div><img src ="http://www.blogjava.net/conans/aggbug/379545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:18 <a href="http://www.blogjava.net/conans/articles/379545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataImportHandler--remove data from index</title><link>http://www.blogjava.net/conans/articles/379544.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379544.html</guid><description><![CDATA[<p>Deleting data from an index using DIH incremental indexing, on Solr wiki, is residually treated as something that works similarly to update the records. Similarly, in a previous article, I used this shortcut, the more that I have given an example of indexing wikipedia data that does not need to delete data.</p>
<p>Having at hand a sample data of the albums and performers, I decided to show my way of dealing with such cases. For simplicity and clarity, I assume that after the first import, the data can only decrease.</p>
<p><span id="more-711"></span></p>
<h2>Test data</h2>
<p>My test data are located in the PostgreSQL database table defined as follows:</p><pre>Table "public.albums"
Column |  Type   |                      Modifiers
--------+---------+-----------------------------------------------------
id     | integer | not null default nextval('albums_id_seq'::regclass)
name   | text    | not null
author | text    | not null
Indexes:
"albums_pk" PRIMARY KEY, btree (id)</pre>
<p>The table has 825,661 records.</p>
<h2>Test installation</h2>
<p>For testing purposes I used the Solr instance having the following characteristics:</p>
<p>Definition at schema.xml:</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">fields</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="string"</span><span style="color: #ff0000">&nbsp;indexed</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;stored</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;required</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="album"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;indexed</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;stored</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;multiValued</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="author"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;indexed</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;stored</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;multiValued</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fields</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">uniqueKey</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">id</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">uniqueKey</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">defaultSearchField</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">album</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">defaultSearchField</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>Definition of DIH in solrconfig.xm
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">requestHandler&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="/dataimport"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.solr.handler.dataimport.DataImportHandler"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">lst&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaults"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">str&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="config"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">db-data-config.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">str</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">lst</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">requestHandler</span><span style="color: #0000ff">&gt;</span></div><br />And the file DIH db-data-config.
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">dataConfig</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">dataSource&nbsp;</span><span style="color: #ff0000">driver</span><span style="color: #0000ff">="org.postgresql.Driver"</span><span style="color: #ff0000">&nbsp;url</span><span style="color: #0000ff">="jdbc:postgresql://localhost:5432/shardtest"</span><span style="color: #ff0000">&nbsp;user</span><span style="color: #0000ff">="solr"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="secret"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">document</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">entity&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="album"</span><span style="color: #ff0000">&nbsp;query</span><span style="color: #0000ff">="SELECT&nbsp;*&nbsp;from&nbsp;albums"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="album"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="author"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="author"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">entity</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">document</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dataConfig</span><span style="color: #0000ff">&gt;</span></div><br /><br />
<h2>Deleting Data</h2>
<p>Looking at the table shows that when we remove the record, he is deleted without leaving a trace, and the only way to update our index would be to compare the documents identifiers in the index to the identifiers in the database and deleting those that no longer exist in the database. Slow and cumbersome. Another way is adding a column <em>deleted_at</em>: instead of physically deleting the record, only add <a title="information" href="http://solr.pl/en/informations/">information</a> to this column. DIH can then retrieve all records from the set date later than the last crawl. The disadvantage of this solution may be necessary to modify the application to take such information into consideration.</p>
<p>I apply a different solution, transparent to applications. Let&#8217;s create a new table:</p>
<div id="highlighter_497115" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="keyword">CREATE</code> <code class="keyword">TABLE</code> <code class="plain">deletes</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">(</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="plain">id serial </code><code class="color1">NOT</code> <code class="color1">NULL</code><code class="plain">,</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="plain">deleted_id </code><code class="keyword">bigint</code><code class="plain">,</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="plain">deleted_at </code><code class="keyword">timestamp</code> <code class="plain">without </code><code class="keyword">time</code> <code class="plain">zone </code><code class="color1">NOT</code> <code class="color1">NULL</code><code class="plain">,</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="keyword">CONSTRAINT</code> <code class="plain">deletes_pk </code><code class="keyword">PRIMARY</code> <code class="keyword">KEY</code> <code class="plain">(id)</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>7</code></td>
<td class="content"><code class="plain">);</code></td></tr></tbody></table></div></div></div>
<p>This table will automagically add an identifier of those items that were removed from the table <em>albums </em>and information when they were removed.</p>
<p>Now we add the function:</p>
<div id="highlighter_389800" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="keyword">CREATE</code> <code class="color1">OR</code> <code class="color2">REPLACE</code> <code class="keyword">FUNCTION</code> <code class="plain">insert_after_delete()</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="keyword">RETURNS</code> <code class="keyword">trigger</code> <code class="keyword">AS</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="plain">$BODY$</code><code class="keyword">BEGIN</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="plain">IF tg_op = </code><code class="string">'DELETE'</code> <code class="keyword">THEN</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="keyword">INSERT</code> <code class="keyword">INTO</code> <code class="plain">deletes(deleted_id, deleted_at)</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="keyword">VALUES</code> <code class="plain">(old.id, now());</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="keyword">RETURN</code> <code class="plain">old;</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="keyword">END</code> <code class="plain">IF;</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="keyword">END</code><code class="plain">$BODY$</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="plain">LANGUAGE plpgsql VOLATILE;</code></td></tr></tbody></table></div></div></div>
<p>and a trigger:</p>
<div id="highlighter_512012" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="keyword">CREATE</code> <code class="keyword">TRIGGER</code> <code class="plain">deleted_trg</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">BEFORE </code><code class="keyword">DELETE</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="keyword">ON</code> <code class="plain">albums</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="keyword">FOR</code> <code class="plain">EACH ROW</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="keyword">EXECUTE</code> <code class="keyword">PROCEDURE</code> <code class="plain">insert_after_delete();</code></td></tr></tbody></table></div></div></div>
<h2>How it works</h2>
<p>Each entry deleted from the <em>albums </em>table should result in addition to the table <em>deletes</em>. Let&#8217;s check it out. Remove a few records:</p>
<div id="highlighter_605248" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">=&gt; </code><code class="keyword">DELETE</code> <code class="keyword">FROM</code> <code class="plain">albums </code><code class="keyword">where</code> <code class="plain">id &lt; 37;</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="keyword">DELETE</code> <code class="plain">2</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="plain">=&gt; </code><code class="keyword">SELECT</code> <code class="plain">* </code><code class="keyword">from</code> <code class="plain">deletes;</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="plain">id | deleted_id |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleted_at</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="comments">----+------------+----------------------------</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="plain">26 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35 | 2010-12-23 13:53:18.034612</code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>7</code></td>
<td class="content"><code class="plain">27 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36 | 2010-12-23 13:53:18.034612</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>8</code></td>
<td class="content"><code class="plain">(2 </code><code class="keyword">rows</code><code class="plain">)</code></td></tr></tbody></table></div></div></div>
<p>So the database part works.</p>
<p>We fill up the DIH configuration file so that the <em>entity </em>has been defined as follows:</p>
<div id="highlighter_108857" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">&lt;</code><code class="keyword">entity</code> <code class="color1">name</code><code class="plain">=</code><code class="string">"album"</code> <code class="color1">query</code><code class="plain">=</code><code class="string">"SELECT * from albums"</code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;</code><code class="plain">deletedPkQuery="SELECT deleted_id as id FROM deletes WHERE deleted_at &gt; '${dataimporter.last_index_time}'"&gt;</code></td></tr></tbody></table></div></div></div>
<p>This allows the import DIH incremental import to use the <em>deletedPkQuery </em>attribute to get the identifiers of the documents which should be removed.</p>
<p>A clever reader will probably begin to wonder, are you sure we need the column with the date of deletion. We could delete all records that are found in the table <em>deletes </em>and then delete the contents of this table. Theoretically this is true, but in the event of a problem with the Solr indexing server we can easily replace it with another &#8211; the degree of synchronization with the database is not very important &#8211; just the next incremental imports will sync with the database. If we would delete the contents of the <em>deletes </em>table such possibility does not exist.</p>
<p>We can now do the incremental import by calling the following address:&nbsp; <em>/solr/dataimport?command=delta-import</em><br />In the logs you should see a line similar to this:<br /><em>INFO: {delete=[35, 36],optimize=} 0 2</em><br />Which means that DIH properly removed from the index the documents, which were previously removed from the database.</p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/conans/aggbug/379544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:11 <a href="http://www.blogjava.net/conans/articles/379544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solr 使用 Log4j</title><link>http://www.blogjava.net/conans/articles/379541.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 30 May 2012 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/379541.html</guid><description><![CDATA[<h2>
<p>大家知道在解压开solr的web程序（apache-solr-3.2.0.war）时，在其WEB-INF/lib目录下有slf4j- api-1.5.5.jar，slf4j-jdk14-1.5.5.jar这两个jar包，故可知其默认使用的是jdk的日志数据，其日志都是输入到 tomcat的logs中；再看其是结合slf4j进行jdk的日志数据；slf4j并不是一种具体的日志系统，而是一个用户日志系统的facade，允许在部署最终应用时方便的变更其日志系统。故solr使用log4j也是ok的，即采用log4j替换jdk的日志输入；做法如下：<br />1. &nbsp;将solr/WINF-WEB/lib中的slf4j-api-1.5.5.jar，slf4j-jdk14-1.5.5.jar删除，新加入 log4j-1.2.15.jar &nbsp;slf4j-api-1.5.0.jar &nbsp;slf4j-log4j12-1.5.0.jar或是其对应的jar包；<br />2.在solr/WEB-INF/下创建classes目录，因为默认的包中没有该目录，其都是使用jsp操作；<br />3. 将写好的log4j.properties放到solr/WEB-INF/classes中, 其内容如下，</p>
<p>log4j.rootLogger=INFO<br />log4j.logger.org.apache.solr=INFO,ROLLING_FILE</p>
<p>log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.ROLLING_FILE.Append=false<br />log4j.appender.ROLLING_FILE.File=/var/log/solr.log<br />log4j.appender.ROLLING_FILE.MaxBackupIndex=50<br />log4j.appender.ROLLING_FILE.MaxFileSize=200MB<br />log4j.appender.LOGFILE.Threshold=INFO<br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%c]\:%L Line &#8211; %m%n</p>
<p>4.重启tomcat即可<br />PS：如果是采用JNDI部署，最好将以上的重新打包war，在替换旧的</p></h2> <img src ="http://www.blogjava.net/conans/aggbug/379541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2012-05-30 14:01 <a href="http://www.blogjava.net/conans/articles/379541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hot Spot JVM5中的GC调优</title><link>http://www.blogjava.net/conans/articles/365427.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 02 Dec 2011 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/365427.html</guid><description><![CDATA[<strong>引言<br />
</strong>有JAVA开发经验的朋友们一定碰到过下面的这种情况,那就是自己所开发的应用运行了一段时间后其性能或者响应速度会有明显的降低.这是由多方面的原因造成的即有程序本身的优化问题,也有运行环境问题.此运行环境即包括硬件环境也包括软件环境.大多数人第一个能想到的解决方法是提升硬件的配置而忽略了程序本身的运行环境JVM也提供了比较多的调优选项.本文将重点描述利用JVM的一些选项对GC进行调优.
<h2></h2>
<p><strong>约定:</strong><br />
1.读者应具备一定JAVA的知识.</p>
<p>2.本文中的JVM选项均以SUN公司发布的HotSpot JVM 5为准（不过大多数的选项在JVM1.3,JVM1.4中也是可用的）.</p>
<p>3.以JAVA_HOME下demo/jfc/SwingSet2/SwingSet2.jar为例进行说明.</p>
<p>4.阅读本文需要一些关于GC的知识，可以到附录A中了解这些知识。</p>
<p><strong>关键字:</strong><br />
JVM(java虚拟机),调优,GC(垃圾回收)</p>
<p><strong>JVM GC调优</strong><br />
为了能够将JVM GC的调优能够使用在具体的实践当中,下面将利用若干个例子来说明GC的调优.<br />
<strong>例1：Heap size 设置</strong><br />
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值，其初始空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。<br />
当在JAVA_HOME下demo/jfc/SwingSet2/目录下执行下面的命令。<br />
java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar<br />
系统输出为：<br />
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space<br />
Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space<br />
Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space<br />
Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space<br />
除了这些异常信息外，还会发现程序的响应速度变慢了。这说明Heap size 设置偏小，GC占用了更多的时间，而应用分配到的执行时间较少。<br />
<font color="#ff0000">提示：在JVM中如果98％的时间是用于GC且可用的Heap size 不足2％的时候将抛出此异常信息。<br />
</font>将上面的命令换成以下命令执行则应用能够正常使用，且未抛出任何异常。<br />
java -jar -Xmn4m -Xms16m -Xmx32m SwingSet2.jar<br />
<font color="#ff0000">提示：Heap Size 最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。</font></p>
<p><strong>例2：Young Generation（-Xmn）的设置</strong><br />
在本例中看一下Young Generation的设置不同将有什么现象发生。<br />
假设将Young generation 的大小设置为4M ，即执行java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar，屏幕输出如下（节选）<br />
[GC [DefNew: 3968K-&gt;64K(4032K), 0.0923407 secs] 3968K-&gt;2025K(32704K), 0.0931870 secs]<br />
[GC [DefNew: 4021K-&gt;64K(4032K), 0.0356847 secs] 5983K-&gt;2347K(32704K), 0.0365441 secs]<br />
[GC [DefNew: 3995K-&gt;39K(4032K), 0.0090603 secs] 6279K-&gt;2372K(32704K), 0.0093377 secs]<br />
[GC [DefNew: 3992K-&gt;23K(4032K), 0.0057540 secs] 6325K-&gt;2356K(32704K), 0.0060290 secs]<br />
[GC [DefNew: 3984K-&gt;27K(4032K), 0.0013058 secs] 6317K-&gt;2360K(32704K), 0.0015888 secs]<br />
[GC [DefNew: 3981K-&gt;59K(4032K), 0.0023307 secs] 6315K-&gt;2422K(32704K), 0.0026091 secs]<br />
将程序体制并将Young Generation的大小设置为8M，即执行java -jar -verbose:gc -Xmn8m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar，屏幕输出如下（节选）<br />
[GC [DefNew: 7808K-&gt;192K(8000K), 0.1016784 secs] 7808K-&gt;2357K(32576K), 0.1022834 secs]<br />
[GC [DefNew: 8000K-&gt;70K(8000K), 0.0149659 secs] 10165K-&gt;2413K(32576K), 0.0152557 secs]<br />
[GC [DefNew: 7853K-&gt;59K(8000K), 0.0069122 secs] 10196K-&gt;2403K(32576K), 0.0071843 secs]<br />
[GC [DefNew: 7867K-&gt;171K(8000K), 0.0075745 secs] 10211K-&gt;2681K(32576K), 0.0078376 secs]<br />
[GC [DefNew: 7970K-&gt;192K(8000K), 0.0201353 secs] 10480K-&gt;2923K(32576K), 0.0206867 secs]<br />
[GC [DefNew: 7979K-&gt;30K(8000K), 0.1787079 secs] 10735K-&gt;4824K(32576K), 0.1790065 secs]<br />
那么根据GC输出的信息（这里取第一行）做一下Minor收集的比较。可以看出两次的Minor收集分别在Young generation中找回3904K（3968K-&gt;64K）和7616K(7808K-&gt;192K)而对于整个jvm则找回1943K（3968K-&gt;2025）和5451K（7808K-&gt;2357K）。第一种情况下Minor收集了大约50％（1943/3904）的对象，而另外的50％的对象则被移到了tenured generation。在第二中情况下Minor收集了大约72％的对象，只有不到30％的对象被移到了Tenured Generation.这个例子说明此应用在的Young generation 设置为4m时显的偏小。<br />
<font color="#ff0000">提示：一般的Young Generation的大小是整个Heap size的1/4。Young generation的minor收集率应一般在70％以上。当然在实际的应用中需要根据具体情况进行调整。</font></p>
<p><strong>例3：Young Generation对应用响应的影响</strong><br />
还是使用-Xmn4m 和-Xmn8m进行比较，先执行下面的命令<br />
</p>
<p>java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime SwingSet2.jar<br />
屏幕输出如下（节选）<br />
Application time: 0.5114944 seconds<br />
[GC [DefNew: 3968K-&gt;64K(4032K), 0.0823952 secs] 3968K-&gt;2023K(32704K), 0.0827626 secs]<br />
Total time for which application threads were stopped: 0.0839428 seconds<br />
Application time: 0.9871271 seconds<br />
[GC [DefNew: 4020K-&gt;64K(4032K), 0.0412448 secs] 5979K-&gt;2374K(32704K), 0.0415248 secs]<br />
Total time for which application threads were stopped: 0.0464380 seconds<br />
Young Generation 的Minor收集占用的时间可以计算如下：应用线程被中断的总时常/（应用执行总时?L+应用线程被中断的总时常），那么在本例中垃圾收集占用的时?L约为系统的5％~14％。那么当垃圾收集占用的时间的比例越大的时候，系统的响应将越慢。<br />
<font color="#ff0000">提示：对于互联网应用系统的响应稍微慢一些，用户是可以接受的，但是对于GUI类型的应用响应速度慢将会给用户带来非常不好的体验。</font></p>
<p><strong>例4：如何决定Tenured Generation 的大小</strong><br />
分别以-Xmn8m -Xmx32m和-Xmn8m -Xmx64m进行对比，先执行<br />
java -verbose:gc -Xmn8m -Xmx32m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java类，命令行将提示（只提取了Major收集）<br />
</p>
<p>111.042: [GC 111.042: [DefNew: 8128K-&gt;8128K(8128K), 0.0000505 secs]111.042: [Tenured: 18154K-&gt;2311K(24576K), 0.1290354 secs] 26282K-&gt;2311K(32704K), 0.1293306 secs]<br />
122.463: [GC 122.463: [DefNew: 8128K-&gt;8128K(8128K), 0.0000560 secs]122.463: [Tenured: 18630K-&gt;2366K(24576K), 0.1322560 secs] 26758K-&gt;2366K(32704K), 0.1325284 secs]<br />
133.896: [GC 133.897: [DefNew: 8128K-&gt;8128K(8128K), 0.0000443 secs]133.897: [Tenured: 18240K-&gt;2573K(24576K), 0.1340199 secs] 26368K-&gt;2573K(32704K), 0.1343218 secs]<br />
144.112: [GC 144.112: [DefNew: 8128K-&gt;8128K(8128K), 0.0000544 secs]144.112: [Tenured: 16564K-&gt;2304K(24576K), 0.1246831 secs] 24692K-&gt;2304K(32704K), 0.1249602 secs]<br />
再执行java -verbose:gc -Xmn8m -Xmx64m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java类，命令行将提示（只提取了Major收集）<br />
90.597: [GC 90.597: [DefNew: 8128K-&gt;8128K(8128K), 0.0000542 secs]90.597: [Tenured: 49841K-&gt;5141K(57344K), 0.2129882 secs] 57969K-&gt;5141K(65472K), 0.2133274 secs]<br />
120.899: [GC 120.899: [DefNew: 8128K-&gt;8128K(8128K), 0.0000550 secs]120.899: [Tenured: 50384K-&gt;2430K(57344K), 0.2216590 secs] 58512K-&gt;2430K(65472K), 0.2219384 secs]<br />
153.968: [GC 153.968: [DefNew: 8128K-&gt;8128K(8128K), 0.0000511 secs]153.968: [Tenured: 51164K-&gt;2309K(57344K), 0.2193906 secs] 59292K-&gt;2309K(65472K), 0.2196372 secs]<br />
可以看出在Heap size 为32m的时候系统等候时间约为0.13秒左右，而设置为64m的时候等候时间则增大到0.22秒左右了。但是在32m的时候系统的Major收集间隔为10秒左右，而Heap size 增加到64m的时候为30秒。那么应用在运行的时候是选择32m还是64m呢？如果应用是web类型（即要求有大的吞吐量）的应用则使用64m（即heapsize大一些）的比较好。对于要求实时响应要求较高的场合（例如GUI型的应用）则使用32m比较好一些。&nbsp;<br />
<font color="#ff0000">注意：<br />
1。因为在JVM5运行时已经对Heap-size进行了优化，所以在能确定java应用运行时不会超过默认的Heap size的情况下建议不要对这些值进行修改。<br />
2。Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示&#8220;Error occurred during initialization of VM Could not reserve enough space for object heap&#8221;。</font></p>
<p><strong>例5:如何缩短minor收集的时间</strong><br />
下面比较一下采用-XX:+UseParNewGC选项和不采用它的时候的minor收集将有什么不同。先执行<br />
java -jar -server -verbose:gc -Xmn8m -Xms32m -Xmx32m SwingSet2.jar&nbsp;<br />
系统将输出如下信息（片段〕<br />
[GC 7807K-&gt;2641K(32576K), 0.0676654 secs]<br />
[GC 10436K-&gt;3108K(32576K), 0.0245328 secs]<br />
[GC 10913K-&gt;3176K(32576K), 0.0072865 secs]<br />
[GC 10905K-&gt;4097K(32576K), 0.0223928 secs]<br />
之后再执行 java -jar -server -verbose:gc -XX:+UseParNewGC -Xmn8m -Xms32m -Xmx32m SwingSet2.jar<br />
系统将输出如下信息（片段〕<br />
[ParNew 7808K-&gt;2656K(32576K), 0.0447687 secs]<br />
[ParNew 10441K-&gt;3143K(32576K), 0.0179422 secs]<br />
[ParNew 10951K-&gt;3177K(32576K), 0.0031914 secs]<br />
[ParNew 10985K-&gt;3867K(32576K), 0.0154991 secs]<br />
很显然使用了-XX:+UseParNewGC选项的minor收集的时间要比不使用的时候优。</p>
<p><strong>例6:如何缩短major收集的时间</strong><br />
下面比较一下采用-XX:+UseConcMarkSweepGC选项和不采用它的时候的major收集将有什么不同。先执行<br />
java -jar -verbose:gc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar<br />
系统将输出如下信息（片段〕<br />
[Full GC 22972K-&gt;18690K(262080K), 0.2326676 secs]<br />
[Full GC 18690K-&gt;18690K(262080K), 0.1701866 secs<br />
之后再执行 java -jar -verbose:gc -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar<br />
系统将输出如下信息（片段〕<br />
[Full GC 56048K-&gt;18869K(260224K), 0.3104852 secs]<br />
<font color="#ff0000">提示：此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。</font></p>
<p><strong>例7:关于-server选项</strong>&nbsp;在JVM中将运行中的类认定为server-class的时候使用此选项。SUN 的Hot Spot JVM5 如果判断到系统的配置满足如下条件则自动将运行的类认定为server-class，并且会自动设置jvm的选项（当没有手工设置这选项的时候〕而且HOTSPOT JVM5提供了自动调优的功能，他会根据JVM的运行情况进行调整。如果没有特别的需要是不需要太多的人工干预的。SUN形象的称这个机制为&#8220;人体工学&#8221;（Ergonomics〕。具体可以参考http://java.sun.com/docs/hotspot/gc5.0/ergo5.html<br />
*.具有2个或更多个物理的处理器<br />
*.具有2G或者更多的物理内存<br />
<font color="#ff0000">提示：此选项要放在所有选项的前面。例如：java -server 其他选项 java类</font></p>
<p><strong>附录A:预备知识</strong><br />
<strong>．</strong>JVM中对象的划分及管理</p>
<p>JVM根据运行于其中的对象的生存时间大致的分为3种。并且将这3种不同的对象分别存放在JVM从系统分配到的不同的内存空间。这种对象存放空间的管理方式叫做Generation管理方式。<br />
1。Young Generation：用于存放&#8220;早逝&#8221;对象（即瞬时对象）。例如：在创建对象时或者调用方法时使用的临时对象或局部变量。<br />
2。Tenured Generation：用于存放&#8220;驻留&#8221;对象（即较长时间被引用的对象）。往往体现为一个大型程序中的全局对象或长时间被使用的对象。<br />
3。Perm Generation：用于存放&#8220;永久&#8221;对象。这些对象管理着运行于JVM中的类和方法。</p>
<p><strong>．</strong>JVM选项的分类</p>
<p>JVM有这么几种选项供使用.<br />
1.供-X选项使用的项目,又称为非标准选项，不同厂商的此类型选项是有所不同的。例如：IBM的JVM用的一些选项在Sun的JVM中就不一定能生效。这种选项的使用方式如下:<br />
java -Xmn16m -Xms64m -Xmx64m java类名<br />
2.供-XX选项使用的项目，这种类型的选项可能要求有对系统信息访问的权限。所以要慎用。这种选项的使用方式如下:<br />
java -XX:MaxHeapFreeRatio=70 -XX:+PrintGCDetails java类名<br />
3.java选项(即在命令行执行java后提示的选项).<br />
java -server -verbose:gc -d64 java类名</p>
<p><strong>．</strong>垃圾收集分类</p>
<p>在JVM中有两种垃圾方式，一种叫做Minor（次收集），另一种叫做Major（主收集）。其中Minor在Young Generation的空间被对象全部占用后执行，主要是对Young Generation中的对象进行垃圾收集。而Major是针对于整个Heap size的垃圾收集。其中Minor方式的收集经常发生，并且Minor收集所占用的系统时间小。Major方式的垃圾收集则是一种&#8220;昂贵&#8221;的垃圾收集方式，因为在Major要对整个Heap size进行垃圾收集,这会使得应用停顿的时间变得较长。</p>
<p><strong>．</strong>GC信息的格式</p>
<p>&nbsp;</p>
<p>[GC [&lt;collector&gt;: &lt;starting occupancy1&gt; -&gt; &lt;ending occupancy1&gt;, &lt;pause time1&gt; secs] &lt;starting occupancy3&gt; -&gt; &lt;ending occupancy3&gt;, &lt;pause time3&gt; secs]<br />
&lt;collector&gt; GC为minor收集过程中使用的垃圾收集器起的内部名称.<br />
&lt;starting occupancy1&gt; young generation 在进行垃圾收集前被对象使用的存储空间.<br />
&lt;ending occupancy1&gt; young generation 在进行垃圾收集后被对象使用的存储空间<br />
&lt;pause time1&gt; minor收集使应用暂停的时间长短(秒)&nbsp;<br />
&lt;starting occupancy3&gt; 整个堆(Heap Size)在进行垃圾收集前被对象使用的存储空间<br />
&lt;ending occupancy3&gt; 整个堆(Heap Size)在进行垃圾收集后被对象使用的存储空间<br />
&lt;pause time3&gt; 整个垃圾收集使应用暂停的时间长短(秒),包括major收集使应用暂停的时间(如果发生了major收集).<br />
<strong>．</strong>GC信息的选项<br />
-XX:+PrintGCDetails 显示GC的详细信息<br />
-XX:+PrintGCApplicationConcurrentTime 打印应用执行的时间<br />
-XX:+PrintGCApplicationStoppedTime 打印应用被暂停的时间<br />
<font color="#ff0000">提示:1.":"后的"+"号表示开启此选项,如果是"-"号那么表示关闭此选项。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.在不同的选项和不同的收集方式和类型下输出的格式会有所不同。</font></p>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/conans/aggbug/365427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-12-02 21:59 <a href="http://www.blogjava.net/conans/articles/365427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jstat使用</title><link>http://www.blogjava.net/conans/articles/365426.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 02 Dec 2011 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/365426.html</guid><description><![CDATA[<p>jstat</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. jstat -gc pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以显示gc的信息，查看gc的次数，及时间。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中最后五项，分别是young gc的次数，young gc的时间，full gc的次数，full gc的时间，gc的总时间。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.jstat -gccapacity pid<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以显示，VM内存中三代（young,old,perm）对象的使用和占用大小，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：PGCMN显示的是最小perm的内存使用量，PGCMX显示的是perm的内存最大使用量，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PGC是当前新生成的perm内存占用量，PC是但前perm内存占用量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其他的可以根据这个类推， OC是old内纯的占用量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 3.jstat -gcutil pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统计gc信息统计。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 4.jstat -gcnew pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 年轻代对象的信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 5.jstat -gcnewcapacity pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 年轻代对象的信息及其占用量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 6.jstat -gcold pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old代对象的信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 7.stat -gcoldcapacity pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old代对象的信息及其占用量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 8.jstat -gcpermcapacity pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perm对象的信息及其占用量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 9.jstat -class pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示加载class的数量，及所占空间等信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 10.jstat -compiler pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示VM实时编译的数量等信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 11.stat -printcompilation pid</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前VM执行的信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些术语的中文解释：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S0C：年轻代中第一个survivor（幸存区）的容量 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S1C：年轻代中第二个survivor（幸存区）的容量 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S0U：年轻代中第一个survivor（幸存区）目前已使用空间 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S1U：年轻代中第二个survivor（幸存区）目前已使用空间 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EC：年轻代中Eden（伊甸园）的容量 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EU：年轻代中Eden（伊甸园）目前已使用空间 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OC：Old代的容量 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OU：Old代目前已使用空间 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC：Perm(持久代)的容量 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PU：Perm(持久代)目前已使用空间 (字节)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YGC：从应用程序启动到采样时年轻代中gc次数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YGCT：从应用程序启动到采样时年轻代中gc所用时间(s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FGC：从应用程序启动到采样时old代(全gc)gc次数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FGCT：从应用程序启动到采样时old代(全gc)gc所用时间(s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GCT：从应用程序启动到采样时gc用的总时间(s)</p>
<p>&nbsp;&nbsp;&nbsp; NGCMN：年轻代(young)中初始化(最小)的大小 (字节)</p>
<p>&nbsp;&nbsp;&nbsp; NGCMX：年轻代(young)的最大容量 (字节)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NGC：年轻代(young)中当前的容量 (字节)</p>
<p>&nbsp;&nbsp; OGCMN：old代中初始化(最小)的大小 (字节)</p>
<p>&nbsp;&nbsp; OGCMX：old代的最大容量 (字节)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OGC：old代当前新生成的容量 (字节)</p>
<p>&nbsp;&nbsp; PGCMN：perm代中初始化(最小)的大小 (字节)</p>
<p>&nbsp;&nbsp; PGCMX：perm代的最大容量 (字节)&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PGC：perm代当前新生成的容量 (字节)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S0：年轻代中第一个survivor（幸存区）已使用的占当前容量百分比</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S1：年轻代中第二个survivor（幸存区）已使用的占当前容量百分比</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E：年轻代中Eden（伊甸园）已使用的占当前容量百分比</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O：old代已使用的占当前容量百分比</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P：perm代已使用的占当前容量百分比</p>
<p>&nbsp; S0CMX：年轻代中第一个survivor（幸存区）的最大容量 (字节)</p>
<p>&nbsp;S1CMX ：年轻代中第二个survivor（幸存区）的最大容量 (字节)</p>
<p>&nbsp;&nbsp;&nbsp; ECMX：年轻代中Eden（伊甸园）的最大容量 (字节)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DSS：当前需要survivor（幸存区）的容量 (字节)（Eden区已满）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TT： 持有次数限制</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MTT ： 最大持有次数限制</p>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/conans/aggbug/365426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-12-02 21:30 <a href="http://www.blogjava.net/conans/articles/365426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js获取网页高度</title><link>http://www.blogjava.net/conans/articles/364566.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Tue, 22 Nov 2011 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/364566.html</guid><description><![CDATA[<p>&lt;script&gt; <br />function getInfo() <br />{ <br />var s = ""; <br />s += " 网页可见区域宽："+ document.body.clientWidth; <br />s += " 网页可见区域高："+ document.body.clientHeight; <br />s += " 网页可见区域宽："+ document.body.offsetWidth + " (包括边线和滚动条的宽)"; <br />s += " 网页可见区域高："+ document.body.offsetHeight + " (包括边线的宽)"; <br />s += " 网页正文全文宽："+ document.body.scrollWidth; <br />s += " 网页正文全文高："+ document.body.scrollHeight; <br />s += " 网页被卷去的高(ff)："+ document.body.scrollTop; <br />s += " 网页被卷去的高(ie)："+ document.documentElement.scrollTop; <br />s += " 网页被卷去的左："+ document.body.scrollLeft; <br />s += " 网页正文部分上："+ window.screenTop; <br />s += " 网页正文部分左："+ window.screenLeft; <br />s += " 屏幕分辨率的高："+ window.screen.height; <br />s += " 屏幕分辨率的宽："+ window.screen.width; <br />s += " 屏幕可用工作区高度："+ window.screen.availHeight; <br />s += " 屏幕可用工作区宽度："+ window.screen.availWidth; <br />s += " 你的屏幕设置是 "+ window.screen.colorDepth +" 位彩色"; <br />s += " 你的屏幕设置 "+ window.screen.deviceXDPI +" 像素/英寸"; <br />//alert (s); <br />} <br />getInfo(); <br />&lt;/script&gt; <br />在我本地测试当中： <br />在IE、FireFox、Opera下都可以使用 <br />document.body.clientWidth <br />document.body.clientHeight <br />即可获得，很简单，很方便。 <br />而在公司项目当中： <br />Opera仍然使用 <br />document.body.clientWidth <br />document.body.clientHeight <br />可是IE和FireFox则使用 <br />document.documentElement.clientWidth <br />document.documentElement.clientHeight <br />原来是W3C的标准在作怪啊 <br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; <br />如果在页面中添加这行标记的话 <br /><br />在IE中： <br />document.body.clientWidth ==&gt; BODY对象宽度 <br />document.body.clientHeight ==&gt; BODY对象高度 <br />document.documentElement.clientWidth ==&gt; 可见区域宽度 <br />document.documentElement.clientHeight ==&gt; 可见区域高度 <br />在FireFox中： <br />document.body.clientWidth ==&gt; BODY对象宽度 <br />document.body.clientHeight ==&gt; BODY对象高度 <br />document.documentElement.clientWidth ==&gt; 可见区域宽度 <br />document.documentElement.clientHeight ==&gt; 可见区域高度 <br />? <br />在Opera中： <br />document.body.clientWidth ==&gt; 可见区域宽度 <br />document.body.clientHeight ==&gt; 可见区域高度 <br />document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽） <br />document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高） <br />而如果没有定义W3C的标准，则 <br />IE为： <br />document.documentElement.clientWidth ==&gt; 0 <br />document.documentElement.clientHeight ==&gt; 0 <br />FireFox为： <br />document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高） <br />Opera为： <br />document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高） <br />真是一件麻烦事情，其实就开发来看，宁可少一些对象和方法，不使用最新的标准要方便许多啊。<br /><br /><br /><br />有时候需要取页面的底部, 就会用到document.body.clientHeight , 在HTML 标准中(这一句就能取到整个页面的高度, 不论body 的实际内容到底有多高, 例如, 1074*768 的分辨率, 页面最大化时, 这个高度约为720 , 即使页面上只有一句&#8221;hello world&#8221; , 也仍然取到720.</p>
<p>可是在XHTML中, 如果body 体中只有一行, 则document.body.clientHeight 只能取到那一行的高度, 约20px, 这时如何还想取到整个页面的高度, 就要用document.documentElement.clientHeight 来获取了.</p>
<p>原因是: 在HTML 中, body 是整个DOM 的根, 而在XHTML 中, document 才是根, body 不再是根, 所以取body 的属性时, 不能再取到整个页面的值.</p>
<p>区别新旧标准的行是:<br />&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0 Transitional//EN&#8221; &gt;<br />&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><span style="color: rgb(169,0,3)">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</span></a>&#8220;&gt;<br />前者指明该页面使用旧标准, 后者指明该页面使用新标准.</p>
<p>总结:<br />XHTML中用 document.documentElement.clientHeight 代替<br />document.body.clientHeight<br /><br /></p><img src ="http://www.blogjava.net/conans/aggbug/364566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-11-22 15:01 <a href="http://www.blogjava.net/conans/articles/364566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何正确煎中药（详细步骤）</title><link>http://www.blogjava.net/conans/articles/364287.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 18 Nov 2011 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/364287.html</guid><description><![CDATA[<p><wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <a href="http://photo.blog.sina.com.cn/showpic.html#blogid=52dc51840100c9fx&amp;url=http://s12.sinaimg.cn/orignal/52dc5184h701ae85739ab" target="_blank"><img style="width: 398px; height: 302px" title="如何正确煎中药（详细步骤）" alt="如何正确煎中药（详细步骤）" src="http://s12.sinaimg.cn/bmiddle/52dc5184h701ae85739ab" width="467" height="315" real_src="http://s12.sinaimg.cn/bmiddle/52dc5184h701ae85739ab" /></a></p>
<p>&nbsp;<wbr></p>
<p><font style="font-size: 32px" color="#ff0000"><strong>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>如何正确煎中药</strong></font></p>
<p>&nbsp;<wbr></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 中药也叫中草药，是指中国传统医学中用以防病治病的物质，包括天然药及其加工品。虽然名义上叫中&#8220;草&#8221;药，是以草木类药物为主，也有动物药（包括龟、鳖、羊、虎等动物身体的一部分），昆虫药（包括蚯蚓、蜈蚣、土鳖虫等），矿物药（包括各种金属）。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 正是因为中药材疗效卓越，种类繁杂，每一味药材的性、状、质都不同，所以煎煮和服用的方法很独特。可以说煎煮和服用方法直接影响疗效，我们今天就来谈谈中药材合理的煎煮方法。&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 【<strong>步骤</strong>】</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 一、先来学几个概念：&#8220;先煎&#8221;，&#8220;后下&#8221;，&#8220;包煎&#8221;，&#8220;另煎&#8221;，&#8220;冲服&#8221;，&#8220;解表药&#8221;，&#8220;补益药&#8221;，&#8220;一碗水&#8221;。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1.<strong><font color="#0000ff">先煎</font></strong>&nbsp;<wbr> 就是要先打碎后煎煮20-30分钟以后再入其它药合煎到规定时间。需要先煎的药比较容易识别，它们都是些矿石及贝壳类药材，像石决明、牡蛎、磁石、龙骨等。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>2.<strong><font color="#0000ff">后下</font></strong>&nbsp;<wbr> 是指在其它药物煎好出锅前10分钟放入的药材。它们指那些含有芳香挥发物质的药物，久煎会损失药效，如薄荷、砂仁、蔻仁、佩兰、青蒿等，另外大黄、钩藤也宜后下。<br />提示：在滋补的方剂中往往会加入一些行气药，如青皮、陈皮、枳实、枳壳、砂仁、蔻仁等，我们建议这些也应该后下，煎煮10-15分钟后起锅，因为滋补药需要久煎，而这些药不耐久煎，也应该单独包装。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3.<strong><font color="#0000ff">包煎</font></strong>&nbsp;<wbr> 是指某些需要装入纱布袋煎煮的药，这些药大多是粘性强、粉末状、颗粒细小或者是有绒毛的药材，如车前子、苏子、蛤粉、青黛、枇杷叶、旋覆花、蒲黄等，如不包煎服用时要滤清药液。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4.<strong><font color="#0000ff">另煎</font></strong>&nbsp;<wbr> 是指一些贵重药材，为了更好地煎出有效成分并防止浪费，需要单独煎煮，其煎液可与其他药物的煎液合并后服用或单独服用，如野山参、高丽参、西洋参等；冬虫夏草另煎并连药材同吃，或磨粉冲服更好。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 5.<strong><font color="#0000ff">冲服</font></strong>&nbsp;<wbr> 是指某些特别贵重、量少的细料药可以磨成细粉，用其他药物煎好的汤药冲服，如珍珠、犀角、羚羊角、麝香、朱砂、三七、琥珀等；新鲜的中草药必要时也可以打汁冲服；天麻、鸡内金、炙甲珠研末冲服比入煎效果好。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&#8251;需要按以上五种煎煮方法处理的药材在药房包装时，药剂师应该单独包装和详细告知顾客，这是规定也是起码的行业道德。当然也有个别药剂师没有尽到告知义务或根本不单独包装，这就需要我们自己留意。俗话说，多学点没坏处。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 6.<strong><font color="#0000ff">解表药</font></strong>&nbsp;<wbr> 是指治疗扁桃体炎、腮腺炎、流行性感冒、上呼吸道感染和因此而引起的头痛、咳嗽、鼻塞、发热、怕冷、咽痛等病症的方剂。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 7.<strong><font color="#0000ff">补益药</font></strong>&nbsp;<wbr> 是指治疗身体因脏腑疾病造成的慢性损耗、劳倦外伤或营养不良引起的阴阳气血津液的不足而致虚的方剂。也许理解起来很困难，但补益药有个特征，就是往往包含有这么几种药&#8212;&#8212;人参、党参、黄芪、白术、生地、熟地、当归、枸杞、麦冬、山萸、肉苁蓉、杜仲、补骨脂等，如果看到这几种药就可以断定这张方剂有补益的作用，但不一定是单纯的补益，往往是攻补结合或通补结合的。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 8.<font color="#0000ff"><strong>一碗水</strong></font>&nbsp;<wbr> 大概相当于半斤牛奶的量。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 二、准备煎药了。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1.什么工具最合适？<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 首选砂锅，砂锅材质性质稳定，不宜与药物中的化学物质结合，而且受热均匀；其次是陶瓷或搪瓷器皿；不锈钢或铝锅也可以，只是所用的锅要有盖子。切记忌用铁锅和铜锅。另外准备一把长柄勺子，勺子大小依药物多少而定，因为勺子比筷子容易翻底。</font></p>
<p><font style="font-size: 22px">用水注意一点，煎药用自来水即可，只是要用新鲜的生水，有条件就不要用热水、凉开水和久沸的水。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;头煎必须加冷水，接着煎二煎必须加热水，因为药物中的蛋白质遇冷会凝结。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 先浸泡一下。这一步很重要。刚买回来的干燥的药材加水不要太多，水面高出1横指就行，这样过一段时间，水就被药物吸收了，煎药前把水补足就可以。中草药在煎煮以前必须要经过充分浸泡以利于有效成分煎出。可惜的是现在代客煎药的药房最多浸泡30分钟，甚至根本不浸泡就直接下锅了，所以我们建议如果有条件就自己煎。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;如果万一加水多了，就在头煎开锅以前盛出一些，二煎再用，开锅以后就不要这样了。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 那么30分钟到底够不够？一般来说是够了，解表药只需浸泡20分钟就可以，因为解表药往往是花、茎、叶等质轻的药，比较容易吃水；补益药的浸泡时间要长一点，有人说60分钟就可以了，但实际情况看，有些块状或片状的药往往需要2个小时才能吃饱水，比如生地、熟地、麦冬、白术这些药，尤其是加工不精细，块比较大的时候更是如此。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;如果是急救药，不要泥于以上规则，直接下锅好了，救命要紧。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;&#8220;先煎&#8221;，&#8220;后下&#8221;的药物要单独浸泡，&#8220;包煎&#8221;不需要单独浸泡。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2.该放多少水？<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 这里有一个原则：补益药要多放水、久煎、取浓汁；其它药少放水、轻煎、多取汁。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 解释一下，要在充分浸泡以后加水，补益药头煎水面高出3横指，二煎刚刚没过药物；解表药头煎加水过1指，二煎没过药物；其它药头煎高出1横指，二煎没过药物。这里有个前提，就是总水量多于2碗。如果药物很少，总水量不足2碗，那就加2碗水，煎到1碗就可以了。总之，头煎药液浓，水要多些，二煎药液淡，水就少些。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&#8251;不要在煎药中途加水，尤其是时间过半了以后再加水就只能是稀释药液而已，所以要一次加水加足。开始不好掌握，万不得已时水多点总比少点好。中医有句古语&#8212;&#8212;药服满浆，意即服药要服够量，水太少了药物作用小。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;如果每服药医嘱是一天服两遍，要保证每服药至少煎出2碗水，服三遍则三碗水。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 三、可以煎药了<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1.该煎多长时间？<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 补益药头煎要50分钟，二煎要30分钟；解表药头煎要15分钟，二煎要10分钟；其它药头煎30分钟，二煎15分钟就可以了。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;每服药要煎两遍，因为每味药材的煎出时间不同，煎两遍才能保证全部煎出。如果煎药前充分浸泡过，并且煎药时间足够，可以不煎第三遍。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;现在的药店都搞一刀切，统统告诉顾客头煎20分钟，二煎15分钟，这是不科学的。之所以这么告诉顾客，是因为该单包的不单包，该后下的就不能后下了，就只能煎20分钟了，因为行气药不耐久煎，所以自己要注意一下。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2.掌握好火候。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 煎药就像烹饪，火候很重要。开始时要大火，开锅后转小火，让水轻轻沸腾就可以，火太大有效成分就会过多蒸发，二煎同样。煎药的过程中要隔10几分钟把药由下至上彻底翻一遍，尤其是二煎水比较少时更重要。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;不要忘记对药物&#8220;先煎&#8221;，&#8220;后下&#8221;，&#8220;包煎&#8221;，&#8220;另煎&#8221;，&#8220;冲服&#8221;的下锅时间掌握。</font></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 四、怎么储存汤药<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 煎好的药液就是可以服用的汤药了，由于没有添加任何防腐剂，所以时间久了会变质，原则上是当天煎当天服。但是每天都煎药时间不允许，我们可以变通一下，一次煎4-7服药，把药液保存在冰箱冷藏室内，7天之内是不会变质的。服用的时候盛出一碗，在微波炉加热3-4分钟或者火上稍微烧开。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 提示：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &#8251;除非有医嘱，否则所有汤药都不能冷服，每次服药前都要稍微烧开，然后温度合适了再喝，因为中药的有效成分都是加热了以后才能相互融合。</font></p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <a href="http://photo.blog.sina.com.cn/showpic.html#blogid=52dc51840100c9fx&amp;url=http://s1.sinaimg.cn/orignal/52dc5184h611edb872130" target="_blank"><img title="如何正确煎中药（详细步骤）" alt="如何正确煎中药（详细步骤）" src="http://s1.sinaimg.cn/bmiddle/52dc5184h611edb872130" real_src="http://s1.sinaimg.cn/bmiddle/52dc5184h611edb872130" /></a>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></p>
<p><font style="font-size: 22px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 另外，有人总认为水煎药材一定是三、四碗水煮成一碗。其实不然，由于水煎药材的成分不同、煎煮的方法当然要&#8220;因药而异&#8221;，才能充分发挥每味药材的药效；临床上，常见的药材煎煮法有下列几种：</font></p>
<p><font style="font-size: 22px">　　1. <font color="#ff0000"><strong>标准煮法：</strong></font>药材为一般的补药(例如包含有当归、黄芪、熟地)</font></p>
<p><font style="font-size: 22px">　　步骤一：先将药材放入锅内(不可使用铁锅或铜锅)，加入适量的水(超过药面约2公分、大约4碗水)，浸泡半个小时。</font></p>
<p><font style="font-size: 22px">　　步骤二：以武火(大火)煮沸后，再以文火(小火)煮到剩一碗水(约250ml.)，将煮好的药液倒出于碗中，再重复用三碗水煎煮成8分，前后两次混合服用。</font></p>
<p><font style="font-size: 22px">　　2. <font color="#ff0000"><strong>快煮法：</strong></font>药材含有挥发性中药(例如银花、菊花等治疗感冒的中药)</font></p>
<p><font style="font-size: 22px">　　步骤一：先将药材放入锅内，加入适量的水(刚好盖过药面，约三碗水)，浸泡半个小时。</font></p>
<p><font style="font-size: 22px">　　步骤二：以武火(大火)煮沸后，再以文火(小火)煮10分钟，不可打开盖子，煮一次即可服用，不必重复一次。</font></p>
<p><font style="font-size: 22px">　　3. <strong><font color="#ff0000">后下法：</font></strong>药材中含有不耐煮的中药(例如天麻、钩藤、麻黄等)</font></p>
<p><font style="font-size: 22px">　　步骤一：先用四碗水浸泡药材约半个小时。</font></p>
<p><font style="font-size: 22px">　　步骤二：以武火(大火)煮沸后，再以文火(小火)煮到剩一碗水(约250ml.)时，再将不耐煮的中药(一般会另外包)投入再煮5分钟，将药液倒出于碗中即可服用。</font></p>
<p><font style="font-size: 22px">　　4. <strong><font color="#ff0000">先下法：</font></strong>药材中有一些需久煮的矿物类(例如：滑石、石膏)。</font></p>
<p><font style="font-size: 22px">　　步骤一：先将矿物类的中药(另外包)加入六碗水，先煎30分钟后，再加入其它药材。</font></p>
<p><font style="font-size: 22px">　　步骤二：以武火(大火)煮沸后，再以文火(小火)煮到剩一碗水(约250ml.)，将煮好的药液倒出于碗中服用即可。</font></p>
<p><font style="font-size: 22px">　　5. <strong><font color="#ff0000">另煎法：</font></strong>药材中含有一些名贵药材(例如人参)</font></p>
<p><font style="font-size: 22px">　　步骤一：先将一般药材加四碗水放入锅内，浸泡半个小时，大火煮沸后，小火煮到剩一碗水，放凉。</font></p>
<p><font style="font-size: 22px">　　步骤二：将名贵药材的药材，加一碗水，于电饭锅中蒸30分钟后，取出与上述药液相混，即可服用。</font></p>
<p><font style="font-size: 22px">　　&#8220;良药苦口&#8221;，中药本来就不太好吃，何况是水煎中药？可是，如果真的病情需要服用水煎中药，那么，至少也要&#8220;料理&#8221;正确、水药的药效才会彻底出来，所以，如果有机会服用水煎中药时，别忘了问问您的医师、该如何煎煮您的中药，可不是一味地&#8220;三、四碗煮成一碗&#8221;！</font></p>
<p>&nbsp;<wbr></p>
<p><font style="font-size: 18px"><font style="font-size: 18px"><font size="5"><font style="font-size: 22px"><font style="font-size: 22px"><font style="font-size: 22px"><font size="5" face="黑体"><font color="#5c5248"><span style="font-family: 宋体; font-size: 16pt"><font style="font-size: 22px">相关博文链接：</font></span></font></font></font></font></font></font></font></font> <font style="font-size: 22px"><font style="font-size: 22px"><font style="font-size: 22px"><span style="font-family: 宋体; font-size: 16pt"><br /></span></font></font></font></p>
<p>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <font style="font-size: 22px"><a title="李老传艺" href="http://blog.sina.com.cn/s/articlelist_1390170500_8_1.html"><font color="#5c5248">李老传艺</font></a>：</font><span style="font-family: 宋体; font-size: 14pt" lang="EN-US" xml:lang="EN-US"><a href="http://blog.sina.com.cn/s/articlelist_1390170500_8_1.html"><font style="font-size: 14px" color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_8_1.html</font></a></span></p>
<p>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><font style="font-size: 22px"><a title="学道从师" href="http://blog.sina.com.cn/s/articlelist_1390170500_4_1.html"><font color="#5c5248">学道从师</font></a>：</font><a href="http://blog.sina.com.cn/s/articlelist_1390170500_4_1.html"><font style="font-size: 14px" color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_4_1.html</font></a></p>
<p>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <font style="font-size: 22px"><a title="华夏中医" href="http://blog.sina.com.cn/s/articlelist_1390170500_1_1.html"><font color="#5c5248">华夏中医</font></a>：</font><a href="http://blog.sina.com.cn/s/articlelist_1390170500_1_1.html"><font style="font-size: 14px" color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_1_1.html</font></a></p>
<p><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <a title="原创歌曲" href="http://blog.sina.com.cn/s/articlelist_1390170500_3_1.html"><font style="font-size: 22px" color="#5c5248" size="5">原创歌曲</font></a><font style="font-size: 22px" size="5">：</font><a href="http://blog.sina.com.cn/s/articlelist_1390170500_3_1.html"><font style="font-size: 14px" color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_3_1.html</font></a><wbr><br /></p>
<p>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><a title="北京奥运" href="http://blog.sina.com.cn/s/articlelist_1390170500_10_1.html" target="_blank"><font style="font-size: 22px" color="#5c5248">北京奥运</font></a><font style="font-size: 22px" color="#5c5248">：</font><a href="http://blog.sina.com.cn/s/articlelist_1390170500_10_1.html"><font color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_10_1.html</font></a><font style="font-size: 16px"><font color="#5c5248">（</font><font color="#ff0000">百年梦圆</font><font color="#5c5248">）</font></font></p>
<p><font style="font-size: 22px">&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <a title="5.12地震" href="http://blog.sina.com.cn/s/articlelist_1390170500_2_1.html"><font color="#5c5248">5.12地震</font></a>：</font><a href="http://blog.sina.com.cn/s/articlelist_1390170500_2_1.html"><font color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_2_1.html</font></a>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><font style="font-size: 16px">（<font style="font-size: 14px" color="#000000"><strong>不堪回首</strong></font>）</font></p>
<p>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <a title="中医普及宣传专辑" href="http://blog.sina.com.cn/s/articlelist_1390170500_7_1.html" target="_blank"><font style="font-size: 22px" color="#5c5248">中医普及宣传专辑</font></a><font style="font-size: 22px">：<a href="http://blog.sina.com.cn/s/articlelist_1390170500_7_1.html"><font style="font-size: 12px" color="#5c5248">http://blog.sina.com.cn/s/articlelist_1390170500_7_1.html</font></a></font>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&nbsp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></p><img src ="http://www.blogjava.net/conans/aggbug/364287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-11-18 22:16 <a href="http://www.blogjava.net/conans/articles/364287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j详解与实战(转)</title><link>http://www.blogjava.net/conans/articles/355064.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Tue, 26 Jul 2011 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/355064.html</guid><description><![CDATA[<p>log4j是一个非常强大的log记录软件，下面我们就来看看在项目中如何使log4j。</p>
<p>&nbsp;</p>
<p>首先当然是得到log4j的jar档，推荐使用1.2.X版，下载地址：</p>
<p><a href="http://logging.apache.org/log4j/1.2/download.html">http://logging.apache.org/log4j/1.2/download.html</a> </p>
<p>&nbsp;</p>
<p>我们先看一个最简单的示例：</p>
<p><strong>【示例1】</strong> </p>
<p><span style="font-size: medium; color: #0000ff">项目结构：</span> </p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" alt="" src="http://www.iteye.com/upload/attachment/99808/5429dd5f-c45b-350c-a40c-307f0a852358.png" /><br /><br />【注：<span style="color: #ff0000">由于这里的多个项目公用一个jar档，我们可以创建一个专门放置jar档的Java工程，然后将jar档放到lib目录下。在要使用的工程中按图所示进行引用</span> 】</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.coderdream.log4j;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.log4j.Logger;<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloLog4j&nbsp;{<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Logger.getLogger(HelloLog4j.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println("This&nbsp;is&nbsp;println&nbsp;message.");<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录debug级别的信息</span><span style="color: #008000"><br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;debug&nbsp;message.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录info级别的信息</span><span style="color: #008000"><br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;info&nbsp;message.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录error级别的信息</span><span style="color: #008000"><br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;error&nbsp;message.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">}</span></div>
<p><span style="font-size: medium; color: #0000ff">&nbsp;配置文件log4j.properties:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">#可以设置级别：debug</span><span style="color: #000000">&gt;</span><span style="color: #000000">info</span><span style="color: #000000">&gt;</span><span style="color: #000000">error<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">#debug：显示debug、info、error<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">#info：显示info、error<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">#error：只error<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">debug,appender1<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">#log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">info,appender1<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">#log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">error,appender1<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">#输出到控制台<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">#样式为TTCCLayout<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.TTCCLayout</span></div><span style="font-size: small; color: #ff0000">输出结果：</span><br />
<p></span>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[main]&nbsp;DEBUG&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;debug&nbsp;message.<br />[main]&nbsp;INFO&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;info&nbsp;message.<br />[main]&nbsp;ERROR&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;error&nbsp;message.</span></div>
<p><br />&nbsp;</p>
<p>通过配置文件可知，我们需要配置3个方面的内容：</p>
<p>1、根目录（级别和目的地）；</p>
<p>2、目的地（控制台、文件等等）；</p>
<p>3、输出样式。</p>
<p><strong><span style="font-size: medium; color: #0000ff"><br />下面我们来看看Log4J的类图：</span> </strong></p>
<p><br /><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" alt="" src="http://www.iteye.com/upload/attachment/99825/3889d0d4-9d5a-3af3-8b20-926b0a043666.png" /></p>
<p>&nbsp;</p>
<p><strong>Logger - 日志写出器，供程序员输出日志信息 </strong><br /><strong>Appender - 日志目的地，把格式化好的日志信息输出到指定的地方去 </strong><br />ConsoleAppender - 目的地为控制台的Appender <br />FileAppender - 目的地为文件的Appender <br />RollingFileAppender - 目的地为大小受限的文件的Appender <br /><strong>Layout - 日志格式化器，用来把程序员的logging request格式化成字符串</strong> <br />PatternLayout - 用指定的pattern格式化logging request的Layout </p>
<p><span lang="EN-US"><span style="font-size: medium"><strong><span style="color: #0000ff"><br /><span style="color: #000000">Log4j基本使用方法</span> </span></strong></span><br /><br />　　Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。<br /><br />　　<strong><span style="font-size: medium; color: #0000ff">一、定义配置文件</span> </strong><br /><br />　　其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：<br /><br />　　<span style="font-size: small; color: #0000ff">1.配置根Logger，其语法为：</span> <br /><br />　　log4j.rootLogger = [ level ] , appenderName, appenderName, &#8230;<br /><br />　　其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br /><br />　　<span style="font-size: small; color: #0000ff">2.配置日志信息输出目的地Appender，其语法为：</span> <br /><br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />　　log4j.appender.appenderName.option1 = value1<br />　　&#8230;<br />　　log4j.appender.appenderName.option = valueN<br /><br />　　其中，Log4j提供的appender有以下几种：<br />　　org.apache.log4j.ConsoleAppender（控制台），<br />　　org.apache.log4j.FileAppender（文件），<br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />　　org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br /><br />　　<span style="font-size: small; color: #0000ff">3.配置日志信息的格式（布局），其语法为：</span> <br /><br />　　log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />　　log4j.appender.appenderName.layout.option1 = value1<br />　　&#8230;<br />　　log4j.appender.appenderName.layout.option = valueN<br /><br />　　其中，Log4j提供的layout有以e几种：<br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br /><br />　　Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息<br /><br />　　%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL<br />　　%r 输出自应用启动到输出该log信息耗费的毫秒数<br />　　%c 输出所属的类目，通常就是所在类的全名<br />　　%t 输出产生该日志事件的线程名<br />　　%n 输出一个回车换行符，Windows平台为&#8220;rn&#8221;，Unix平台为&#8220;n&#8221;<br />　　%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />　　%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)<br /><br />　　<span style="color: #0000ff"><strong><span style="font-size: medium">二、在代码中使用Log4j</span> </strong></span><br /><br />　　<span style="font-size: medium; color: #0000ff">1.得到记录器</span> <br /><br />　　使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为：<br /><br />　　public static Logger getLogger( String name)<br /><br />　　通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：<br /><br />　　static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )<br /><br />　　<span style="font-size: medium; color: #0000ff">2.读取配置文件</span> <br /><br />　　当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br /><br />　　BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />　　PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br />　　DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。<br /><br />　　<span style="font-size: medium; color: #0000ff">3.插入记录信息（格式化日志信息）</span> <br /><br />　　当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：<br /><br />　　Logger.debug ( Object message ) ;<br />　　Logger.info ( Object message ) ;<br />　　Logger.warn ( Object message ) ;<br />　　Logger.error ( Object message ) ; </span></p>
<p><br />&nbsp;</p>
<p><span style="font-size: medium"><strong>示例2～示例8</strong> </span></p>
<p>&nbsp;</p>
<p><strong>【示例2】</strong> 输出为文本文件或HTML文件</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#设置级别：<br />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">debug,appender1<br /><br />#输出到文件(这里默认为追加方式)<br />log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br />#设置文件输出路径<br />#【</span><span style="color: #000000">1</span><span style="color: #000000">】文本文件<br />#log4j.appender.appender1.File</span><span style="color: #000000">=</span><span style="color: #000000">c:</span><span style="color: #000000">/</span><span style="color: #000000">Log4JDemo02.log<br />#【</span><span style="color: #000000">2</span><span style="color: #000000">】HTML文件<br />log4j.appender.appender1.File</span><span style="color: #000000">=</span><span style="color: #000000">c:</span><span style="color: #000000">/</span><span style="color: #000000">Log4JDemo02.html<br />#设置文件输出样式<br />#log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.TTCCLayout<br />log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.HTMLLayout</span></div>
<p><br /><strong>【</strong> <strong>示例3】</strong> 输出为文本文件或HTML文件</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#设置级别和多个目的地<br />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">debug,appender1,appender2<br /><br />#输出到控制台<br />log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />#设置输出样式<br />log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.TTCCLayout<br /><br />#输出到文件(这里默认为追加方式)<br />log4j.appender.appender2</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br />#设置文件输出路径<br />#【</span><span style="color: #000000">1</span><span style="color: #000000">】文本文件<br />#log4j.appender.appender2.File</span><span style="color: #000000">=</span><span style="color: #000000">c:</span><span style="color: #000000">/</span><span style="color: #000000">Log4JDemo02.log<br />#【</span><span style="color: #000000">2</span><span style="color: #000000">】HTML文件<br />log4j.appender.appender2.File</span><span style="color: #000000">=</span><span style="color: #000000">c:</span><span style="color: #000000">/</span><span style="color: #000000">Log4JDemo02.html<br />#设置文件输出样式<br />#log4j.appender.appender2.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.TTCCLayout<br />log4j.appender.appender2.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.HTMLLayout</span></div><strong>【示例4】</strong> SimpleLayout样式<br />
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#设置级别和目的地<br />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">debug,appender1<br /><br />#输出到控制台<br />log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />#设置输出样式<br />log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.SimpleLayout</span></div>
<p><br /><strong><span style="color: #ff0000"><strong></strong>&nbsp;<span style="font-size: medium">输出结果：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;debug&nbsp;message.<br />INFO&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;info&nbsp;message.<br />ERROR&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;error&nbsp;message.</span></div>
<p></span></span><strong>【示例5】</strong> 自定义样式</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#设置级别和目的地<br />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">debug,appender1<br /><br />#输出到控制台<br />log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />#设置输出样式<br />log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />#自定义样式<br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">r&nbsp;时间&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">t&nbsp;方法名&nbsp;main<br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">p&nbsp;优先级&nbsp;DEBUG</span><span style="color: #000000">/</span><span style="color: #000000">INFO</span><span style="color: #000000">/</span><span style="color: #000000">ERROR<br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">c&nbsp;所属类的全名(包括包名)<br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">l&nbsp;发生的位置，在某个类的某行<br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">m&nbsp;输出代码中指定的讯息，如log(message)中的message<br />#&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">n&nbsp;输出一个换行<br /><br />log4j.appender.appender1.layout.ConversionPattern</span><span style="color: #000000">=%</span><span style="color: #000000">r&nbsp;[</span><span style="color: #000000">%</span><span style="color: #000000">t]&nbsp;[</span><span style="color: #000000">%</span><span style="color: #000000">p]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">c&nbsp;</span><span style="color: #000000">-%</span><span style="color: #000000">l&nbsp;</span><span style="color: #000000">-%</span><span style="color: #000000">m</span><span style="color: #000000">%</span><span style="color: #000000">n</span></div>
<p><span style="font-size: medium; color: #ff0000">输出结果：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">&nbsp;[main]&nbsp;[DEBUG]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;<br /></span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000"></span><span style="color: #000000">-</span><span style="color: #000000">com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:</span><span style="color: #000000">16</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">This&nbsp;is&nbsp;debug&nbsp;message.<br /></span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000"></span><span style="color: #000000">31</span><span style="color: #000000">&nbsp;[main]&nbsp;[INFO]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;<br /></span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000"></span><span style="color: #000000">-</span><span style="color: #000000">com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:</span><span style="color: #000000">18</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">This&nbsp;is&nbsp;info&nbsp;message.<br /></span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000"></span><span style="color: #000000">31</span><span style="color: #000000">&nbsp;[main]&nbsp;[ERROR]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;<br /></span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000"></span><span style="color: #000000">-</span><span style="color: #000000">com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:</span><span style="color: #000000">20</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">This&nbsp;is&nbsp;error&nbsp;message.</span></div>
<p></span><strong>【示例6】</strong> 多目的地、自定义样式</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#设置级别和目的地<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">debug</span><span style="color: #000000">,</span><span style="color: #000000">appender1</span><span style="color: #000000">,</span><span style="color: #000000">appender2<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#输出到控制台<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#设置输出样式<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#自定义样式<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%r&nbsp;时间&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%t&nbsp;方法名&nbsp;main<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%p&nbsp;优先级&nbsp;DEBUG/INFO/ERROR<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%c&nbsp;所属类的全名(包括包名)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%l&nbsp;发生的位置，在某个类的某行<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%m&nbsp;输出代码中指定的讯息，如log(message)中的message<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;%n&nbsp;输出一个换行符号<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender1.layout.ConversionPattern</span><span style="color: #000000">=</span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">%d{yy/MM/dd&nbsp;HH:mm:ss:SSS}</span><span style="font-weight: bold; color: #800000">][</span><span style="color: #800000">%C-%M</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">&nbsp;%m%n<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#输出到文件(这里默认为追加方式)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender2</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#设置文件输出路径<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#【</span><span style="color: #000000">1</span><span style="color: #000000">】文本文件<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender2.File</span><span style="color: #000000">=</span><span style="color: #000000">c:/Log4JDemo06.log<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#设置文件输出样式<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender2.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />log4j.appender.appender2.layout.ConversionPattern</span><span style="color: #000000">=</span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">%d{HH:mm:ss:SSS}</span><span style="font-weight: bold; color: #800000">][</span><span style="color: #800000">%C-%M</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">&nbsp;-%m%n</span></div>
<p><strong>【示例7】</strong> <span style="font-size: medium"><strong><span style="color: #0000ff">【企业应用】设置</span> <span style="color: #0000ff">特定包的级别和目的地</span> </strong></span></p>
<p>先增加一个包，新建一个类：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.coderdream.log4jDao;<br /><br /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.log4j.Logger;<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloDao&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Logger.getLogger(HelloDao.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录debug级别的信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;debug&nbsp;message&nbsp;from&nbsp;Dao.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录info级别的信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;info&nbsp;message&nbsp;from&nbsp;Dao.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录error级别的信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;error&nbsp;message&nbsp;from&nbsp;Dao.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>
<p><br /><span style="color: #0000ff"><strong><span style="font-size: small">如果这个类作为基类，如J2EE中的BaseDao、BaseAction、BaseService等等，则我们可以将各层的日志信息分类输出到各个文件。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#省略根，只设置特定包的级别和目的地<br />log4j.logger.com.coderdream.log4j</span><span style="color: #000000">=</span><span style="color: #000000">debug</span><span style="color: #000000">,</span><span style="color: #000000">appender1<br />log4j.logger.com.coderdream.log4jDao</span><span style="color: #000000">=</span><span style="color: #000000">info</span><span style="color: #000000">,</span><span style="color: #000000">appender1</span><span style="color: #000000">,</span><span style="color: #000000">appender2<br /><br />#输出到控制台<br />log4j.appender.appender1</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />#设置输出样式<br />log4j.appender.appender1.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />#自定义样式<br />#&nbsp;%r&nbsp;时间&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br />#&nbsp;%t&nbsp;方法名&nbsp;main<br />#&nbsp;%p&nbsp;优先级&nbsp;DEBUG/INFO/ERROR<br />#&nbsp;%c&nbsp;所属类的全名(包括包名)<br />#&nbsp;%l&nbsp;发生的位置，在某个类的某行<br />#&nbsp;%m&nbsp;输出代码中指定的讯息，如log(message)中的message<br />#&nbsp;%n&nbsp;输出一个换行符号<br />log4j.appender.appender1.layout.ConversionPattern</span><span style="color: #000000">=</span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">%d{yy/MM/dd&nbsp;HH:mm:ss:SSS}</span><span style="font-weight: bold; color: #800000">][</span><span style="color: #800000">%C-%M</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">&nbsp;%m%n<br /><br />#输出到文件(这里默认为追加方式)<br />log4j.appender.appender2</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br />#设置文件输出路径<br />#【</span><span style="color: #000000">1</span><span style="color: #000000">】文本文件<br />log4j.appender.appender2.File</span><span style="color: #000000">=</span><span style="color: #000000">c:/Log4JDemo07_Dao.log<br />#设置文件输出样式<br />log4j.appender.appender2.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />log4j.appender.appender2.layout.ConversionPattern</span><span style="color: #000000">=</span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">%d{HH:mm:ss:SSS}</span><span style="font-weight: bold; color: #800000">][</span><span style="color: #800000">%C-%M</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">&nbsp;-%m%n</span></div><strong>【示例8】</strong> log4j.xml的配置方式<br />
<p></span></strong></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;log4j:configuration&nbsp;SYSTEM&nbsp;"log4j.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">log4j:configuration&nbsp;</span><span style="color: #ff0000">xmlns:log4j</span><span style="color: #0000ff">="http://jakarta.apache.org/log4j/"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">appender&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="appender1"</span><span style="color: #ff0000"><br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.apache.log4j.RollingFileAppender"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="File"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="logfile08.html"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="MaxFileSize"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="1MB"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="MaxBackupIndex"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">layout&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.apache.log4j.HTMLLayout"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">layout</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">appender</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">root</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">level&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="debug"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">appender-ref&nbsp;</span><span style="color: #ff0000">ref</span><span style="color: #0000ff">="appender1"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">root</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">log4j:configuration</span><span style="color: #0000ff">&gt;</span></div>
<p>为了提高效率，我们可以在写日志前增加判断：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录debug级别的信息</span><span style="color: #008000"><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(logger.isDebugEnabled())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;debug&nbsp;message&nbsp;from&nbsp;Dao.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录info级别的信息</span><span style="color: #008000"><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(logger.isInfoEnabled())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;info&nbsp;message&nbsp;from&nbsp;Dao.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录error级别的信息</span><span style="color: #008000"><br /></span><span style="color: #000000">logger.error(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;error&nbsp;message&nbsp;from&nbsp;Dao.</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<p><br /><br /><br /><br /><br /><br /><br /></strong><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p><img src ="http://www.blogjava.net/conans/aggbug/355064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-07-26 15:03 <a href="http://www.blogjava.net/conans/articles/355064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>