<span style="color: #000000;">();
datalist.Add(data);
<span style="color: #0000ff;">return<span style="color: #000000;"> CreateIndex(datalist);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> CreateIndex(IndexWriter writer,SearchResult data)
{
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">if</span> (data == <span style="color: #0000ff;">null</span>) <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
Document doc </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Document();
Type type </span>= data.GetType();<span style="color: #008000;">//</span><span style="color: #008000;">assembly.GetType("Reflect_test.PurchaseOrderHeadManageModel",true,true); </span><span style="color: #008000;">//</span><span style="color: #008000;">命名空间名称 + 类名
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建类的实例
</span><span style="color: #008000;">//</span><span style="color: #008000;">object obj = Activator.CreateInstance(type,true);
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取公共属性 </span>
PropertyInfo[] Propertys =<span style="color: #000000;"> type.GetProperties();
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < Propertys.Length; i++<span style="color: #000000;">)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">Propertys[i].SetValue(Propertys[i],i,null); </span><span style="color: #008000;">//</span><span style="color: #008000;">设置值</span>
PropertyInfo pi =<span style="color: #000000;"> Propertys[i];
</span><span style="color: #0000ff;">string</span> name =<span style="color: #000000;"> pi.Name;
</span><span style="color: #0000ff;">object</span> objval = pi.GetValue(data,<span style="color: #0000ff;">null</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">string</span> value = objval == <span style="color: #0000ff;">null</span> ? <span style="color: #800000;">""</span> : objval.ToString(); <span style="color: #008000;">//</span><span style="color: #008000;">值 </span>
<span style="color: #0000ff;">if</span> (name == <span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span> || name == <span style="color: #800000;">"</span><span style="color: #800000;">flag</span><span style="color: #800000;">"</span>)<span style="color: #008000;">//</span><span style="color: #008000;">id在写入索引时必是不分词,否则是模糊搜索和删除,会出现混乱</span>
<span style="color: #000000;"> {
doc.Add(<span style="color: #0000ff;">new Field(name,Field.Index.NOT_ANALYZED));<span style="color: #008000;">//<span style="color: #008000;">id不分词
<span style="color: #000000;"> }
<span style="color: #0000ff;">else<span style="color: #000000;">
{
doc.Add(<span style="color: #0000ff;">new<span style="color: #000000;"> Field(name,Field.Index.ANALYZED));
}
}
writer.AddDocument(doc);
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (System.IO.FileNotFoundException fnfe)
{
<span style="color: #0000ff;">throw<span style="color: #000000;"> fnfe;
}
<span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
}
<span style="color: #0000ff;">#endregion
<span style="color: #0000ff;">#region</span> 02在title和content字段中查询数据
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 在title和content字段中查询数据
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="keyword"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> List<SearchResult> Search(<span style="color: #0000ff;">string</span><span style="color: #000000;"> keyword)
{
</span><span style="color: #0000ff;">string</span>[] fileds = { <span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>,flag));
}
</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception ex)
{
Console.WriteLine(ex.Message);
}
counter</span>++<span style="color: #000000;">;
}
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">st.Stop();
</span><span style="color: #008000;">//</span><span style="color: #008000;">Response.Write("查询时间:" + st.ElapsedMilliseconds + " 毫秒<br/>");</span>
<span style="color: #000000;">
}
<span style="color: #0000ff;">#endregion
<span style="color: #0000ff;">#region</span> 03在不同的分类下再根据title和content字段中查询数据(分页)
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 在不同的类型下再根据title和content字段中查询数据(分页)
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="_flag"></span><span style="color: #008000;">分类,传空值查询全部</span><span style="color: #808080;"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="keyword"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="PageIndex"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="PageSize"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="TotalCount"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> List<SearchResult> Search(<span style="color: #0000ff;">string</span> _flag,<span style="color: #0000ff;">string</span> keyword,<span style="color: #0000ff;">int</span> PageIndex,<span style="color: #0000ff;">int</span><span style="color: #000000;"> PageSize)
{
</span><span style="color: #0000ff;">if</span> (PageIndex < <span style="color: #800080;">1</span>) PageIndex = <span style="color: #800080;">1</span><span style="color: #000000;">;
Stopwatch st </span>=<span style="color: #000000;"> Stopwatch.StartNew();
st.Start();
BooleanQuery bq </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> BooleanQuery();
</span><span style="color: #0000ff;">if</span> (_flag != <span style="color: #800000;">""</span><span style="color: #000000;">)
{
QueryParser qpflag </span>= <span style="color: #0000ff;">new</span> QueryParser(version,<span style="color: #800000;">"</span><span style="color: #800000;">flag</span><span style="color: #800000;">"</span><span style="color: #000000;">,analyzer);
Query qflag </span>=<span style="color: #000000;"> qpflag.Parse(_flag);
bq.Add(qflag,Occur.MUST);</span><span style="color: #008000;">//</span><span style="color: #008000;">与运算</span>
<span style="color: #000000;"> }
<span style="color: #0000ff;">if (keyword != <span style="color: #800000;">""<span style="color: #000000;">)
{
<span style="color: #0000ff;">string[] fileds = { <span style="color: #800000;">"<span style="color: #800000;">blogTag<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">title<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">" };<span style="color: #008000;">//<span style="color: #008000;">查询字段
QueryParser parser = <span style="color: #0000ff;">null;<span style="color: #008000;">//<span style="color: #008000;"> new QueryParser(version,field,analyzer);<span style="color: #008000;">//<span style="color: #008000;">一个字段查询
parser = <span style="color: #0000ff;">new MultiFieldQueryParser(version,analyzer);<span style="color: #008000;">//<span style="color: #008000;">多个字段查询
Query queryKeyword =<span style="color: #000000;"> parser.Parse(keyword);
bq.Add(queryKeyword,Occur.MUST);<span style="color: #008000;">//<span style="color: #008000;">与运算
<span style="color: #000000;"> }
TopScoreDocCollector collector </span>= TopScoreDocCollector.Create(PageIndex * PageSize,<span style="color: #0000ff;">false</span><span style="color: #000000;">);
IndexSearcher searcher </span>= <span style="color: #0000ff;">new</span> IndexSearcher(directory_luce,<span style="color: #0000ff;">true</span>);<span style="color: #008000;">//</span><span style="color: #008000;">true-表示只读</span>
<span style="color: #000000;"> searcher.Search(bq,collector);
</span><span style="color: #0000ff;">if</span> (collector == <span style="color: #0000ff;">null</span> || collector.TotalHits == <span style="color: #800080;">0</span><span style="color: #000000;">)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">TotalCount = 0;</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">int</span> start = PageSize * (PageIndex - <span style="color: #800080;">1</span><span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">结束数</span>
<span style="color: #0000ff;">int</span> limit =<span style="color: #000000;"> PageSize;
ScoreDoc[] hits </span>=<span style="color: #000000;"> collector.TopDocs(start,limit).ScoreDocs;
List</span><SearchResult> list = <span style="color: #0000ff;">new</span> List<SearchResult><span style="color: #000000;">();
</span><span style="color: #0000ff;">int</span> counter = <span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">TotalCount = collector.TotalHits;</span>
<span style="color: #000000;"> st.Stop();
<span style="color: #008000;">//<span style="color: #008000;">st.ElapsedMilliseconds;<span style="color: #008000;">//<span style="color: #008000;">毫秒
<span style="color: #0000ff;">foreach (ScoreDoc sd <span style="color: #0000ff;">in hits)<span style="color: #008000;">//<span style="color: #008000;">遍历搜索到的结果
<span style="color: #000000;"> {
<span style="color: #0000ff;">try<span style="color: #000000;">
{
Document doc =<span style="color: #000000;"> searcher.Doc(sd.Doc);
<span style="color: #0000ff;">int id = <span style="color: #0000ff;">int.Parse(doc.Get(<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">"<span style="color: #000000;">));
<span style="color: #0000ff;">string title = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">title<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">string content = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">string blogTag = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">blogTag<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">string url = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">url<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">int flag = <span style="color: #0000ff;">int.Parse(doc.Get(<span style="color: #800000;">"<span style="color: #800000;">flag<span style="color: #800000;">"<span style="color: #000000;">));
<span style="color: #0000ff;">int clickQuantity = <span style="color: #0000ff;">int.Parse(doc.Get(<span style="color: #800000;">"<span style="color: #800000;">clickQuantity<span style="color: #800000;">"<span style="color: #000000;">));
content =<span style="color: #000000;"> Highlight(keyword,content);
<span style="color: #008000;">//<span style="color: #008000;">string titlehighlight = Highlight(keyword,title);
<span style="color: #008000;">//<span style="color: #008000;">if (titlehighlight != "") title = titlehighlight;
list.Add(<span style="color: #0000ff;">new<span style="color: #000000;"> SearchResult(title,flag));
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception ex)
{
Console.WriteLine(ex.Message);
}
counter++<span style="color: #000000;">;
}
<span style="color: #0000ff;">return<span style="color: #000000;"> list;
}
}
<span style="color: #0000ff;">#endregion
<span style="color: #0000ff;">#region</span> 把content按照keywords进行高亮
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 把content按照keywords进行高亮
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="keywords"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="content"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">string</span> Highlight(<span style="color: #0000ff;">string</span> keywords,<span style="color: #0000ff;">string</span><span style="color: #000000;"> content)
{
SimpleHTMLFormatter simpleHTMLFormatter </span>= <span style="color: #0000ff;">new</span> PanGu.HighLight.SimpleHTMLFormatter(<span style="color: #800000;">"</span><span style="color: #800000;"><strong></span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;"></strong></span><span style="color: #800000;">"</span><span style="color: #000000;">);
Highlighter highlighter </span>= <span style="color: #0000ff;">new</span> PanGu.HighLight.Highlighter(simpleHTMLFormatter,<span style="color: #0000ff;">new</span><span style="color: #000000;"> Segment());
highlighter.FragmentSize </span>= <span style="color: #800080;">200</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> highlighter.GetBestFragment(keywords,content);
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> 04删除索引
<span style="color: #0000ff;">#region</span> 删除索引数据(根据id)
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 删除索引数据(根据id)
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="id"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> Delete(<span style="color: #0000ff;">string</span><span style="color: #000000;"> id)
{
</span><span style="color: #0000ff;">bool</span> IsSuccess = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
Term term </span>= <span style="color: #0000ff;">new</span> Term(<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span><span style="color: #000000;">,id);
IndexWriter writer </span>= <span style="color: #0000ff;">new</span> IndexWriter(directory_luce,IndexWriter.MaxFieldLength.LIMITED);
writer.DeleteDocuments(term); </span><span style="color: #008000;">//</span><span style="color: #008000;"> writer.DeleteDocuments(term)或者writer.DeleteDocuments(query); </span>
<span style="color: #000000;"> writer.Commit();
IsSuccess =<span style="color: #000000;"> writer.HasDeletions();
writer.Dispose();
<span style="color: #0000ff;">return<span style="color: #000000;"> IsSuccess;
}
<span style="color: #0000ff;">#endregion
<span style="color: #0000ff;">#region</span> 删除全部索引数据
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 删除全部索引数据
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> DeleteAll()
{
</span><span style="color: #0000ff;">bool</span> IsSuccess = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">
{
IndexWriter writer </span>= <span style="color: #0000ff;">new</span> IndexWriter(directory_luce,IndexWriter.MaxFieldLength.LIMITED);
writer.DeleteAll();
writer.Commit();
IsSuccess </span>=<span style="color: #000000;"> writer.HasDeletions();
writer.Dispose();
}
</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">
{
IsSuccess </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> IsSuccess;
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> 分词测试
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 分词测试
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="keyword"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Token(<span style="color: #0000ff;">string</span><span style="color: #000000;"> keyword)
{
</span><span style="color: #0000ff;">string</span> ret = <span style="color: #800000;">""</span><span style="color: #000000;">;
System.IO.StringReader reader </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> System.IO.StringReader(keyword);
Lucene.Net.Analysis.TokenStream ts </span>=<span style="color: #000000;"> analyzer.TokenStream(keyword,reader);
</span><span style="color: #0000ff;">bool</span> hasNext =<span style="color: #000000;"> ts.IncrementToken();
Lucene.Net.Analysis.Tokenattributes.ITermAttribute ita;
</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (hasNext)
{
ita </span>= ts.GetAttribute<Lucene.Net.Analysis.Tokenattributes.ITermAttribute><span style="color: #000000;">();
ret </span>+= ita.Term + <span style="color: #800000;">"</span><span style="color: #800000;">|</span><span style="color: #800000;">"</span><span style="color: #000000;">;
hasNext </span>=<span style="color: #000000;"> ts.IncrementToken();
}
ts.CloneAttributes();
reader.Close();
analyzer.Close();
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> ret;
}
</span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">
}</span></pre>