QueryTermVector.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using Analyzer = Lucene.Net.Analysis.Analyzer;
  18. using Token = Lucene.Net.Analysis.Token;
  19. using TokenStream = Lucene.Net.Analysis.TokenStream;
  20. using TermFreqVector = Lucene.Net.Index.TermFreqVector;
  21. namespace Lucene.Net.Search
  22. {
  23. /// <summary> 
  24. /// 
  25. /// 
  26. /// </summary>
  27. public class QueryTermVector : TermFreqVector
  28. {
  29. private System.String[] terms = new System.String[0];
  30. private int[] termFreqs = new int[0];
  31. public virtual System.String GetField()
  32. {
  33. return null;
  34. }
  35. /// <summary> </summary>
  36. /// <param name="queryTerms">The original list of terms from the query, can contain duplicates
  37. /// </param>
  38. public QueryTermVector(System.String[] queryTerms)
  39. {
  40. ProcessTerms(queryTerms);
  41. }
  42. public QueryTermVector(System.String queryString, Analyzer analyzer)
  43. {
  44. if (analyzer != null)
  45. {
  46. TokenStream stream = analyzer.TokenStream("", new System.IO.StringReader(queryString));
  47. if (stream != null)
  48. {
  49. Token next = null;
  50. System.Collections.ArrayList terms = new System.Collections.ArrayList();
  51. try
  52. {
  53. while ((next = stream.Next()) != null)
  54. {
  55. terms.Add(next.TermText());
  56. }
  57. ProcessTerms((System.String[]) terms.ToArray(typeof(System.String)));
  58. }
  59. catch (System.IO.IOException)
  60. {
  61. }
  62. }
  63. }
  64. }
  65. private void  ProcessTerms(System.String[] queryTerms)
  66. {
  67. if (queryTerms != null)
  68. {
  69. System.Array.Sort(queryTerms);
  70. System.Collections.IDictionary tmpSet = new System.Collections.Hashtable(queryTerms.Length);
  71. //filter out duplicates
  72. System.Collections.ArrayList tmpList = new System.Collections.ArrayList(queryTerms.Length);
  73. System.Collections.ArrayList tmpFreqs = new System.Collections.ArrayList(queryTerms.Length);
  74. int j = 0;
  75. for (int i = 0; i < queryTerms.Length; i++)
  76. {
  77. System.String term = queryTerms[i];
  78. System.Object tmpPosition = tmpSet[term];
  79. if (tmpPosition == null)
  80. {
  81. tmpSet[term] = (System.Int32) j++;
  82. tmpList.Add(term);
  83. tmpFreqs.Add(1);
  84. }
  85. else
  86. {
  87.                         System.Int32 position = (System.Int32) tmpSet[term];
  88. System.Int32 integer = (System.Int32) tmpFreqs[position];
  89. tmpFreqs[position] = (System.Int32) (integer + 1);
  90. }
  91. }
  92. terms = (System.String[]) tmpList.ToArray(typeof(System.String));
  93. //termFreqs = (int[])tmpFreqs.toArray(termFreqs);
  94. termFreqs = new int[tmpFreqs.Count];
  95. int i2 = 0;
  96. for (System.Collections.IEnumerator iter = tmpFreqs.GetEnumerator(); iter.MoveNext(); )
  97. {
  98. System.Int32 integer = (System.Int32) iter.Current;
  99. termFreqs[i2++] = integer;
  100. }
  101. }
  102. }
  103. public override System.String ToString()
  104. {
  105. System.Text.StringBuilder sb = new System.Text.StringBuilder();
  106. sb.Append('{');
  107. for (int i = 0; i < terms.Length; i++)
  108. {
  109. if (i > 0)
  110. sb.Append(", ");
  111. sb.Append(terms[i]).Append('/').Append(termFreqs[i]);
  112. }
  113. sb.Append('}');
  114. return sb.ToString();
  115. }
  116. public virtual int Size()
  117. {
  118. return terms.Length;
  119. }
  120. public virtual System.String[] GetTerms()
  121. {
  122. return terms;
  123. }
  124. public virtual int[] GetTermFrequencies()
  125. {
  126. return termFreqs;
  127. }
  128. public virtual int IndexOf(System.String term)
  129. {
  130. int res = System.Array.BinarySearch(terms, term);
  131. return res >= 0?res:- 1;
  132. }
  133. public virtual int[] IndexesOf(System.String[] terms, int start, int len)
  134. {
  135. int[] res = new int[len];
  136. for (int i = 0; i < len; i++)
  137. {
  138. res[i] = IndexOf(terms[i]);
  139. }
  140. return res;
  141. }
  142. }
  143. }