解决方案 »
- 将参数值从 String 转换到 Byte[] 失败。<三层架构,代码生成器>
- vs2005 GridView使用求助
- Asp.net(c#)如何实现域名查询
- 迷茫啊,下一步学什么
- gridview
- 问一个刷新问题,图片列表中,我更新其中一张图,文件名和路径都没变化,就是图换一张,我返回图列表时,被更新图还是老图,一定要重新栽入或刷新才会显示新的,如何。。
- 如何应用window.open()
- 将一段Excel内容Copy 至Html编辑器(FckEditor)后,其原来的居中对齐全部变成左对齐,
- 关于treeview的一个简单问题
- 求教!数字 XX.XX 的正则表达式。在线等待!
- 工作上的求帮助,关于asp.net
- DataContract 问题
namespace PatentLucenceDemo.Web.测试搜索分页
{
public partial class SearchPaged : System.Web.UI.Page
{
BLL.Aspatent bllasp = new BLL.Aspatent();
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (!string.IsNullOrEmpty(Request.Form["create"]))
{
CreateContent();
}
if (!string.IsNullOrEmpty(Request.Form["search"]))
{
string content = Request.Form["content"];
string date1 = Convert.ToDateTime(Request.Form["date1"]).ToString("yyyyMMdd");
string date2 = Convert.ToDateTime(Request.Form["date2"]).ToString("yyyyMMdd");
Response.Redirect("SearchPaged.aspx?content=" + content + "&date1=" + date1 + "&date2=" + date2 + "");
}
}
else
{
if (!string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["content"]))
{
SearchContent();
}
}
}
#region 创建索引
private void CreateContent()
{
string indexPath = @"C:\Users\otsoftadmin\Documents\Visual Studio 2010\Projects\PatentLucenceDemo\lucenedir2";//注意和磁盘上文件夹的大小写一致,否则会报错。将创建的分词内容放在该目录下。
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());//指定索引文件(打开索引目录) FS指的是就是FileSystem
bool isUpdate = IndexReader.IndexExists(directory);//IndexReader:对索引进行读取的类。该语句的作用:判断索引库文件夹是否存在以及索引特征文件是否存在。
if (isUpdate)
{
if (IndexWriter.IsLocked(directory))
{
IndexWriter.Unlock(directory);
}
}
IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);//向索引库中写索引。这时在这里加锁。
List<Model.Aspatent> listasp = bllasp.GetModelList("");
foreach (Model.Aspatent model in listasp)
{
writer.DeleteDocuments(new Term("id", model.id.ToString()));
writer.DeleteDocuments(new Term("AN", model.AN));
writer.DeleteDocuments(new Term("TI", model.TI));
Document document = new Document();
document.Add(new Field("id", model.id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("AN", model.AN, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("TI", model.TI, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("PD", Convert.ToDateTime(model.PD).ToString("yyyyMMdd"), Field.Store.YES, Field.Index.NOT_ANALYZED));
writer.AddDocument(document);
}
writer.Close();//会自动解锁。
directory.Close();//不要忘了Close,否
}
#endregion
#region 搜索设置
private void SearchContent()
{
string content = HttpContext.Current.Request.QueryString["content"];
string date1 = HttpContext.Current.Request.QueryString["date1"];
string date2 = HttpContext.Current.Request.QueryString["date2"];
string indexPath = @"C:\Users\otsoftadmin\Documents\Visual Studio 2010\Projects\PatentLucenceDemo\lucenedir2";//最好将该项放在配置文件中。
string kw = content;
kw = kw.ToLower();
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader);
//过滤器
TermRangeFilter filter = new TermRangeFilter("PD", date1, date2, true, true);
//排序
Sort sort = new Sort("id", true);
//搜索条件
PhraseQuery query = new PhraseQuery();
foreach (string word in SearchHelper.SplitWord(kw))//将用户输入的搜索内容进行了盘古分词、
{
query.Add(new Term("TI", word));
}
query.SetSlop(100);//多个查询条件的词之间的最大距离.在文章中相隔太远 也就无意义.
//TopScoreDocCollector是盛放查询结果的容器,用于分页的一种容器
TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
searcher.Search(query, filter, collector);//根据query查询条件进行查询,查询结果放入collector容器
int PageIndex = AspNetPager1.CurrentPageIndex;
int PageSize = AspNetPager1.PageSize;
int RowCount = collector.GetTotalHits();
int PageCount = Convert.ToInt32(Math.Ceiling((RowCount * 1.0) / PageSize));
AspNetPager1.RecordCount = PageCount;
ScoreDoc[] docs = collector.TopDocs((PageIndex - 1) * PageSize, PageSize).scoreDocs;//得到所有查询结果中的文档,GetTotalHits():表示总条数 TopDocs(300, 20);//表示得到300(从300开始),到320(结束)的文档内容. //可以用来实现分页功能
List<SearchResult> list = new List<SearchResult>();
for (int i = 0; i < docs.Length; i++)
{
int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
Document doc = searcher.Doc(docId);//找到文档id对应的文档详细信息
SearchResult result = new SearchResult();
result.TI = SearchHelper.Highlight(kw, doc.Get("TI"));
result.AN = doc.Get("AN");
result.id = doc.Get("id");
list.Add(result);
}
this.SearchRepeater.DataSource = list;
this.SearchRepeater.DataBind();
}
public void AspNetPager1_PageChanging(object src, PageChangingEventArgs e)
{
AspNetPager1.CurrentPageIndex = e.NewPageIndex;
SearchContent();
}
#endregion
}
前台代码:
<body>
<form id="form1" runat="server">
<div>
请输入搜索内容<input id="content" name="content" type="text"/>
<input id="create" name="create" type="submit" value= "创建索引" />
<input id="search" name="search" type="submit" value="搜索" />
<input id="date1" name="date1" class="Wdate" type="text" onClick="WdatePicker()"/>
<input id="date2" name="date2" class="Wdate" type="text" onClick="WdatePicker()"/>
</div>
<div>
<ul>
<asp:Repeater ID="SearchRepeater" runat="server">
<ItemTemplate>
<li>
<%#Eval("id")%>
<br />
<%#Eval("AN")%>
<br />
<%#Eval("TI")%>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</div>
<webdiyer:AspNetPager ID="AspNetPager1" runat="server" PrevPageText="上一页" NextPageText="下一页" ShowPageIndex="true" PageSize="1" PageIndexBoxType="DropDownList" OnPageChanging="AspNetPager1_PageChanging">
</webdiyer:AspNetPager>
</form>
</body>