blob: 0a7d0444b0ad3ecc6c372b77533c1113551ec20a [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.3"/>
<title>Lucene.Net: contrib/Highlighter/Highlighter.cs Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="lucene-net-icon-128x128.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">Lucene.Net
&#160;<span id="projectnumber">3.0.3</span>
</div>
<div id="projectbrief">Lucene.Net is a .NET port of the Java Lucene Indexing Library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.3 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="Index.html"><span>Main&#160;Page</span></a></li>
<li><a href="namespaces.html"><span>Packages</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>File&#160;Members</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Properties</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_3a8d697be1e2feab9f01acc78e9570fb.html">contrib</a></li><li class="navelem"><a class="el" href="dir_65044b083e4dd72dcfe0705fe45ee371.html">Highlighter</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">Highlighter.cs</div> </div>
</div><!--header-->
<div class="contents">
<a href="_highlighter_8cs.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one or more</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * contributor license agreements. See the NOTICE file distributed with</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * this work for additional information regarding copyright ownership.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * The ASF licenses this file to You under the Apache License, Version 2.0</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * (the &quot;License&quot;); you may not use this file except in compliance with</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * the License. You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * limitations under the License.</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">using</span> System;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">using</span> System.Collections.Generic;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">using</span> System.IO;</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">using</span> System.Linq;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">using</span> System.Text;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="keyword">using</span> Lucene.Net.Analysis;</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">using</span> Lucene.Net.Analysis.Tokenattributes;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">using</span> Lucene.Net.Util;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">namespace </span>Lucene.Net.Search.Highlight</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;{</div>
<div class="line"><a name="l00034"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html"> 34</a></span>&#160; <span class="keyword">public</span> <span class="keyword">class </span><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html" title="Class used to markup highlighted terms found in the best sections of a text, using configurable IFrag...">Highlighter</a></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; {</div>
<div class="line"><a name="l00036"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a3711a119f455fbfc463d5ba2c8ce239b"> 36</a></span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> DEFAULT_MAX_CHARS_TO_ANALYZE = 50*1024;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span> _maxDocCharsToAnalyze = DEFAULT_MAX_CHARS_TO_ANALYZE;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keyword">private</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_formatter.html" title="Processes terms found in the original text, typically by applying some form of mark-up to highlight t...">IFormatter</a> _formatter;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keyword">private</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_encoder.html" title="Encodes original text. The IEncoder works with the Formatter to generate the output.">IEncoder</a> _encoder;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keyword">private</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_fragmenter.html" title="Implements the policy for breaking text into multiple fragments for consideration by the Highlighter ...">IFragmenter</a> _textFragmenter = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_simple_fragmenter.html" title="IFragmenter implementation which breaks text up into same-size fragments with no concerns over spotti...">SimpleFragmenter</a>();</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keyword">private</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_scorer.html" title="Adds to the score for a fragment based on its tokens">IScorer</a> _fragmentScorer = null;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div>
<div class="line"><a name="l00044"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a6a18f8599526b2dc936c4cc9717428e9"> 44</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html" title="Class used to markup highlighted terms found in the best sections of a text, using configurable IFrag...">Highlighter</a>(<a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_scorer.html" title="Adds to the score for a fragment based on its tokens">IScorer</a> fragmentScorer)</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; : this(new <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_simple_h_t_m_l_formatter.html" title="Simple IFormatter implementation to highlight terms with a pre and post tag">SimpleHTMLFormatter</a>(), fragmentScorer)</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; {</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; }</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;</div>
<div class="line"><a name="l00050"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a939b9065e0cc7c03aba31b14422c1063"> 50</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html" title="Class used to markup highlighted terms found in the best sections of a text, using configurable IFrag...">Highlighter</a>(<a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_formatter.html" title="Processes terms found in the original text, typically by applying some form of mark-up to highlight t...">IFormatter</a> formatter, <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_scorer.html" title="Adds to the score for a fragment based on its tokens">IScorer</a> fragmentScorer)</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; : this(formatter, new <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_default_encoder.html" title="Simple IEncoder implementation that does not modify the output">DefaultEncoder</a>(), fragmentScorer)</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; }</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;</div>
<div class="line"><a name="l00056"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#afd22514f5c24abc730ff7be8bbec7691"> 56</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html" title="Class used to markup highlighted terms found in the best sections of a text, using configurable IFrag...">Highlighter</a>(<a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_formatter.html" title="Processes terms found in the original text, typically by applying some form of mark-up to highlight t...">IFormatter</a> formatter, <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_encoder.html" title="Encodes original text. The IEncoder works with the Formatter to generate the output.">IEncoder</a> encoder, <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_scorer.html" title="Adds to the score for a fragment based on its tokens">IScorer</a> fragmentScorer)</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; {</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; _formatter = formatter;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; _encoder = encoder;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; _fragmentScorer = fragmentScorer;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; }</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;</div>
<div class="line"><a name="l00072"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a8d0a851192bdf129e20938adb84520f5"> 72</a></span>&#160; <span class="keyword">public</span> String GetBestFragment(<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_analyzer.html" title="An Analyzer builds TokenStreams, which analyze text. It thus represents a policy for extracting index...">Analyzer</a> analyzer, String fieldName, String text)</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> tokenStream = analyzer.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_analyzer.html#ac031bae47f64e6bbe2117c991996f5fc" title="Creates a TokenStream which tokenizes all the text in the provided Reader. Must be able to handle nul...">TokenStream</a>(fieldName, <span class="keyword">new</span> StringReader(text));</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">return</span> GetBestFragment(tokenStream, text);</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; }</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div>
<div class="line"><a name="l00094"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a81a4c9a57a43f26b7e0c3b929bac6269"> 94</a></span>&#160; <span class="keyword">public</span> String GetBestFragment(<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> tokenStream, String text)</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; String[] results = GetBestFragments(tokenStream, text, 1);</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">if</span> (results.Length &gt; 0)</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; {</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">return</span> results[0];</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordflow">return</span> null;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; }</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;</div>
<div class="line"><a name="l00114"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a26632efddcf495c94833113abc037122"> 114</a></span>&#160; <span class="keyword">public</span> String[] GetBestFragments(</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_analyzer.html" title="An Analyzer builds TokenStreams, which analyze text. It thus represents a policy for extracting index...">Analyzer</a> analyzer,</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; String fieldName,</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; String text,</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordtype">int</span> maxNumFragments)</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; {</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> tokenStream = analyzer.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_analyzer.html#ac031bae47f64e6bbe2117c991996f5fc" title="Creates a TokenStream which tokenizes all the text in the provided Reader. Must be able to handle nul...">TokenStream</a>(fieldName, <span class="keyword">new</span> StringReader(text));</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">return</span> GetBestFragments(tokenStream, text, maxNumFragments);</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div>
<div class="line"><a name="l00136"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a65903721c3dae991f3814047bdcedceb"> 136</a></span>&#160; <span class="keyword">public</span> String[] GetBestFragments(<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> tokenStream, String text, <span class="keywordtype">int</span> maxNumFragments)</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; {</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; maxNumFragments = Math.Max(1, maxNumFragments); <span class="comment">//sanity check</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html" title="Low-level class used to record information about a section of a document with a score. ">TextFragment</a>[] frag = GetBestTextFragments(tokenStream, text, <span class="keyword">true</span>, maxNumFragments);</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="comment">//Get text</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; var fragTexts = <span class="keyword">new</span> List&lt;String&gt;();</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; frag.Length; i++)</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; {</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">if</span> ((frag[i] != null) &amp;&amp; (frag[i].<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html#a8ade902d892bad5ff7a30465bc9e440f">Score</a> &gt; 0))</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; {</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; fragTexts.Add(frag[i].ToString());</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; }</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; }</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordflow">return</span> fragTexts.ToArray();</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; }</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;</div>
<div class="line"><a name="l00159"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#adba58146b74b0d4539cef35c2080e90b"> 159</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html" title="Low-level class used to record information about a section of a document with a score. ">TextFragment</a>[] GetBestTextFragments(</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> tokenStream,</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; String text,</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordtype">bool</span> mergeContiguousFragments,</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordtype">int</span> maxNumFragments)</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; {</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; var docFrags = <span class="keyword">new</span> List&lt;TextFragment&gt;();</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; var newText = <span class="keyword">new</span> StringBuilder();</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; var termAtt = tokenStream.AddAttribute&lt;<a class="code" href="interface_lucene_1_1_net_1_1_analysis_1_1_tokenattributes_1_1_i_term_attribute.html" title="The term text of a Token.">ITermAttribute</a>&gt;();</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; var offsetAtt = tokenStream.AddAttribute&lt;<a class="code" href="interface_lucene_1_1_net_1_1_analysis_1_1_tokenattributes_1_1_i_offset_attribute.html" title="The start and end character offset of a Token. ">IOffsetAttribute</a>&gt;();</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; tokenStream.AddAttribute&lt;<a class="code" href="interface_lucene_1_1_net_1_1_analysis_1_1_tokenattributes_1_1_i_position_increment_attribute.html" title="The positionIncrement determines the position of this token relative to the previous Token in a Token...">IPositionIncrementAttribute</a>&gt;();</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; tokenStream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#af7c4a3464dc78b1d0451492d9c520965" title="Resets this stream to the beginning. This is an optional operation, so subclasses may or may not impl...">Reset</a>();</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; var currentFrag = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html" title="Low-level class used to record information about a section of a document with a score. ">TextFragment</a>(newText, newText.Length, docFrags.Count);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; var newStream = _fragmentScorer.Init(tokenStream);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> (newStream != null)</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; {</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; tokenStream = newStream;</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; }</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; _fragmentScorer.StartFragment(currentFrag);</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; docFrags.Add(currentFrag);</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; var fragQueue = <span class="keyword">new</span> FragmentQueue(maxNumFragments);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">try</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; {</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; String tokenText;</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordtype">int</span> startOffset;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordtype">int</span> endOffset;</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordtype">int</span> lastEndOffset = 0;</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; _textFragmenter.Start(text, tokenStream);</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; var tokenGroup = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_token_group.html" title="One, or several overlapping tokens, along with the score(s) and the scope of the original text ...">TokenGroup</a>(tokenStream);</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">bool</span> next = tokenStream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#a358a544108511440a57b134e722f6027" title="Consumers (i.e., IndexWriter) use this method to advance the stream to the next token. Implementing classes must implement this method and update the appropriate Util.Attributes with the attributes of the next token.">IncrementToken</a>();</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; next &amp;&amp; (offsetAtt.StartOffset &lt; _maxDocCharsToAnalyze);</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; next = tokenStream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#a358a544108511440a57b134e722f6027" title="Consumers (i.e., IndexWriter) use this method to advance the stream to the next token. Implementing classes must implement this method and update the appropriate Util.Attributes with the attributes of the next token.">IncrementToken</a>())</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; {</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordflow">if</span> ((offsetAtt.EndOffset &gt; text.Length)</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; ||</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; (offsetAtt.StartOffset &gt; text.Length)</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; )</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; {</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_invalid_token_offsets_exception.html">InvalidTokenOffsetsException</a>(<span class="stringliteral">&quot;Token &quot;</span> + termAtt.Term</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; + <span class="stringliteral">&quot; exceeds length of provided text sized &quot;</span> + text.Length);</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; }</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keywordflow">if</span> ((tokenGroup.NumTokens &gt; 0) &amp;&amp; (tokenGroup.IsDistinct()))</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; {</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">//the current token is distinct from previous tokens -</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">// markup the cached token group info</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; startOffset = tokenGroup.MatchStartOffset;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; endOffset = tokenGroup.MatchEndOffset;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; tokenText = text.Substring(startOffset, endOffset - startOffset);</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; String markedUpText = _formatter.HighlightTerm(_encoder.EncodeText(tokenText), tokenGroup);</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="comment">//store any whitespace etc from between this and last group</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">if</span> (startOffset &gt; lastEndOffset)</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; newText.Append(_encoder.EncodeText(text.Substring(lastEndOffset, startOffset - lastEndOffset)));</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; newText.Append(markedUpText);</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; lastEndOffset = Math.Max(endOffset, lastEndOffset);</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; tokenGroup.Clear();</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="comment">//check if current token marks the start of a new fragment</span></div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordflow">if</span> (_textFragmenter.IsNewFragment())</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; {</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; currentFrag.Score = _fragmentScorer.FragmentScore;</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="comment">//record stats for a new fragment</span></div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; currentFrag.TextEndPos = newText.Length;</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; currentFrag = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html" title="Low-level class used to record information about a section of a document with a score. ">TextFragment</a>(newText, newText.Length, docFrags.Count);</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; _fragmentScorer.StartFragment(currentFrag);</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; docFrags.Add(currentFrag);</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; }</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; tokenGroup.AddToken(_fragmentScorer.GetTokenScore());</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="comment">// if(lastEndOffset&gt;maxDocBytesToAnalyze)</span></div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="comment">// {</span></div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="comment">// break;</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="comment">// }</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; }</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; currentFrag.Score = _fragmentScorer.FragmentScore;</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">if</span> (tokenGroup.NumTokens &gt; 0)</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; {</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="comment">//flush the accumulated text (same code as in above loop)</span></div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; startOffset = tokenGroup.MatchStartOffset;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; endOffset = tokenGroup.MatchEndOffset;</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; tokenText = text.Substring(startOffset, endOffset - startOffset);</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; var markedUpText = _formatter.HighlightTerm(_encoder.EncodeText(tokenText), tokenGroup);</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="comment">//store any whitespace etc from between this and last group</span></div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">if</span> (startOffset &gt; lastEndOffset)</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; newText.Append(_encoder.EncodeText(text.Substring(lastEndOffset, startOffset - lastEndOffset)));</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; newText.Append(markedUpText);</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; lastEndOffset = Math.Max(lastEndOffset, endOffset);</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; }</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="comment">//Test what remains of the original text beyond the point where we stopped analyzing </span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">if</span> (</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// if there is text beyond the last token considered..</span></div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; (lastEndOffset &lt; text.Length)</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; &amp;&amp;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// and that text is not too large...</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; (text.Length &lt;= _maxDocCharsToAnalyze)</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; )</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; {</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">//append it to the last fragment</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; newText.Append(_encoder.EncodeText(text.Substring(lastEndOffset)));</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; }</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; currentFrag.TextEndPos = newText.Length;</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">//sort the most relevant sections of the text</span></div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keywordflow">foreach</span> (var f <span class="keywordflow">in</span> docFrags)</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; {</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; currentFrag = f;</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">//If you are running with a version of Lucene before 11th Sept 03</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// you do not have PriorityQueue.insert() - so uncomment the code below</span></div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;<span class="comment"> if (currentFrag.getScore() &gt;= minScore)</span></div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;<span class="comment"> {</span></div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="comment"> fragQueue.put(currentFrag);</span></div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;<span class="comment"> if (fragQueue.size() &gt; maxNumFragments)</span></div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;<span class="comment"> { // if hit queue overfull</span></div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;<span class="comment"> fragQueue.pop(); // remove lowest in hit queue</span></div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160;<span class="comment"> minScore = ((TextFragment) fragQueue.top()).getScore(); // reset minScore</span></div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;<span class="comment"> }</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;<span class="comment"> }</span></div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="comment">//The above code caused a problem as a result of Christoph Goller&#39;s 11th Sept 03</span></div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="comment">//fix to PriorityQueue. The correct method to use here is the new &quot;insert&quot; method</span></div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="comment">// USE ABOVE CODE IF THIS DOES NOT COMPILE!</span></div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; fragQueue.InsertWithOverflow(currentFrag);</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; }</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160;</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="comment">//return the most relevant fragments</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; var frag = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html" title="Low-level class used to record information about a section of a document with a score. ">TextFragment</a>[fragQueue.Size()];</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = frag.Length - 1; i &gt;= 0; i--)</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; {</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; frag[i] = fragQueue.Pop();</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; }</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="comment">//merge any contiguous fragments to improve readability</span></div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">if</span> (mergeContiguousFragments)</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; {</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; MergeContiguousFragments(frag);</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; frag = frag.Where(t =&gt; (t != null) &amp;&amp; (t.Score &gt; 0)).ToArray();</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; }</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">return</span> frag;</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; }</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">finally</span></div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; {</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">if</span> (tokenStream != null)</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; {</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">try</span></div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; {</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; tokenStream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#a5f66ac4c37218611b4a13f81f98332cd" title="Releases resources associated with this stream. ">Close</a>();</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; }</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">catch</span> (Exception)</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; {</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; }</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; }</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; }</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keyword">private</span> <span class="keywordtype">void</span> MergeContiguousFragments(<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html" title="Low-level class used to record information about a section of a document with a score. ">TextFragment</a>[] frag)</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; {</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordtype">bool</span> mergingStillBeingDone;</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordflow">if</span> (frag.Length &gt; 1)</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">do</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; {</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; mergingStillBeingDone = <span class="keyword">false</span>; <span class="comment">//initialise loop control flag</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">//for each fragment, scan other frags looking for contiguous blocks</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; frag.Length; i++)</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; {</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">if</span> (frag[i] == null)</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; {</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; }</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="comment">//merge any contiguous blocks </span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x = 0; x &lt; frag.Length; x++)</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordflow">if</span> (frag[x] == null)</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; {</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; }</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">if</span> (frag[i] == null)</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; {</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; }</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; TextFragment frag1 = null;</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; TextFragment frag2 = null;</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordtype">int</span> frag1Num = 0;</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordtype">int</span> frag2Num = 0;</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordtype">int</span> bestScoringFragNum;</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="keywordtype">int</span> worstScoringFragNum;</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">//if blocks are contiguous....</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (frag[i].Follows(frag[x]))</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; {</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; frag1 = frag[x];</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; frag1Num = x;</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; frag2 = frag[i];</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; frag2Num = i;</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (frag[x].Follows(frag[i]))</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; frag1 = frag[i];</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; frag1Num = i;</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; frag2 = frag[x];</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; frag2Num = x;</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; }</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">//merging required..</span></div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (frag1 != null)</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; {</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">if</span> (frag1.Score &gt; frag2.Score)</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; {</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; bestScoringFragNum = frag1Num;</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; worstScoringFragNum = frag2Num;</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; {</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; bestScoringFragNum = frag2Num;</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; worstScoringFragNum = frag1Num;</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; }</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; frag1.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_text_fragment.html#afba21fd4dff71ada184fdb680474c2b2">Merge</a>(frag2);</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; frag[worstScoringFragNum] = null;</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; mergingStillBeingDone = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; frag[bestScoringFragNum] = frag1;</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; }</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; }</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; }</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; } <span class="keywordflow">while</span> (mergingStillBeingDone);</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; }</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;</div>
<div class="line"><a name="l00417"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#ab6b727708a6c68cfa6fe0e253667aa7b"> 417</a></span>&#160; <span class="keyword">public</span> String GetBestFragments(</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> tokenStream,</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; String text,</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordtype">int</span> maxNumFragments,</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; String separator)</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; {</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordtype">string</span>[] sections = GetBestFragments(tokenStream, text, maxNumFragments);</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; StringBuilder result = <span class="keyword">new</span> StringBuilder();</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; sections.Length; i++)</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; {</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (i &gt; 0)</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; result.Append(separator);</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; result.Append(sections[i]);</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; }</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">return</span> result.ToString();</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; }</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> MaxDocCharsToAnalyze</div>
<div class="line"><a name="l00437"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a75f8171d3baa3baa9f871fbc1636d9c1"> 437</a></span>&#160; {</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> _maxDocCharsToAnalyze; }</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keyword">set</span> { this._maxDocCharsToAnalyze = value; }</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160;</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keyword">public</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_fragmenter.html" title="Implements the policy for breaking text into multiple fragments for consideration by the Highlighter ...">IFragmenter</a> TextFragmenter</div>
<div class="line"><a name="l00444"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a55287b5845ede3f4294725b5b2fc44e0"> 444</a></span>&#160; {</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> _textFragmenter; }</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keyword">set</span> { _textFragmenter = value; }</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keyword">public</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_scorer.html" title="Adds to the score for a fragment based on its tokens">IScorer</a> FragmentScorer</div>
<div class="line"><a name="l00450"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a7fb5f9f79c283844465ba7b2608af48f"> 450</a></span>&#160; {</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> _fragmentScorer; }</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keyword">set</span> { _fragmentScorer = value; }</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160;</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <span class="keyword">public</span> <a class="code" href="interface_lucene_1_1_net_1_1_search_1_1_highlight_1_1_i_encoder.html" title="Encodes original text. The IEncoder works with the Formatter to generate the output.">IEncoder</a> Encoder</div>
<div class="line"><a name="l00456"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_search_1_1_highlight_1_1_highlighter.html#a36eee1a65f0c2a65219d2dbf3891b36f"> 456</a></span>&#160; {</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> _encoder; }</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keyword">set</span> { this._encoder = value; }</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; }</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; }</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keyword">internal</span> <span class="keyword">class </span>FragmentQueue : <a class="code" href="namespace_spell_checker_1_1_net_1_1_search_1_1_spell.html#a050da50134c60f7d9891255871a07fc1">PriorityQueue</a>&lt;TextFragment&gt;</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; {</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keyword">public</span> FragmentQueue(<span class="keywordtype">int</span> size)</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; {</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; Initialize(size);</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; }</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">bool</span> LessThan(TextFragment fragA, TextFragment fragB)</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; {</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (fragA.Score == fragB.Score)</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordflow">return</span> fragA.FragNum &gt; fragB.FragNum;</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="keywordflow">return</span> fragA.Score &lt; fragB.Score;</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; }</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; }</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Jan 3 2013 02:12:43 for Lucene.Net by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.3
</small></address>
</body>
</html>