﻿<?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>博客园-智慧掩盖真相</title><link>http://www.cnblogs.com/birdshover/</link><description>天之道，不争而善胜。
</description><language>zh-cn</language><lastBuildDate>Thu, 24 Jul 2008 05:58:02 GMT</lastBuildDate><pubDate>Thu, 24 Jul 2008 05:58:02 GMT</pubDate><ttl>60</ttl><item><title>Lucene.Net 2.3.1版变化之TokenStream（搞笑了）</title><link>http://www.cnblogs.com/birdshover/archive/2008/07/23/1249591.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Wed, 23 Jul 2008 06:59:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/07/23/1249591.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1249591.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/07/23/1249591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1249591.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1249591.html</trackback:ping><description><![CDATA[摘要: 自己做分词，一般选择继承Tokenizer类。在以前的版本中只需要重写Next()方法就可以了。这个类比较简单，而塔的父类TokenStream则更加简单了，和接口没什么两样：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//2.1版publicab&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/07/23/1249591.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1249591.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41275/" target="_blank">[新闻]Mozilla将于本周五发布Firefox 3.1第一个预览版</a>]]></description></item><item><title>如何在Lucene.Net中一个Document使用不同的分词（二）</title><link>http://www.cnblogs.com/birdshover/archive/2008/07/22/1249013.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Tue, 22 Jul 2008 12:36:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/07/22/1249013.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1249013.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/07/22/1249013.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1249013.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1249013.html</trackback:ping><description><![CDATA[<p>昨天说了索引时，如何在Lucene.Net中一个Document使用不同的分词。</p>
<p>&nbsp;</p>
<p>前文地址：<a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/birdshover/archive/2008/07/21/1247966.html"><font color="#0066aa">如何在Lucene.Net中一个Document使用不同的分词（一）</font></a></p>
<p>&nbsp;</p>
<p>今天讲的搜索时使用不同分词。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>方法一、使用两个Parser就可以使用两个分词</strong></p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IndexSearcher(</span><span style="color: #800000">"</span><span style="color: #800000">C:\\LuceneIndex</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BooleanQuery&nbsp;bquery&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BooleanQuery();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryParser&nbsp;titlequery&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryParser(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryParser&nbsp;contentquery&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryParser(</span><span style="color: #800000">"</span><span style="color: #800000">content</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.SimpleAnalyzer());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bquery.Add(titlequery.Parse(</span><span style="color: #800000">"</span><span style="color: #800000">标题</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;BooleanClause.Occur.MUST);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bquery.Add(titlequery.Parse(</span><span style="color: #800000">"</span><span style="color: #800000">内容</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;BooleanClause.Occur.MUST);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;searcher.Search(bquery);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcher.Close();</span></div>
<p>&nbsp;</p>
<p>分析下表达式就是 +title:"标题" +content:"内容".</p>
<p>&nbsp;</p>
<p><strong>方法二、而如果要使用MultiFieldQueryParser来解析呢。</strong></p>
<p><strong></strong>&nbsp;</p>
<p>简单的做法就是用MultiFieldQueryParser类的静态Parser方法得到Query,形式上和用QueryParser&nbsp;差不多。</p>
<p>而如果要&nbsp;用MultiFieldQueryParser.Parse(new string[] { }, new string[] { }, new Lucene.Net.Analysis.Standard.StandardAnalyzer());这种实例化，那么又要进行框架改造了。</p>
<p>&nbsp;</p>
<p>MultiFieldQueryParser是继承自QueryParser&nbsp;类的，显然我们不需要在QueryParser&nbsp;使用多种分词。但是MultiFieldQueryParser实例的Parse方法却是使用的父类的。那就不得不改造父类了。</p>
<p>&nbsp;</p>
<p>分词处理是在QueryParser&nbsp;类470行，由GetFieldQuery方法的TokenStream source = analyzer.TokenStream(field, new System.IO.StringReader(queryText));完成的。</p>
<p>&nbsp;</p>
<p>这个地方改造就要注意技巧了，因为这个动作执行的方法被很多地方都用到了，改造成本比较高，而且一不小心就出错了。</p>
<p>重载一个，或者干脆直接换的方法的参数并不友好。因为QueryParser&nbsp;类本身还有可能被使用，你换掉了，用MultiFieldQueryParser没问题，但是用QueryParser&nbsp;就可能会出问题。</p>
<p>&nbsp;</p>
<p>其实这个时候你的眼睛已经被代码迷惑，呵呵，GetFieldQuery方法在MultiFieldQueryParser被循环调用了。</p>
<p>MultiFieldQueryParser 的GetFieldQuery方法，循环调用了Query q = base.GetFieldQuery(fields[i], queryText);</p>
<p>&nbsp;</p>
<p>是不是想到了什么呢？</p>
<p>&nbsp;</p>
<p>首先给MultiFieldQueryParser类增加一个字段</p>
<p>private Analysis.Analyzer[] analyzers;</p>
<p>然后增加一个构造函数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MultiFieldQueryParser(Analysis.Analyzer[] analyzers, System.String[] fields)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : this(fields, null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fields.Length != analyzers.Length)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("赋予的字段跟分词器数量不匹配");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.analyzers = analyzers;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>为什么要把新构造函数的参数调换位置？是因为this(fields, null)引用另外一个构造函数时候，如果不调换，会导致无法识别用的是哪个方法。</p>
<p>&nbsp;</p>
<p>接着在GetFieldQuery方法Query q = base.GetFieldQuery(fields[i], queryText);之前切换掉分词器：</p>
<p>this.analyzer = this.analyzers[i];</p>
<p>&nbsp;</p>
<p>代码就是</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;Query&nbsp;GetFieldQuery(System.String&nbsp;field,&nbsp;System.String&nbsp;queryText,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;slop)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(field&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Collections.ArrayList&nbsp;clauses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.Collections.ArrayList.Synchronized(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.Collections.ArrayList(</span><span style="color: #800080">10</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: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;fields.Length;&nbsp;i</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;{<br />
&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">切换分词器</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.analyzer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.analyzers[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;q&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.GetFieldQuery(fields[i],&nbsp;queryText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(q&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&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><span style="color: #008000">//</span><span style="color: #008000">If&nbsp;the&nbsp;user&nbsp;passes&nbsp;a&nbsp;map&nbsp;of&nbsp;boosts</span><span style="color: #008000"><br />
</span><span style="color: #000000">&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><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(boosts&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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><span style="color: #008000">//</span><span style="color: #008000">Get&nbsp;the&nbsp;boost&nbsp;from&nbsp;the&nbsp;map&nbsp;and&nbsp;apply&nbsp;them</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Single&nbsp;boost&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(System.Single)&nbsp;boosts[fields[i]];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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><span style="color: #008000">//</span><span style="color: #008000">if&nbsp;(boost&nbsp;!=&nbsp;null)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;{{Aroush-2.1&nbsp;there&nbsp;is&nbsp;no&nbsp;null&nbsp;for&nbsp;'boost'</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&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><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(boosts[fields[i]]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;{{Aroush-2.1&nbsp;will&nbsp;this&nbsp;line&nbsp;do?</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.SetBoost((</span><span style="color: #0000ff">float</span><span style="color: #000000">)&nbsp;boost);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(q&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;PhraseQuery)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PhraseQuery)&nbsp;q).SetSlop(slop);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(q&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;MultiPhraseQuery)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((MultiPhraseQuery)&nbsp;q).SetSlop(slop);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clauses.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BooleanClause(q,&nbsp;BooleanClause.Occur.SHOULD));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(clauses.Count&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</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: #008000">//</span><span style="color: #008000">&nbsp;happens&nbsp;for&nbsp;stopwords</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</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: #0000ff">return</span><span style="color: #000000">&nbsp;GetBooleanQuery(clauses,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.GetFieldQuery(field,&nbsp;queryText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p>&nbsp;</p>
<p>至此，就改造完毕了。</p>
<p>&nbsp;</p>
<p>就可以像下面一样调用了：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IndexSearcher(</span><span style="color: #800000">"</span><span style="color: #800000">C:\\LuceneIndex</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">BooleanQuery&nbsp;bquery&nbsp;=&nbsp;new&nbsp;BooleanQuery();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">QueryParser&nbsp;titlequery&nbsp;=&nbsp;new&nbsp;QueryParser("title",new&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">QueryParser&nbsp;contentquery&nbsp;=&nbsp;new&nbsp;QueryParser("content",&nbsp;new&nbsp;Lucene.Net.Analysis.SimpleAnalyzer());</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiFieldQueryParser&nbsp;multiparser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MultiFieldQueryParser(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Analyzer[]&nbsp;{&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer(),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.SimpleAnalyzer()&nbsp;},&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;{&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">content</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">bquery.Add(titlequery.Parse("标题"),&nbsp;BooleanClause.Occur.MUST);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">bquery.Add(contentquery.Parse("内容"),&nbsp;BooleanClause.Occur.MUST);</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;searcher.Search(multiparser.Parse(</span><span style="color: #800000">"</span><span style="color: #800000">标题</span><span style="color: #800000">"</span><span style="color: #000000">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcher.Close();</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>全文完。 by yurow @<a href="http://www.cnblogs.com/birdshover/">http://www.cnblogs.com/birdshover/</a></p>
 <img src ="http://www.cnblogs.com/birdshover/aggbug/1249013.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41274/" target="_blank">[新闻]瑞星将向个人用户免费1年</a>]]></description></item><item><title>如何在Lucene.Net中一个Document使用不同的分词（一）</title><link>http://www.cnblogs.com/birdshover/archive/2008/07/21/1247966.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 21 Jul 2008 13:01:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/07/21/1247966.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1247966.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/07/21/1247966.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1247966.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1247966.html</trackback:ping><description><![CDATA[这是在博客园Lucene.Net小组看到的一个问题。呵呵，尝试用以下方法解决。<br />
说明：代码没有经过测试。<br />
<br />
<br />
在Lucene.Net中一个Document对象创建并不涉及到分词，分词是跟IndexWriter相关的。<br />
<br />
以类库自带的StandardAnalyzer分词举例，创建一个索引的过程如下<br />
<br />
<div class="cnblogs_code" style="background: #eee"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;实例化写入&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
IndexWriter&nbsp;writer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IndexWriter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer(),</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;建立文档&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
Document&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;Document();<br />
doc.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Field(</span><span style="color: #800000">"</span><span style="color: #800000">id</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">123</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED));<br />
doc.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Field(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">这个是标题</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED));<br />
doc.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Field(</span><span style="color: #800000">"</span><span style="color: #800000">content</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">这个是内容</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED));<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;写入文档&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
writer.AddDocument(doc);<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;优化索引结构&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
writer.Optimize();<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;关闭写入&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
writer.Close();<br />
</span></div>
<br />
在这样的代码里想一个文档不同字段使用不同分词是不可能的。如果要让每个字段使用不同分词，那么当然是给每个字段加上分词器属性。<br />
<br />
先找到Lucene.Net的Field类，发现Field类的字段是继承自AbstractField父类的。在AbstractField先加上<br />
protected internal Analysis.Analyzer analyzer;<br />
<br />
然后增加一个构造函数：<br />
<div class="cnblogs_code" style="background: #eee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;AbstractField(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;Field.Store&nbsp;store,&nbsp;Field.Index&nbsp;index,&nbsp;Field.TermVector&nbsp;termVector,&nbsp;Analysis.Analyzer&nbsp;analyzer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">(name,&nbsp;store,&nbsp;index,&nbsp;termVector)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.analyzer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;analyzer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
在Field类增加构造函数：<br />
<div class="cnblogs_code"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Field(System.String&nbsp;name,&nbsp;System.String&nbsp;value_Renamed,&nbsp;Store&nbsp;store,&nbsp;Index&nbsp;index,&nbsp;TermVector&nbsp;termVector,&nbsp;Analysis.Analyzer&nbsp;analyzer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">(value_Renamed,&nbsp;store,&nbsp;index,&nbsp;termVector,&nbsp;analyzer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<br />
在接口Fieldable中增加方法GetAnalyzer;<br />
Analysis.Analyzer GetAnalyzer();<br />
<br />
<br />
并且在AbstractField类中实现GetAnalyzer方法：<br />
<br />
<div class="cnblogs_code"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;Analysis.Analyzer&nbsp;GetAnalyzer()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.analyzer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
修改DocumentWriter类的 179行 ，如果因为版本不一样不在179行，请查找<br />
&#8220;TokenStream stream = analyzer.TokenStream(fieldName, reader);&#8221;<br />
<br />
然后换成<br />
<br />
TokenStream stream = field.GetAnalyzer().TokenStream(fieldName, reader);<br />
<br />
OK，写入的部分搞定了，读取的部分明天再弄。<br />
<br />
现在就可以这么用了：<br />
<br />
<div class="cnblogs_code" style="background: #eee"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;实例化写入&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
IndexWriter&nbsp;writer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IndexWriter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer(),</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;建立文档&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
Document&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;Document();<br />
doc.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Field(</span><span style="color: #800000">"</span><span style="color: #800000">id</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">123</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED,&nbsp;Field.TermVector.NO,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.KeywordAnalyzer()));<br />
doc.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Field(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">这个是标题</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED,&nbsp;Field.TermVector.NO,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer()));<br />
doc.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Field(</span><span style="color: #800000">"</span><span style="color: #800000">content</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">这个是内容</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED,&nbsp;Field.TermVector.NO,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.SimpleAnalyzer()));<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;写入文档&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
writer.AddDocument(doc);<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;优化索引结构&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
writer.Optimize();<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;关闭写入&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
writer.Close();</span></div>
<br />
当然，这个时候，IndexWriter&nbsp;的分词器实际上是无用的，也可以判定Field给定的分词器是否为null，然后用IndexWriter&nbsp;的作为默认分词器。<br />
<br />
by yurow @ <a href="http://www.cnblogs.com/birdshover/">http://www.cnblogs.com/birdshover/</a><br />
<br />
更新第二部分地址：<a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/birdshover/archive/2008/07/22/1249013.html"><font color="#0066aa">如何在Lucene.Net中一个Document使用不同的分词（二）</font></a> 
 <img src ="http://www.cnblogs.com/birdshover/aggbug/1247966.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41273/" target="_blank">[新闻]中国互联网历史上最伟大的产品TOP10（二）</a>]]></description></item><item><title>Lucene.Net 已经更新到2.3.1 beat版</title><link>http://www.cnblogs.com/birdshover/archive/2008/07/20/1247029.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Sun, 20 Jul 2008 06:33:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/07/20/1247029.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1247029.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/07/20/1247029.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1247029.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1247029.html</trackback:ping><description><![CDATA[<P>今天更新了下才注意到，Lucene.Net已经更新到2.3.1版了，而java版的是2.3.2<BR>2.3.1要通过svn下载<BR><BR>地址：<BR><A href="http://incubator.apache.org/lucene.net/">http://incubator.apache.org/lucene.net/</A><BR><BR>svn地址：<BR><A href="https://svn.apache.org/repos/asf/incubator/lucene.net/">https://svn.apache.org/repos/asf/incubator/lucene.net/</A><BR><BR><BR>更新历史：<BR><BR>Apache Lucene.Net History<BR>-------------------------</P>
<P><BR>15JJul08:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.3.1 build 002 "Beta"<BR>&nbsp;- Port: Prted the "Test" code from Java to C#.<BR>&nbsp;- Fix: A number of issues in Lucene.Net Core code -- Thanks to Doug Sale<BR>&nbsp;- Fix: A number of issues in Lucene.Net Test code -- Thanks to Doug Sale</P>
<P><BR>24Jun08:<BR>&nbsp;- Dev Release:&nbsp; Apache Lucene.Net.2.3.1 build 001 "Alpha"<BR>&nbsp;- Port: Prted the "Core" and "Demo" code from Java to C#.<BR>&nbsp;- Issues: Test code is not released yet.<BR>&nbsp;- Note: Requires Visual Studio 2005 or later and .NET 2.0 or later.<BR>&nbsp;- Note: There is no 2.3.0 or 2.2 release (to correspond with the Java Lucene release).</P>
<P><BR>10Dec07:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.1 build 003 "Release Candidate"<BR>&nbsp;- Fix: LUCENENET-55 "Documents.DateTools has issue creating a Date in StringToDate()"<BR>&nbsp;- Fix: LUCENENET-56 "Incorrect file in TestLockFactory.RmDir()"<BR>&nbsp;- Fix: LUCENENET-57 "DocHelper in Tests not creating UTF8 Cleanly"<BR>&nbsp;- Fix: LUCENENET-58 "Issue in CheckHits c# doesn't perform an Assert against a hashtable"<BR>&nbsp;- Fix: LUCENENET-59 "QueryUtils has some invalid Asserts"<BR>&nbsp;- Fix: LUCENENET-61 "Issue testing Backwards Compatibility"<BR>&nbsp;- Fix: LUCENENET-62 "IndexReader.IndexExists() Fails if directory doesn't exists."<BR>&nbsp;- Fix: LUCENENET-63 "FieldCacheImpl tries to parse a float in f format"<BR>&nbsp;- Fix: LUCENENET-64 "TestDateFilter incorrectly gets total milliseconds"<BR>&nbsp;- Fix: LUCENENET-65 "Test case "TestSerializable" uses the stream after closing"<BR>&nbsp;- Fix: LUCENENET-66 "TestMergeAfterCopy fails in IndexFileDeleter"<BR>&nbsp;- Fix: LUCENENET-67 "Bug in TestIndexWriter.TestAddIndexOnDiskFull"<BR>&nbsp;- Fix: LUCENENET-68 "Bug in TestIndexWriterDelete.TestOperationsOnDiskFull"<BR>&nbsp;- Fix: LUCENENET-69 "FSIndexInput.isFDValid() not ported correctly"<BR>&nbsp;- Fix: LUCENENET-70 "TestParallelReader.TestDocument fails because of bug in "ParallelReader.Document(int n, FieldSelector fieldSelector)" method"<BR>&nbsp;- Fix: LUCENENET-71 "TestParallelTermEnum.Test1 fails because of bug in "ParallelReader.Next" method"<BR>&nbsp;- Fix: LUCENENET-72 "TestIndexReader bugs"<BR>&nbsp;- Fix: LUCENENET-73 "TestDoc.cs --&gt; access to a closed stream"<BR>&nbsp;- Fix: LUCENENET-74 "SimpleFSLockFactory can not obtain lock correctly."<BR>&nbsp;- Fix: LUCENENET-75 "FSDirectory does not correctly handle directory cache "DIRECTORIES""<BR>&nbsp;- Fix: LUCENENET-76 "DisjunctionMaxQuery has unnecessary clone which causes it to fail unit tests"<BR>&nbsp;- Fix: LUCENENET-77 "Bug in TestBinaryDocument.cs"<BR>&nbsp;- Fix: LUCENENET-81 "TestTermVectorsWriter.cs bug"<BR>&nbsp;- Fix: LUCENENET-82 "NUnite test for TestSimpleExplanations"<BR>&nbsp;- Fix: LUCENENET-83 "NUnite test for TestComplexExplanations"<BR>&nbsp;- Fix: LUCENENET-84 "Nunit test for TestMultiFieldQueryParser"<BR>&nbsp;- Fix: LUCENENET-85 "SupportClass.Parse and System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator"<BR>&nbsp;- Fix: LUCENENET-87 "NUnite test for TestQueryParser"<BR>&nbsp;- Fix: LUCENENET-88 "NUnit test for TestQueryParser -2"<BR>&nbsp;- Fix: LUCENENET-89 "NUnit test for TestQueryParser -3"<BR>&nbsp;- Fix: LUCENENET-90 "Nunit test for TestIndexModifier.TestIndex"<BR>&nbsp;- Fix: LUCENENET-91 "NUnit test for TestQueryParser.TestStarParsing"<BR>&nbsp;- Fix: LUCENENET-92 "NUnite test for QueryParser.TestMultiAnalyzer."<BR>&nbsp;- Fix: LUCENENET-93 "NUnite test for Search.TestRemoteSearchable"<BR>&nbsp;- Fix: LUCENENET-94 "NUnit test for Search.TestSort (RemoteSearchable issues)" (only TestSort.patch applied)<BR>&nbsp;- Fix: LUCENENET-96 "NUnit test for Lucene.Net.Store.TestLockFactory.TestLockClassProperty"<BR>&nbsp;- Fix: LUCENENET-101 "Using incorrect base when opening index"<BR>&nbsp;- Fix: LUCENENET-100 "Problem with remoting of IComparable[] in FieldDoc.cs"<BR>&nbsp;- Fix: LUCENENET-104 "Name of first index segment is empty string"</P>
<P><BR>11Aug07:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.1 build 002 "Beta"<BR>&nbsp;- Port: Ported the "Test" code from Java to C#<BR>&nbsp;- Fix: LUCENENET-47: "Make up for Constansts.cs"<BR>&nbsp;- Fix: LUCENENET-48 "Clone method of SegmentInfos.cs does'nt copy local fields/variables."<BR>&nbsp;- Fix: LUCENENET-50 "Improvement for FSDirectory."<BR>&nbsp;- Fix: LUCENENET-52 "IndexFileDeleter in svn trunk"<BR>&nbsp;- Fix: LUCENENET-53 "SegmentsInfos.GetCurrentSegmentGeneration works incorrectly"<BR>&nbsp;- Issues: A number of NUnit tests are failing.</P>
<P><BR>01May07:<BR>&nbsp;- Dev Release:&nbsp; Apache Lucene.Net.2.1 build 001 "early-Alpha"<BR>&nbsp;- Issues: Optimizing an index will cause an exception.<BR>&nbsp;- Issues: The "Test" code has not yet be ported for this release.<BR>&nbsp;- Issues: Code in "contrib" have not been validated to work with this release.</P>
<P><BR>30Apr07:<BR>&nbsp;- Patch:&nbsp; Apache Lucene.Net.2.0 build 005 "final"<BR>&nbsp;- Fix: LUCENENET-37 "Exception while search in Lucene.Net and Index prepared by Lucene Java"</P>
<P><BR>11Mar07:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.0 build 004 "final"<BR>&nbsp;- Fix: LUCENENET-36 "Countries using "," as decimal separator gets an exception in QueryParser.cs with a query like color~0.5"<BR>&nbsp;- Fix: LUCENENET-35 "Tokenizer.Close should check if input is null"<BR>&nbsp;- Fix: LUCENENET-33 "Frequent exceptions at Single Parse(String s)" <BR>&nbsp;- Fix: LUCENENET-32 "Check hashtable in PhraseQuery.ExtractTerms for existing keys"<BR>&nbsp;- Fix: LUCENENET-31 "elimate exception when casting TermFreqVector"<BR>&nbsp;- Fix: LUCENENET-30 "Unnecessary boxing of bytes"</P>
<P><BR>27Dec06:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.0 build 003 "final"<BR>&nbsp;- Fix: Lucene.Net.Search.TestSort.TestInternationalMultiSearcherSort -- NUnit test now passes<BR>&nbsp;- Fix: Lucene.Net.Search.TestSort.TestInternationalSort -- NUnit test now passes</P>
<P><BR>27Nov06:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.0 build 002 "Beta"<BR>&nbsp;- Lucene.Net.Demo.SearchFiles.cs -- ported new code<BR>&nbsp;- Lucene.Net.Index.SegmentReader.Get() -- changed Exception to SystemException<BR>&nbsp;- Lucene.Net.Search.StringIndex.cs -- added a Close() method (to fix sort memory leak defect)<BR>&nbsp;- Lucene.Net.Search.FieldCacheImpl.cs -- added a Close() method (to fix sort memory leak defect)<BR>&nbsp;- Lucene.Net.Search.FieldSortHitQueue.cs -- added a Close() method (to fix sort memory leak defect)<BR>&nbsp;- Lucene.Net.Search.IndexSearcher.cs -- added a Close() method (to fix sort memory leak defect)<BR>&nbsp;- Lucene.Net.Search.MatchAllDocsQuery.Clone() -- removed this unused methods<BR>&nbsp;- Lucene.Net.Search.MultiPhraseQuery.Clone() -- removed this unused methods<BR>&nbsp;- Lucene.Net.Search.PrefixQuery.Clone() -- removed this unused methods<BR>&nbsp;- Lucene.Net.Search.RangeQuery.Clone() -- removed this unused methods<BR>&nbsp;- Lucene.Net.Index.FieldInfos.FieldName()/FieldInfo() -- avoid the use of exception throwing<BR>&nbsp;- Issues: Lucene.Net.Search.TestSort.TestInternationalMultiSearcherSort -- NUnit test FAILS<BR>&nbsp;- Issues: Lucene.Net.Search.TestSort.TestInternationalSort -- NUnit test FAILS</P>
<P><BR>17Aug06:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.2.0 build 001 "Alpha"</P>
<P><BR>13Jul06:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.1.9.1 build 001<BR>&nbsp;- Port: Lucene.Net.Documents.TimeToString() -- re-based with the Java version<BR>&nbsp;- Port: Lucene.Net.Index.IndexWriter.SetMaxBufferedDocs() -- re-based with the Java version<BR>&nbsp;- Port: Lucene.Net.Store.BufferedIndexOutput.WriteBytes() -- re-based with the Java version<BR>&nbsp;- Port: Lucene.Net.Store.RAMOutputStream.FlushBuffer() -- re-based with the Java version<BR>&nbsp;- Port: Lucene.Net.Demo.* -- re-based with the Java version<BR>&nbsp;- Port: Test.Lucene.Net.Index.TestCompoundFile.TestLargeWrites() -- new test case added<BR>&nbsp;- Port: Test.Lucene.Net.StoreTest.Test() -- re-based with the Java version</P>
<P><BR>09Jul06:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.1.9 RC1 build 005 "final"<BR>&nbsp;- Fix: Lucene.Net.Search.MultiPhraseQuery.ToString() -- was skipping one too many item during the iteration<BR>&nbsp;- Fix: Lucene.Net.Index.ParallelReader.GetFieldNames() -- was adding the object instead of the dictionary value<BR>&nbsp;- Fix: Lucene.Net.Index.ParallelReader.Add() -- was adding the object instead of the dictionary value<BR>&nbsp;- Fix: Lucene.Net.Store.Obtain() -- changed name from obtain() to Obtain() (lower case to upper case)<BR>&nbsp;- Fix: Lucene.Net.Index.SegmentReader.~SegmentReader() -- removed: System.Threading.Thread.SetData()<BR>&nbsp;- Fix: Lucene.Net.Index.TermInfosReader.~TermInfosReader() -- removed: System.Threading.Thread.SetData()<BR>&nbsp;- Fix: Lucene.Net.Documents.DateField.DATE_LEN -- must use SupportClass.Number.ToString() to get the length<BR>&nbsp;- Fix: Lucene.Net.Util.ToStringUtils.Boost() -- wasn't adding ".0" when the value doesn't have a remainder<BR>&nbsp;- Fix: Lucene.Net.Index.SegmentReader.CreateFakeNorms() -- was returning the wrong data member<BR>&nbsp;- Fix: Lucene.Net.Documents.NumberTools -- value of MIN_STRING_VALUE and MAX_STRING_VALUE were wrong<BR>&nbsp;- Fix: Test.Lucene.Net.Analysis.TestISOLatin1AccentFilter.TestU() -- file was not saved as unicode; thanks to Ben Tregenna<BR>&nbsp;- Fix: Test.Lucene.Net.TestSearchForDuplicates.TestRun() -- wasn't using MemoryStream correctly<BR>&nbsp;- Fix: Test.Lucene.Net.TestSearch.TestSearch_Renamed_Method() -- wasn't using MemoryStream correctly<BR>&nbsp;- Fix: Test.Lucene.Net.* -- replaced "[TestFixtureSetUp]" to "[SetUp]" and "[FixtureTearDown]" to "[TearDown]"<BR>&nbsp;- Fix: Test.Lucene.Net.Index.TestParallelReader -- was comparing objects instead of the dictionary value<BR>&nbsp;- Fix: Test.Lucene.Net.Index.TestSegmentReader -- was comparing objects instead of the dictionary value<BR>&nbsp;- Fix: Test.Lucene.Net.Index.TestTermVectorWriter -- was not calling InitBloc()<BR>&nbsp;- Fix: Test.Lucene.Net.Analysis.Setup() -- was adding to the hash without checking if the key already exist<BR>&nbsp;- Fix: Test.Lucene.Net.Index.TestMultiReader/TestSegmentReader/TestSegmentTermDoc.cs -- all those needed their class member variables re-initialized</P>
<P><BR>13Jun06:<BR>&nbsp;- Release:&nbsp; Apache Lucene.Net.1.9 RC1 build 004 Beta<BR>&nbsp;- Fix: Lucene.Net.Search.FieldCacheImpl.GetFloats() -- must remove 'f" or "F" for System.Single.Parse() to work<BR>&nbsp;- Fix: Lucene.Net.Index.GetFieldnames() -- was storing the object instead the value in the object<BR>&nbsp;- Fix: Test.Lucene.Net.Index.CollectionContains() -- need to compare strings, not objects<BR>&nbsp;- Fix: Test.Lucene.Net.Serch.TestKnownSetOfDocuments() -- don't fail if an item doesn't exist</P>
<P><BR>03Jun06:<BR>&nbsp;- Release: Apache Lucene.Net.1.9 RC1 build 003 Alpha<BR>&nbsp;- Note: This is the first release of Lucene.Net 1.9 to SVN<BR>&nbsp;- Note: Added ZIP compression support via reflection.&nbsp; Thanks to Eyal Post<BR>&nbsp;- Note: Fixed bugs in the code which were expose via the NUnit "Test" code<BR>&nbsp;- Note: NUnit "Test" code has been ported to Lucene.Net.&nbsp; Out of 307 tests 58 are failing<BR>&nbsp;- Note: There are still some remaining port work to be done; look for the text "Aroush" in the code<BR>&nbsp;- Issue: There are still some code not fully ported; search for "Aroush" to find those codes<BR>&nbsp;- Issue: The NUnit test code has not been ported yet<BR>&nbsp;- Issue: Demo.IndexHtml won't work due to some bug in the area of in-memory stream porting</P>
<P><BR>07Feb06:<BR>&nbsp;- Release: Lucene.Net.1.9 RC1 build 002 Alpha<BR>&nbsp;- Note: This release is based on the current Java code release of 1.9 RC1<BR>&nbsp;- Note: This release contains all the fixes currently implemented for 1.4.3 build 004<BR>&nbsp;- Note: There are still some remaining port work to be done; look for the text "Aroush" in the code<BR>&nbsp;- Issue: The NUnit test code has not been ported yet<BR>&nbsp;- Issue: Demo.IndexHtml won't work due to some bug in the area of in-memory stream porting</P>
<P><BR>26May05:<BR>&nbsp;- Release: Lucene.Net.1.9 RC1 build 001 Alpha<BR>&nbsp;- Issue: There are still some code not fully ported; search for "Aroush" to find those codes.<BR>&nbsp;- Issue: The NUnit test code has not been ported yet (the current code is still based on 1.4.3 final)</P>
<P><BR>15Dec05:<BR>&nbsp;- Release: Lucene.Net.1.4.3 final build 004 to the Apache incubator site<BR>&nbsp;- Clean-up: VS.Net project settings.</P>
<P><BR>21Nov05:<BR>&nbsp;- Release: Lucene.Net.1.4.3 final build 004<BR>&nbsp;- Fix: Fixed System.Object cast in Lucene.Net.Search.RangeQuery and Lucene.Net.Analysis.PorterStemFilter -- Thanks to Jason<BR>&nbsp;- Note: Moved project to Apache at: <A href="http://svn.apache.org/repos/asf/incubator/lucene.net/">http://svn.apache.org/repos/asf/incubator/lucene.net/</A></P>
<P><BR>23Oct05:<BR>&nbsp;- Release: Lucene.Net.1.4.3 final build 003<BR>&nbsp;- Fix: Memory leak -- Thanks to Marcus.<BR>&nbsp;- Fix: Remoting class and other misused of System.Object cast -- Thanks to Jason</P>
<P><BR>26May05:<BR>&nbsp;- Release: Lucene.Net.1.9 RC1 build 001 Alpha<BR>&nbsp;- Issue: There are still some code not fully ported; search for "Aroush" to find those codes.<BR>&nbsp;- Issue: The NUnit test code has not been ported yet (the current code is still based on 1.4.3 final)</P>
<P><BR>22Feb05:<BR>&nbsp;- Release: Lucene.Net.1.4.3 final build 002<BR>&nbsp;- Fix: Lucene.Net.Index.MultiReader.cs -- fixed GetIndexedFieldNames()</P>
<P><BR>13Feb05:<BR>&nbsp;- Release: Lucene.Net.1.4.3 final build 001<BR>&nbsp;- Fix: Lucene.Net.Search.TermQuery.Clone() -- was returning null, so removed it.<BR>&nbsp;- Fix: Lucene.Net.Documents.Field.cs -- replaced StreamReader() to TextReader()<BR>&nbsp;- Fix: Lucene.Net.Search.RemoteSearchable.cs -- added InitializeLifetimeService()<BR>&nbsp;- Fix: Lucene.Net.Document.DateField.cs -- fixed StringToDate()<BR>&nbsp;- Fix: Lucene.Net.Store.RAMDirectory.cs -- fixed RAMDirectory()<BR>&nbsp;- Issue: Demo.IndexHtml won't work due to some bug in the area of in-memory stream porting</P>
<P><BR>05Jan05:<BR>&nbsp;- Release: Lucene.Net.1.4.3 RC2 build 001<BR>&nbsp;- Fix: Lucene.Net.Search.Query.MergeBooleanQueries(); cast type was wrong.<BR>&nbsp;- Fix: Demo.IndexHtml; can index now but searching on the index file won't work, yet.</P>
<P><BR>21Dec04:<BR>&nbsp;- Release: Lucene.Net.1.4.3 RC1 build 001<BR>&nbsp;- Fix: Document.DateField.StringToTime() -- can't use System.Convert.ToInt64()</P>
<P><BR>06Dec04:<BR>&nbsp;- Release: Lucene.Net.1.4.3 beta build 001</P>
<P><BR>22Nov04:<BR>&nbsp;- Release: Lucene.Net.1.4.0 RC1 build 001<BR>&nbsp;- Fix: Changed some data types from 'int' to 'long'<BR>&nbsp;- Fix: changed some codes from base.Clone() to this.Clone()</P>
<P><BR>10Nov04:<BR>&nbsp;- Release: Lucene.Net.1.4.0 beta build 002 (targeted for "final")<BR>&nbsp;- Fix: Document.Fields() now returns an IEnumerable.&nbsp; Thanks to Marcus.<BR>&nbsp;- Fix: Use SupportClass.Single.Parse() to parse numbers ending with 'f'</P>
<P><BR>03Nov04:<BR>&nbsp;- Release: Lucene.Net.1.4.0 beta build 001<BR>&nbsp;- Release Note: 159 test run, 7 failed due to non-existing remote-Lucene setup<BR>&nbsp;- Failed Test:<BR>&nbsp;- Search.TestRemoteSearchable.*<BR>&nbsp;- Search.TestSort.TestNormalizedScores/TestRemoteCustomSort/TestRemoteSort<BR>&nbsp;- Fix: Removed 'ref' keyword usage from DateTime.<BR>&nbsp;- Port: TestQueryParser.cs -- done. thanks to Radu.<BR>&nbsp;- Fix: TestQueryParser.cs -- date-range formatting issues.<BR>&nbsp;- Fix: Lucene.Net.QueryParsers.GetRangeQuery() -- date-range formatting issues.<BR>&nbsp;- Fix: Use: System.IO.Path.Combine("path-1", "path-2") instead of "path-1" + "\\" + "path-2"</P>
<P><BR>29Oct04:<BR>&nbsp;- Port: Ported "test" out of ~160 tests, only ~14 fail.<BR>&nbsp;- Port: SupportClass.Character.ForDigit() -- done. thanks to Monsur<BR>&nbsp;- Port: Lucene.Net.Documents.DateField.cs -- done. thanks to Monsur<BR>&nbsp;- Fix: Lucene.Net.Search.BooleanScorer<BR>&nbsp;- Fix: Lucene.Net.Search.FilteredQuery<BR>&nbsp;- Fix: Lucene.Net.Search.SortScorers</P>
<P><BR>25Oct04:<BR>&nbsp;- Port: Ported "test" more than 2/3 of the NUnit test now pass<BR>&nbsp;- Fix: Fixed query (ToString()) formatting issue ("2" -&gt; "2.0") to pass NUnit test<BR>&nbsp;- Fix: Field items iteration</P>
<P><BR>19Oct04:<BR>&nbsp;- Fix: TermInfoReader.get_Renamed() -&gt; TermInfoReader.Get()<BR>&nbsp;- Fix: Searching now works</P>
<P><BR>18Oct04:<BR>&nbsp;- Fix: Indexing now works; indexing with Lucene.Net and searching on the same index via Jakarta Lucene<BR>&nbsp;- Fix: System.IO.TextReader.Read() returns 0 not -1 so check for '&lt;= 0'</P>
<P><BR>16Oct04:<BR>&nbsp;- Port: QueryTermVector.cs -- done. thanks to Monsur</P>
<P><BR>14Oct04:<BR>&nbsp;- Port: SpanNearQuery.cs -- done. thanks to Radu<BR>&nbsp;- Port: SpanOrQuery.cs -- done. thanks to Radu<BR>&nbsp;- Port: FSDirectory.cs -- done. thanks to Seth &amp; Bill<BR>&nbsp;- Port: IndexReader.cs -- done. thanks to Bill<BR>&nbsp;- Port: IndexWriter.cs -- done. thanks to Bill</P>
<P><BR>13Oct04 Lucene.Net.1.4-alpha build 002<BR>&nbsp;- Port: SpanNearQuery.cs &amp; SpanOrQuery.cs -- thanks to Radu<BR>&nbsp;- Fix: FSDirectory.cs, IndexReader.cs &amp; IndexWriter.cs -- thanks to Seth and Bill<BR>&nbsp;- Fix: FSDirectory.RenameFile()</P>
<P><BR>13Oct04 Lucene.Net.1.4-alpha build 002<BR>&nbsp;- Note: First effort to port Jakarta Lucene 1.4-final to C#<BR>&nbsp;- Note: Ported emements are: "src" and "demo"<BR>&nbsp;- Note: There are still outstanding un-ported code (12 in all) which are being looked at<BR>&nbsp;- Note: The code compiles and runs as is, but you can't index or search<BR>&nbsp;- Fix: PriorityQueue.Out() -&gt; PriorityQueue.Put()<BR>&nbsp;- Port: MultiReader.cs &amp; Document.cs -- thanks to Radu</P>
<P><BR>15Sep04 Lucene.Net.1.3-rc3 build 001<BR>&nbsp;- Revival of Lucene by repackaging 1.3rc1-001 and 1.3rc3-001</P>
<P><BR>29Sep04 Lucene.Net 1.3-rc3 build 001<BR>&nbsp;- initial release of jakarta lucene 1.3-rc3<BR>&nbsp;&nbsp;for changes: <A href="http://cvs.apache.org/viewcvs.cgi/*checkout*/jakarta-lucene/CHANGES.txt?rev=1.58">http://cvs.apache.org/viewcvs.cgi/*checkout*/jakarta-lucene/CHANGES.txt?rev=1.58</A> <BR>&nbsp;- fix: DateToString bug<BR>&nbsp; &nbsp;for more info: <A href="https://sourceforge.net/tracker/?func=detail&amp;atid=582307&amp;aid=910832&amp;group_id=87200">https://sourceforge.net/tracker/?func=detail&amp;atid=582307&amp;aid=910832&amp;group_id=87200</A> </P>
<P><BR>18Apr04&nbsp;Lucene.Net 1.3-rc2 build 002<BR>&nbsp;- add: demos, web demos and tests<BR>&nbsp;- fix: add FileAccess.Read key with FileMode.Open when open <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file stream for read<BR>&nbsp;- fix: name style updated <BR>&nbsp; &nbsp;&nbsp;Document.cs:GetField()<BR>&nbsp;&nbsp;&nbsp;QueryParser.cs: GenerateParseException()<BR>&nbsp;&nbsp;&nbsp;Search/BooleanQuery.cs:GetMaxClauseCount(),SetMaxClauseCount()<BR>&nbsp;&nbsp;- new: Lucene.Net National Language Support Pack (Lucene.Net.NLS Pack)<BR>&nbsp;&nbsp;&nbsp;support: Brazilian, CJK, Chinese, Czech,&nbsp; French and Dutch Analysers</P>
<P><BR>20Dec03 Lucene.Net 1.3-rc2 build 001<BR>&nbsp;- initial release for 1.3-rc2<BR>&nbsp;&nbsp; only Lucene.Net without demo and tests</P>
<P><BR>09Jan03 Lucene.Net 1.3-rc1 build 002<BR>&nbsp;- update: documentation and comments<BR>&nbsp;- bug fixed: wildcard search crash lucene - fixed<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; look TestQueryFSDirectory project for details<BR>&nbsp;- bug fixed: all tests and demos work </P>
<P><BR>08May03 Lucene.Net 1.3-rc1 build 001<BR>&nbsp;- initial release<BR></P> <img src ="http://www.cnblogs.com/birdshover/aggbug/1247029.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41271/" target="_blank">[新闻]盖茨官方否认天价租楼看奥运 纯属地产商炒作</a>]]></description></item><item><title>javascript 操作cookie类</title><link>http://www.cnblogs.com/birdshover/archive/2008/07/15/1243007.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 14 Jul 2008 16:12:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/07/15/1243007.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1243007.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/07/15/1243007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1243007.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1243007.html</trackback:ping><description><![CDATA[<DIV class=cnblogs_code><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #000000">String.prototype.Trim&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">()<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">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.replace(</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">^\s+</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">g,</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">).replace(</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">\s+$</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">g,</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">);<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"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;JSCookie()<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.GetCookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">(key)<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<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">var</SPAN><SPAN style="COLOR: #000000">&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;document.cookie;<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">var</SPAN><SPAN style="COLOR: #000000">&nbsp;cookieArray&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cookie.split(</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #000000">'</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">var</SPAN><SPAN style="COLOR: #000000">&nbsp;getvalue&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<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: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">cookieArray.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(cookieArray[i].Trim().substr(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,key.length)&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;key)<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getvalue&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cookieArray[i].Trim().substr(key.length&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">23</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;getvalue;<BR></SPAN><SPAN style="COLOR: #008080">24</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;};<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.GetChild&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">(cookiekey,childkey)<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">27</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;child&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.GetCookie(cookiekey);<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;childs&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;child.split(</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;getvalue&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">30</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">31</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;childs.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">32</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">33</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(childs[i].Trim().substr(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,childkey.length)&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;childkey)<BR></SPAN><SPAN style="COLOR: #008080">34</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">35</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getvalue&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;childs[i].Trim().substr(childkey.length&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">36</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">37</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">38</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">39</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;getvalue;<BR></SPAN><SPAN style="COLOR: #008080">40</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;};<BR></SPAN><SPAN style="COLOR: #008080">41</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.SetCookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">(key,value,expire,domain,path)<BR></SPAN><SPAN style="COLOR: #008080">42</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">43</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">44</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(key&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">45</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;key&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;value&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">;<BR></SPAN><SPAN style="COLOR: #008080">46</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(expire&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">47</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">expires=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;expire.toGMTString()&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">;<BR></SPAN><SPAN style="COLOR: #008080">48</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(domain&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">49</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">domain=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;domain&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">;<BR></SPAN><SPAN style="COLOR: #008080">50</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(path&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">51</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">path=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;path&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">;<BR></SPAN><SPAN style="COLOR: #008080">52</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cookie;<BR></SPAN><SPAN style="COLOR: #008080">53</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;};<BR></SPAN><SPAN style="COLOR: #008080">54</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.Expire&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">(key)<BR></SPAN><SPAN style="COLOR: #008080">55</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">56</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expire_time&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Date();<BR></SPAN><SPAN style="COLOR: #008080">57</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expire_time.setFullYear(expire_time.getFullYear()&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">58</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;key&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">=e;expires=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;expire_time&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"><BR></SPAN><SPAN style="COLOR: #008080">59</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.cookie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cookie;<BR></SPAN><SPAN style="COLOR: #008080">60</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">61</SPAN>&nbsp;<SPAN style="COLOR: #000000">}<BR><BR><BR>用法：<BR><STRONG>一、设置cookie</STRONG><BR>var cookie = new JSCookie();<BR>//普通设置<BR>cookie .SetCookie("key1","val1");<BR><BR>//过期时间为一年<BR>var expire_time = new Date();<BR>expire_time.setFullYear(expire_time.getFullYear() + 1);<BR>cookie .SetCookie("key2","val2",expire_time);<BR><BR>//设置域及路径，带过期时间<BR>cookie .SetCookie("key3","val3",expire_time,".cnblogs.com","/");<BR><BR>//设置带子键的cookie,子键分别是k1,k2,k3<BR>cookie .SetCookie("key4","k1=1&amp;k2=2&amp;k3=3");<BR><BR><STRONG>二、读取cookie</STRONG><BR>//简单获取<BR>cookie .GetCookie("key1");<BR>cookie .GetCookie("key2");<BR>cookie .GetCookie("key3");<BR>cookie .GetCookie("key4");<BR>//获取key4的子键k1值<BR>cookie .GetChild("key4","k1");<BR><BR><STRONG>三、删除</STRONG><BR>cookie .Expire("key1");<BR>cookie .Expire("key2");<BR>cookie .Expire("key3");<BR>cookie .Expire("key4");</SPAN></DIV><img src ="http://www.cnblogs.com/birdshover/aggbug/1243007.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41270/" target="_blank">[新闻]2008年7月24日IT博客精选</a>]]></description></item><item><title>C# 62进制类型实现</title><link>http://www.cnblogs.com/birdshover/archive/2008/07/04/1235543.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Fri, 04 Jul 2008 05:16:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/07/04/1235543.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1235543.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/07/04/1235543.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1235543.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1235543.html</trackback:ping><description><![CDATA[摘要: 构造62进制类型&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/07/04/1235543.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1235543.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41269/" target="_blank">[新闻]TOM在线与Joost正式组建合资公司</a>]]></description></item><item><title>话说passport的整合</title><link>http://www.cnblogs.com/birdshover/archive/2008/05/16/1200282.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Fri, 16 May 2008 03:51:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/05/16/1200282.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1200282.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/05/16/1200282.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1200282.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1200282.html</trackback:ping><description><![CDATA[摘要: 一、如果在a.com访问后，登陆，然后再访问b.com,如何保证这个时候b.com是登陆状态？<br>二、我已经有了3个系统，现在做了个passport，怎么整进去才好？&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/05/16/1200282.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1200282.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41268/" target="_blank">[新闻]财富:谷歌副总裁称其新闻搜索值1亿美元</a>]]></description></item><item><title>地震了</title><link>http://www.cnblogs.com/birdshover/archive/2008/05/12/1193823.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 12 May 2008 08:08:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/05/12/1193823.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1193823.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/05/12/1193823.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1193823.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1193823.html</trackback:ping><description><![CDATA[在35层楼上，正在开会。突然感觉头晕，就想，是不是昨天晚上睡太晚了。<BR><BR>同事老黄问我，你感觉楼在晃吗？才有猛然想到地震了。<img src ="http://www.cnblogs.com/birdshover/aggbug/1193823.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41267/" target="_blank">[新闻]Ubuntu创始人呼吁开发Linux桌面软件对抗苹果</a>]]></description></item><item><title>SharpCached小规模.Net缓存源码（VS2008项目）</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/29/1128383.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Fri, 28 Mar 2008 17:41:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/29/1128383.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1128383.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/29/1128383.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1128383.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1128383.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;border:1px dotted teal;width:200px;text-align:center;font-size:9pt;color:teal;"><img src="http://www.cnblogs.com/images/cnblogs_com/birdshover/SharpCached2.gif"></div><br/>SharpCached是用Remoting实现的IIS外缓存服务。<br/>相当于是MemCached的C#实现，不过是个迷你版的。因为有很多功能没有实现。&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/03/29/1128383.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1128383.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41266/" target="_blank">[新闻]央视国际联手微软打造数字奥运媒体平台</a>]]></description></item><item><title>话说搜索引擎分词</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/27/1125614.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Thu, 27 Mar 2008 08:52:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/27/1125614.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1125614.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/27/1125614.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1125614.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1125614.html</trackback:ping><description><![CDATA[现在网上有很多种分词方法。要精确必然损失性能，要性能那么精确度必然下降。<BR><BR>比如有句话:<BR><BR>"我是中国人"<BR><BR>看看这句话有多少种划分<BR><BR>
<TABLE height=324 cellSpacing=1 cellPadding=1 width=426 bgColor=#000000 border=0>
<TBODY>
<TR>
<TD width="20%" bgColor=#cccccc>我</TD>
<TD width="20%" bgColor=#cccccc>我是</TD>
<TD width="20%" bgColor=#ffffff>我是中</TD>
<TD width="20%" bgColor=#ffffff>我是中国</TD>
<TD width="20%" bgColor=#ffffff>我是中国人</TD></TR>
<TR>
<TD bgColor=#cccccc>&nbsp;</TD>
<TD bgColor=#cccccc>是</TD>
<TD bgColor=#ffffff>是中</TD>
<TD bgColor=#ffffff>是中国</TD>
<TD bgColor=#ffffff>是中国人</TD></TR>
<TR>
<TD bgColor=#ffffff>&nbsp;</TD>
<TD bgColor=#ffffff>&nbsp;</TD>
<TD bgColor=#cccccc>中</TD>
<TD bgColor=#cccccc>中国</TD>
<TD bgColor=#cccccc>中国人</TD></TR>
<TR>
<TD bgColor=#ffffff>&nbsp;</TD>
<TD bgColor=#ffffff>&nbsp;</TD>
<TD bgColor=#cccccc>&nbsp;</TD>
<TD bgColor=#cccccc>国</TD>
<TD bgColor=#cccccc>国人</TD></TR>
<TR>
<TD bgColor=#ffffff>&nbsp;</TD>
<TD bgColor=#ffffff>&nbsp;</TD>
<TD bgColor=#cccccc>&nbsp;</TD>
<TD bgColor=#cccccc>&nbsp;</TD>
<TD bgColor=#cccccc>人</TD></TR></TBODY></TABLE><BR>按照灰色区域划分，无疑是正确的。但是从全部分词划分上来说，分词的分法达到了 2^n种。<BR><BR>在我见过的分发中，很多种都是大同小异。而很多种都提到了一个概念——最大词匹配。<BR><BR>比如句子：“通信信息报：瑞星以技术和服务开拓网络安全市场”<BR><BR>按最大划分 ，"通信信息报"是一个名词，“瑞星”是一个名词，“网络安全市场”是一个名词。那么就是索引为：<BR><BR>"通信信息报 :&nbsp; 瑞星&nbsp; 以 技术 和 服务 开拓 网络安全市场"<BR><BR>这样理解上确实是好的，但是实际效果却未必如此。按照这种分词索引数据，将造成，搜索“通信”是搜索不到结果的。因为划分后并没有“通信”这个词，而只有“通信信息报”。<BR><BR>也许你会觉得这样就排除了 “通信”这个词对“通信信息报”这个词的干扰。但是在很多场合中，用户不可能那么精确得输入。比如，用户很可能搜索“通信报”。<BR><BR><STRONG>所以我认为搜索引擎中的分词技术，并不是要实现精确索引。中文分词最大的用处是排除特殊的干扰。<BR><BR></STRONG>比如还是这句话"通信信息报 :&nbsp; 瑞星&nbsp; 以 技术 和 服务 开拓 网络安全市场"，如果从词义匹配上划分，还可能被分成"通信信息报 :&nbsp; 瑞星&nbsp; 以 技术 和服 务 开拓 网络安全市场"。注意，这句话和“和服”完全无关，但是这种分法就把它给相关上了。<BR><BR>无疑这种歧义在整合海量数据的索引中将会产生非常多。消除特定词汇的歧义肯定是可以处理的，但是你无法知道整个过程中会产生多少歧义。比如百度，在这个词的消除歧义过程中，也会有失误的地方：<BR><BR><A onclick="return c('746',this.innerHTML,this.href,23)" href="http://www.nbhuahe.com/" target=_blank><FONT size=3>宁波华<FONT color=#c60a00>和服</FONT>装有限公司</FONT></A><BR><FONT size=-1>备案序号:浙ICP备06009618号... <BR><FONT color=#008000>www.nbhuahe.com/ 2K 2007-12-28 </FONT>- <A class=m href="http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73f6c8d974625838448e435061e5a72a6e667741f13a3b66b1677b83959fd8441&amp;p=882a964399dd1ab70be2957d4f5f98&amp;user=baidu" target=_blank><FONT color=#666666>百度快照</FONT></A> <BR><A class=m href="http://www.baidu.com/s?lm=0&amp;si=&amp;rn=10&amp;ie=gb2312&amp;ct=0&amp;wd=%BA%CD%B7%FE%20site%3Awww%2Enbhuahe%2Ecom+&amp;cl=2" target=_blank><FONT color=#666666>www.nbhuahe.com&nbsp;上的更多结果</FONT></A><BR><BR><A href="http://www.baidu.com/s?lm=0&amp;si=&amp;rn=10&amp;ie=gb2312&amp;ct=0&amp;wd=%BA%CD%B7%FE&amp;pn=20&amp;ver=0&amp;cn=baidu03&amp;cl=3">http://www.baidu.com/s?lm=0&amp;si=&amp;rn=10&amp;ie=gb2312&amp;ct=0&amp;wd=%BA%CD%B7%FE&amp;pn=20&amp;ver=0&amp;cn=baidu03&amp;cl=3</A><BR><BR></FONT><FONT size=3>现在我看到的最能识别歧义的方法，可能就是基于词频的统计。而不到一定的规模，没有足够的资金，肯定不会做这种事情去的。所以小的站内全文搜索引擎应该把更多的目光投到站内数据挖掘上面。不但要结果准，而且要结果多。<BR><BR><STRONG>我认为基于最大词匹配的最小切分可以在很大程度上提升搜索引擎的性能和搜索精确度。<BR><BR></STRONG>比如：“此次大会在香港特别行政区召开”<BR><BR>那么最大匹配就是“此次 大会 在 香港特别行政区 召开”<BR><BR>如果发现了最大匹配“香港特别行政区”，你不可能让别人搜索“香港”，而找不到这个结果。所以，有效的办法就是对最大匹配进行最小划分。划分为"香港 特别 行政 区"。<BR><BR>在搜索引擎中很多地方需要这么做。<BR><BR>当然，也可以用同意词的方法来解决.。但是定义同意词，无疑是一件长期而繁琐的事情。而且，对于“香港特别行政区”这样一个词，一般预期查询的词就是“香港”，划分就可以，没必要做同义词解析。<BR><BR>而对于“日本人常用的口头禅”，如果有人搜索“日语口头禅”，你认为是不是要匹配呢？最好当然是做下“日语”对“日本人”的同义词。而如果有人搜索“日语口头”，那么最小划分将会起到意向不到的作用。要知道，用户凭自己想出来的关键字，经常是不可预期的。<BR><BR>全文完。 by yurow<BR><BR>birdshover.cnblogs.com<BR><BR>___________________________________________________________________<BR>把文章转成随笔了，汗～～！</FONT><img src ="http://www.cnblogs.com/birdshover/aggbug/1125614.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41265/" target="_blank">[新闻]Google在线百科工具Knol今日正式上线</a>]]></description></item><item><title>SharpICTCLASAnalyzer——基于吕震宇老师翻译的SharpICTCLAS 1.0开发的Lucene.Net 2.1分词接口源码</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/26/1122305.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Tue, 25 Mar 2008 17:49:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/26/1122305.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1122305.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/26/1122305.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1122305.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1122305.html</trackback:ping><description><![CDATA[2008年3月26日 by yurow<BR><A href="/birdshover/">http://www.cnblogs.com/birdshover/</A><BR><BR>关于SharpICTCLAS 1.0的信息请参考博客园吕震宇老师的博客：<BR><A href="/zhenyulu/archive/2007/04/18/718383.html">http://www.cnblogs.com/zhenyulu/archive/2007/04/18/718383.html</A><BR><BR>以前不是做这个的，一直没在意，今天想想好长时间没上吕震宇老师的博客了，上去看看，看到了这个，呵呵。所以包装了一下。<BR><BR>为了增加Lucene.Net的分词接口，因此修改了部分源码。<BR><BR>1、增加了WordResult类sLocation变量，为了记住当前分词在文本中的位置；<BR>代码：<BR>
<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"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;WordResult<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">The&nbsp;word&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;sWord;<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;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">the&nbsp;POS&nbsp;of&nbsp;the&nbsp;word</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;nPOS;<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;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">The&nbsp;-log(frequency/MAX)</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">&nbsp;dValue;<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;sLocation;<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;}</SPAN></DIV><BR><BR>2、修改了Segment类GenerateWord方法；<BR>增加了下面的红色代码<BR>
<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"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(pCur&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WordResult&nbsp;item&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;WordResult();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.sWord&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pCur.theWord.sWord;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.nPOS&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pCur.theWord.nPOS;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.dValue&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pCur.theWord.dValue;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>item.sLocation&nbsp;</FONT></SPAN><SPAN style="COLOR: #000000"><FONT color=#ff0000>=</FONT></SPAN><SPAN style="COLOR: #000000"><FONT color=#ff0000>&nbsp;pCur.row;<BR></FONT></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;item;<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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_graphOptimum.SetElement(pCur.row,&nbsp;pCur.col,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ChainContent(item.dValue,&nbsp;item.nPOS,&nbsp;pCur.sWordInSegGraph));<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;pCur&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pCur.next;<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></DIV><BR>3、修正了一个因为空格造成的bug;<BR>红色部分是由<BR>
<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"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Position&nbsp;for&nbsp;the&nbsp;delimeters</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff"><FONT color=#ff0000>int</FONT></SPAN><SPAN style="COLOR: #000000"><FONT color=#ff0000>&nbsp;nType;<BR></FONT></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"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(sWord.Length&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #800080">0</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>nType&nbsp;</FONT></SPAN><FONT color=#ff0000><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Utility.charType(sWord.ToCharArray()[</SPAN><SPAN style="COLOR: #800080">0</SPAN></FONT><SPAN style="COLOR: #000000"><FONT color=#ff0000>]);<BR></FONT></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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Chinese&nbsp;word</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(nType&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;Predefine.CT_CHINESE)<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">Get&nbsp;the&nbsp;inner&nbsp;code&nbsp;of&nbsp;the&nbsp;first&nbsp;Chinese&nbsp;Char</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">byte</SPAN><SPAN style="COLOR: #000000">[]&nbsp;byteArray&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Utility.String2ByteArray(sWord);<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nId&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Utility.CC_ID(byteArray[</SPAN><SPAN style="COLOR: #800080">0</SPAN><SPAN style="COLOR: #000000">],&nbsp;byteArray[</SPAN><SPAN style="COLOR: #800080">1</SPAN><SPAN style="COLOR: #000000">]);<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN>&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">store&nbsp;the&nbsp;word,not&nbsp;store&nbsp;the&nbsp;first&nbsp;Chinese&nbsp;Char</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">17</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sWordRet&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sWord.Substring(</SPAN><SPAN style="COLOR: #800080">1</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">21</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Delimiter</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">22</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(nType&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;Predefine.CT_DELIMITER)<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">24</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nId&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #800080">3755</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">Get&nbsp;the&nbsp;inner&nbsp;code&nbsp;of&nbsp;the&nbsp;first&nbsp;Chinese&nbsp;Char</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">26</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sWordRet&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sWord;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">store&nbsp;the&nbsp;word,&nbsp;not&nbsp;store&nbsp;the&nbsp;first&nbsp;Chinese&nbsp;Char</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">27</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">30</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>&nbsp;</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT color=#ff0000>else</FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">31</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>&nbsp;nType&nbsp;</FONT></SPAN><FONT color=#ff0000><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #800080">0</SPAN><SPAN style="COLOR: #000000">;</SPAN></FONT></DIV><BR><BR>源码下载：<BR><A href="/Files/birdshover/SharpICTCLASAnalyzer.rar">http://www.cnblogs.com/Files/birdshover/SharpICTCLASAnalyzer.rar</A><BR><BR>下载完注意修改里面的字典路径在测试。<BR><BR>测试文本：<BR>
<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"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;testwords&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #800000">@"</SPAN><SPAN style="COLOR: #800000">1、修改了原子分词代码，使得对于全角字母有较好的识别<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #800000">2、修改了部分词性标注部分的代码<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #800000">因为词性标注部分的代码存在问题（应当是从ICTCLAS就存在的问题），主要表现在如果某个汉字没有词性，则在词性标注时会出现异常。例如：“这些是永远也没有现成的答桉的”其中“答案”写错了，当对这个有错别字的句子分词时，“桉”字是没有词性的，程序在此时将出现错误。<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #800000">目前的解决办法是对于这些没有词性的词在最终标注时标注为“字符串”。<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #800000">2、修改了地名识别的一些问题<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #800000">这个问题出现在Span类的PlaceRecognize方法中，nStart与nEnd在某些时候会计算错误。在测试版SharpICTCLAS中，句子“明定陵是明十三陵中第十座陵墓”在分词时会因为这个问题导致异常。&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #800000">3、修改了基于CCID的字符串比较代码<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">15</SPAN>&nbsp;<SPAN style="COLOR: #800000">原有代码没有很好考虑对全角、半角混合字符串的比较问题，现在修正过来了。<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">17</SPAN>&nbsp;<SPAN style="COLOR: #800000">4、修改了向词库添加词汇的代码<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">19</SPAN>&nbsp;<SPAN style="COLOR: #800000">原有代码存在错误，现在改正了过来。<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN>&nbsp;<SPAN style="COLOR: #800000"><BR></SPAN><SPAN style="COLOR: #008080">21</SPAN>&nbsp;<SPAN style="COLOR: #800000"></SPAN><SPAN style="COLOR: #800000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN></DIV>
<P><BR><BR>测试结果：<BR><BR>1&nbsp;0&nbsp;1<BR>、&nbsp;1&nbsp;2<BR>修改&nbsp;2&nbsp;4<BR>了&nbsp;4&nbsp;5<BR>原子&nbsp;5&nbsp;7<BR>分词&nbsp;7&nbsp;9<BR>代码&nbsp;9&nbsp;11<BR>，&nbsp;11&nbsp;12<BR>使得&nbsp;12&nbsp;14<BR>对于&nbsp;14&nbsp;16<BR>全角字&nbsp;16&nbsp;19<BR>母&nbsp;19&nbsp;20<BR>有&nbsp;20&nbsp;21<BR>较&nbsp;21&nbsp;22<BR>好&nbsp;22&nbsp;23<BR>的&nbsp;23&nbsp;24<BR>识别&nbsp;24&nbsp;26</P>
<P><BR>2&nbsp;26&nbsp;31<BR>、&nbsp;27&nbsp;28<BR>修改&nbsp;28&nbsp;30<BR>了&nbsp;30&nbsp;31<BR>部分&nbsp;31&nbsp;33<BR>词性&nbsp;33&nbsp;35<BR>标注&nbsp;35&nbsp;37<BR>部分&nbsp;37&nbsp;39<BR>的&nbsp;39&nbsp;40<BR>代码&nbsp;40&nbsp;42</P>
<P><BR>&nbsp;42&nbsp;46<BR>因为&nbsp;43&nbsp;45<BR>词性&nbsp;45&nbsp;47<BR>标注&nbsp;47&nbsp;49<BR>部分&nbsp;49&nbsp;51<BR>的&nbsp;51&nbsp;52<BR>代码&nbsp;52&nbsp;54<BR>存在&nbsp;54&nbsp;56<BR>问题&nbsp;56&nbsp;58<BR>（&nbsp;58&nbsp;59<BR>应当&nbsp;59&nbsp;61<BR>是&nbsp;61&nbsp;62<BR>从&nbsp;62&nbsp;63<BR>ICTCLAS&nbsp;63&nbsp;70<BR>就&nbsp;64&nbsp;65<BR>存在&nbsp;65&nbsp;67<BR>的&nbsp;67&nbsp;68<BR>问题&nbsp;68&nbsp;70<BR>）&nbsp;70&nbsp;71<BR>，&nbsp;71&nbsp;72<BR>主要&nbsp;72&nbsp;74<BR>表现&nbsp;74&nbsp;76<BR>在&nbsp;76&nbsp;77<BR>如果&nbsp;77&nbsp;79<BR>某个&nbsp;79&nbsp;81<BR>汉字&nbsp;81&nbsp;83<BR>没有&nbsp;83&nbsp;85<BR>词&nbsp;85&nbsp;86<BR>性&nbsp;86&nbsp;87<BR>，&nbsp;87&nbsp;88<BR>则&nbsp;88&nbsp;89<BR>在&nbsp;89&nbsp;90<BR>词性&nbsp;90&nbsp;92<BR>标注&nbsp;92&nbsp;94<BR>时&nbsp;94&nbsp;95<BR>会&nbsp;95&nbsp;96<BR>出现&nbsp;96&nbsp;98<BR>异常&nbsp;98&nbsp;100<BR>。&nbsp;100&nbsp;101<BR>例如&nbsp;101&nbsp;103<BR>：&nbsp;103&nbsp;104<BR>“&nbsp;104&nbsp;105<BR>这些&nbsp;105&nbsp;107<BR>是&nbsp;107&nbsp;108<BR>永远&nbsp;108&nbsp;110<BR>也&nbsp;110&nbsp;111<BR>没有&nbsp;111&nbsp;113<BR>现成&nbsp;113&nbsp;115<BR>的&nbsp;115&nbsp;116<BR>答&nbsp;116&nbsp;117<BR>桉&nbsp;117&nbsp;118<BR>的&nbsp;118&nbsp;119<BR>”&nbsp;119&nbsp;120<BR>其中&nbsp;120&nbsp;122<BR>“&nbsp;122&nbsp;123<BR>答案&nbsp;123&nbsp;125<BR>”&nbsp;125&nbsp;126<BR>写&nbsp;126&nbsp;127<BR>错&nbsp;127&nbsp;128<BR>了&nbsp;128&nbsp;129<BR>，&nbsp;129&nbsp;130<BR>当&nbsp;130&nbsp;131<BR>对&nbsp;131&nbsp;132<BR>这个&nbsp;132&nbsp;134<BR>有&nbsp;134&nbsp;135<BR>错别字&nbsp;135&nbsp;138<BR>的&nbsp;138&nbsp;139<BR>句子&nbsp;139&nbsp;141<BR>分词&nbsp;141&nbsp;143<BR>时&nbsp;143&nbsp;144<BR>，&nbsp;144&nbsp;145<BR>“&nbsp;145&nbsp;146<BR>桉&nbsp;146&nbsp;147<BR>”&nbsp;147&nbsp;148<BR>字&nbsp;148&nbsp;149<BR>是&nbsp;149&nbsp;150<BR>没有&nbsp;150&nbsp;152<BR>词性&nbsp;152&nbsp;154<BR>的&nbsp;154&nbsp;155<BR>，&nbsp;155&nbsp;156<BR>程序&nbsp;156&nbsp;158<BR>在&nbsp;158&nbsp;159<BR>此时&nbsp;159&nbsp;161<BR>将&nbsp;161&nbsp;162<BR>出现&nbsp;162&nbsp;164<BR>错误&nbsp;164&nbsp;166<BR>。&nbsp;166&nbsp;167</P>
<P><BR>&nbsp;167&nbsp;171<BR>目前&nbsp;168&nbsp;170<BR>的&nbsp;170&nbsp;171<BR>解决&nbsp;171&nbsp;173<BR>办法&nbsp;173&nbsp;175<BR>是&nbsp;175&nbsp;176<BR>对于&nbsp;176&nbsp;178<BR>这些&nbsp;178&nbsp;180<BR>没有&nbsp;180&nbsp;182<BR>词性&nbsp;182&nbsp;184<BR>的&nbsp;184&nbsp;185<BR>词&nbsp;185&nbsp;186<BR>在&nbsp;186&nbsp;187<BR>最终&nbsp;187&nbsp;189<BR>标注&nbsp;189&nbsp;191<BR>时&nbsp;191&nbsp;192<BR>标注&nbsp;192&nbsp;194<BR>为&nbsp;194&nbsp;195<BR>“&nbsp;195&nbsp;196<BR>字符串&nbsp;196&nbsp;199<BR>”&nbsp;199&nbsp;200<BR>。&nbsp;200&nbsp;201</P>
<P><BR>2&nbsp;201&nbsp;206<BR>、&nbsp;202&nbsp;203<BR>修改&nbsp;203&nbsp;205<BR>了&nbsp;205&nbsp;206<BR>地名&nbsp;206&nbsp;208<BR>识别&nbsp;208&nbsp;210<BR>的&nbsp;210&nbsp;211<BR>一些&nbsp;211&nbsp;213<BR>问题&nbsp;213&nbsp;215</P>
<P><BR>&nbsp;215&nbsp;219<BR>这个&nbsp;216&nbsp;218<BR>问题&nbsp;218&nbsp;220<BR>出现&nbsp;220&nbsp;222<BR>在&nbsp;222&nbsp;223<BR>Span&nbsp;223&nbsp;227<BR>类&nbsp;224&nbsp;225<BR>的&nbsp;225&nbsp;226<BR>PlaceRecognize&nbsp;226&nbsp;240<BR>方法&nbsp;227&nbsp;229<BR>中&nbsp;229&nbsp;230<BR>，&nbsp;230&nbsp;231<BR>nStart&nbsp;231&nbsp;237<BR>与&nbsp;232&nbsp;233<BR>nEnd&nbsp;233&nbsp;237<BR>在&nbsp;234&nbsp;235<BR>某些&nbsp;235&nbsp;237<BR>时候&nbsp;237&nbsp;239<BR>会&nbsp;239&nbsp;240<BR>计算&nbsp;240&nbsp;242<BR>错误&nbsp;242&nbsp;244<BR>。&nbsp;244&nbsp;245<BR>在&nbsp;245&nbsp;246<BR>测试&nbsp;246&nbsp;248<BR>版&nbsp;248&nbsp;249<BR>SharpICTCLAS&nbsp;249&nbsp;261<BR>中&nbsp;250&nbsp;251<BR>，&nbsp;251&nbsp;252<BR>句子&nbsp;252&nbsp;254<BR>“&nbsp;254&nbsp;255<BR>明定陵&nbsp;255&nbsp;258<BR>是&nbsp;258&nbsp;259<BR>明&nbsp;259&nbsp;260<BR>十三陵&nbsp;260&nbsp;263<BR>中&nbsp;263&nbsp;264<BR>第十&nbsp;264&nbsp;266<BR>座&nbsp;266&nbsp;267<BR>陵墓&nbsp;267&nbsp;269<BR>”&nbsp;269&nbsp;270<BR>在&nbsp;270&nbsp;271<BR>分词&nbsp;271&nbsp;273<BR>时&nbsp;273&nbsp;274<BR>会&nbsp;274&nbsp;275<BR>因为&nbsp;275&nbsp;277<BR>这个&nbsp;277&nbsp;279<BR>问题&nbsp;279&nbsp;281<BR>导致&nbsp;281&nbsp;283<BR>异常&nbsp;283&nbsp;285<BR>。&nbsp;285&nbsp;286</P>
<P><BR>3&nbsp;286&nbsp;291<BR>、&nbsp;287&nbsp;288<BR>修改&nbsp;288&nbsp;290<BR>了&nbsp;290&nbsp;291<BR>基于&nbsp;291&nbsp;293<BR>CCID&nbsp;293&nbsp;297<BR>的&nbsp;294&nbsp;295<BR>字符串&nbsp;295&nbsp;298<BR>比较&nbsp;298&nbsp;300<BR>代码&nbsp;300&nbsp;302</P>
<P><BR>&nbsp;302&nbsp;306<BR>原有&nbsp;303&nbsp;305<BR>代码&nbsp;305&nbsp;307<BR>没有&nbsp;307&nbsp;309<BR>很&nbsp;309&nbsp;310<BR>好&nbsp;310&nbsp;311<BR>考虑&nbsp;311&nbsp;313<BR>对&nbsp;313&nbsp;314<BR>全角&nbsp;314&nbsp;316<BR>、&nbsp;316&nbsp;317<BR>半&nbsp;317&nbsp;318<BR>角&nbsp;318&nbsp;319<BR>混合&nbsp;319&nbsp;321<BR>字符串&nbsp;321&nbsp;324<BR>的&nbsp;324&nbsp;325<BR>比较&nbsp;325&nbsp;327<BR>问题&nbsp;327&nbsp;329<BR>，&nbsp;329&nbsp;330<BR>现在&nbsp;330&nbsp;332<BR>修正&nbsp;332&nbsp;334<BR>过来&nbsp;334&nbsp;336<BR>了&nbsp;336&nbsp;337<BR>。&nbsp;337&nbsp;338</P>
<P><BR>4&nbsp;338&nbsp;343<BR>、&nbsp;339&nbsp;340<BR>修改&nbsp;340&nbsp;342<BR>了&nbsp;342&nbsp;343<BR>向&nbsp;343&nbsp;344<BR>词库&nbsp;344&nbsp;346<BR>添加&nbsp;346&nbsp;348<BR>词汇&nbsp;348&nbsp;350<BR>的&nbsp;350&nbsp;351<BR>代码&nbsp;351&nbsp;353</P>
<P><BR>&nbsp;353&nbsp;357<BR>原有&nbsp;354&nbsp;356<BR>代码&nbsp;356&nbsp;358<BR>存在&nbsp;358&nbsp;360<BR>错误&nbsp;360&nbsp;362<BR>，&nbsp;362&nbsp;363<BR>现在&nbsp;363&nbsp;365<BR>改正&nbsp;365&nbsp;367<BR>了&nbsp;367&nbsp;368<BR>过来&nbsp;368&nbsp;370<BR>。&nbsp;370&nbsp;371</P>
<P><BR>&nbsp;371&nbsp;375</P><img src ="http://www.cnblogs.com/birdshover/aggbug/1122305.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41264/" target="_blank">[新闻]马云致信阿里巴巴全体员工号召准备过冬</a>]]></description></item><item><title>基于.Net Framework 3.5的Lucene.Net 中文词组匹配分词器</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/25/1120517.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 24 Mar 2008 17:32:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/25/1120517.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1120517.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/25/1120517.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1120517.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1120517.html</trackback:ping><description><![CDATA[摘要: 可以自己看看是不是很高效。为了加快速度，尽量精简了算法。测试表明，精确度还可以。<br>由于没有实现完整的一套字典机制，而是普通的文本字典，所以就不提供完整源码下载了，贴出核心的源码。&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/03/25/1120517.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1120517.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41263/" target="_blank">[新闻]comScore 公布 6 月美国 TOP10 社会化网络排名</a>]]></description></item><item><title>.Net 3.5环境下常用数组性能测试</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/19/1113949.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Wed, 19 Mar 2008 15:31:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/19/1113949.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1113949.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/19/1113949.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1113949.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1113949.html</trackback:ping><description><![CDATA[摘要: 这件事情似乎很无聊，但是没人做，我来做下苦力吧。一、ArrayList (100W,1W),二、Hashtable (100W,1W),三、HashSet (100W,100W),四、List (100W,1W),五、Dictionary (100W,100W),六、Dictionary Linq查询 (100W,100W)&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/03/19/1113949.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1113949.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41262/" target="_blank">[新闻]万众期待 iPhone 3G 16GB上市两天破万</a>]]></description></item><item><title>控制‘控制台应用程序’的关闭操作</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/17/1110138.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 17 Mar 2008 08:48:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/17/1110138.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1110138.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/17/1110138.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1110138.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1110138.html</trackback:ping><description><![CDATA[摘要: 控制台程序足够简洁，但是，经常会点错而误关闭。而且，如果系统关闭，或者用户注销，这时候任务还没完成的话，前面的运算电费就白出了。<br><br>有没有办法和WinForm一样，对控制台的退出事件进行控制呢？有的！&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/03/17/1110138.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1110138.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41261/" target="_blank">[新闻]张宝全正式声明中国版HD-DVD涉嫌盗用EVD技术</a>]]></description></item><item><title>用IHttpModule解决输入中文地址乱码问题（二）</title><link>http://www.cnblogs.com/birdshover/archive/2008/03/14/1106333.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Fri, 14 Mar 2008 10:52:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/03/14/1106333.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1106333.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/03/14/1106333.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1106333.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1106333.html</trackback:ping><description><![CDATA[本文是<A id=AjaxHolder_ctl01_TitleUrl href="/birdshover/archive/2008/03/06/1092737.html"><FONT color=#0066aa>用IHttpModule解决输入中文地址乱码问题（一）</FONT></A> 的续文。<BR><BR>上文说到，需要对已有的地址进行GB2312编码，这样大大增加了工作量，有没更好的办法呢？<BR><BR>
<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"><SPAN style="COLOR: #008080">&nbsp;1</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">class</SPAN><SPAN style="COLOR: #000000">&nbsp;HookModule&nbsp;:&nbsp;IHttpModule<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">#region</SPAN><SPAN style="COLOR: #000000">&nbsp;IHttpModule&nbsp;成员</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;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Dispose()<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<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">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Init(HttpApplication&nbsp;context)<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.BeginRequest&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;EventHandler(context_BeginRequest);<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN>&nbsp;<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">void</SPAN><SPAN style="COLOR: #000000">&nbsp;context_BeginRequest(</SPAN><SPAN style="COLOR: #0000ff">object</SPAN><SPAN style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">19</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpApplication&nbsp;application&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(HttpApplication)sender;<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext&nbsp;context&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;application.Context;<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IdentifyEncoding&nbsp;ie&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;IdentifyEncoding();<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">23</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">24</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;rawurl&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;context.Request.RawUr