Bobo-Browse.Net开源项目
Bobo-Browse是基于Java专为Lucene搜索的结果进行特征(或分类)分组统计的。比如你搜索一个词:手机一个词,会告诉你搜索结果包含品牌特征的分组统计:iphone(100),htc(20),联想(300),或者颜色特征的分组统计:红色(10),白色(1),也就是faceted search。比如在Yamool搜索棉衣返回的结果:
Bobo-Browse搜索的整体架构
Bobo-Browse.Net
BoboBrowse.net是移植于java版本的.Net下的faceted search for Lucene.Net,很遗憾的只支持lucene.net 2.9版本,开发者也明确下一个版本会跳过lucene.net 3.0,支持4.0。Bobo-Browse.net除了支持faceted search外,对Lucene.net的搜索功能都进行了封装,包括过滤,排序,AutoCompleted等。
让我们从一个简单的示例来了解Bobo-browser使用
public void SimpleYamoolDemo() { //open a lucene index file. var idx = FSDirectory.Open(new System.IO.DirectoryInfo(IndexPath)); var reader = IndexReader.Open(idx, true); //declare a Body field by faceted handler. var facetHandler = new MultiValueFacetHandler("Body"); var boboReader = BoboIndexReader.GetInstance(reader, new FacetHandler[] { facetHandler }); //create a new search request of browse that similare to lucene search(etc.skip,count,sort) var browseRequest = new BrowseRequest() { Count = 10, Offset = 0, Sort = new SortField[] { new SortField("LeafName",SortField.STRING) }, FetchStoredFields = true }; //create a new query for search var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, "Entity", new KeywordAnalyzer()); var q = parser.Parse("SPListItem"); //TODO:setting query for browse request. browseRequest.Query = q; // declare a facete option for by handler by bobo-browse var facetOption = new FacetSpec(); //declare a filter for facet result that only return facet with ‘al‘ begin. facetOption.Prefix = "al";//if we not filter for facet we can remove it. facetOption.OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc; browseRequest.SetFacetSpec("Body", facetOption); // perform browse var browser = new BoboBrowser(boboReader); var result = browser.Browse(browseRequest); // Showing results of now //get a specified facet field var facetResult = result.FacetMap["Body"]; var facetVals = facetResult.GetFacets(); Console.WriteLine("Facets:"); int count = 0; foreach (BrowseFacet facet in facetVals) { count++; Console.WriteLine(facet.ToString()); } Console.WriteLine("Total = " + count); //show items Console.WriteLine(string.Empty); Console.WriteLine("Actual items:"); BrowseHit[] hits = result.Hits; for (int i = 0; i < hits.Length; i++) { BrowseHit browseHit = hits[i]; Console.WriteLine(browseHit.StoredFields.Get("LeafName")); } }
返回的结果:
Facets:
all(13)
allows(3)
also(3)
allowing(2)
Total = 4
Actual items: 1.000 1073741823.000 3_.000 default.master Microsoft.Office.InfoPath.Server.BrowserForm.webpart minimal.master mysite.master owacalendar.dwp owatasks.dwp v4.master。
关于性能优化
Bobo-browse.Net为了提高查询的Facet Search性能,会加载整个索引文件要查询的的facet字段内容到内存中。假设你的索引文件1G(100W的数量),Bobo-browse会读取100W的facet数据内存中,因此每一次查询如果你总是要重新创建BoboBrowser实例时代表着每次都要重新读取索引文件到内存,除了加载时间(测试下来,如果有400W数据,每次加载需要400ms-500ms),同时内存的开销会直线上升,我们总不能指望.NET垃圾回收能立刻回收内存。解决方案就是:单一实例化。
后记:
Bobo-Browse.net for Lucene.net 3.0.3源代码托管于Github,除了在源代码进行重新修改支持lucene 3.0外,只修正单一实例化的BUG。
后面会开源基于MMSEG的中文算法(最早写于08年,11年做过速度和内存优化)。目前也应用于网站的搜索上面(MMseg的算法效果还是有目共睹,不过前提还是要有一个好的字典.好的分词软件除了算法外,最重要的是你要有好的字典才行)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。