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的算法效果还是有目共睹,不过前提还是要有一个好的字典.好的分词软件除了算法外,最重要的是你要有好的字典才行

Bobo-Browse.Net开源项目,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。