当前位置: 代码迷 >> 搜索引擎 >> lucene.net 建立索引有关问题
  详细解决方案

lucene.net 建立索引有关问题

热度:177   发布时间:2016-05-13 01:46:09
lucene.net 建立索引问题
一个图书网站,表的设计如下:
1. Book表:存放图书的基本信息:ID、ISBN、Title、Price、Image、等
2. Category表:存放图书的分类信息,子类无限层次:ID、Name、ParentID
3. BookCategory表:图书的分类映射(一本书可以属于多个分类):BookID、CategoryID

功能:用户浏览或搜索父分类图书时,子分类的图书全部显示。

搜索功能使用lucene.net。

问题1:lucene 的index该如何设计,如何将多个分类ID保存到索引字段中?我现在想到的办法是,将所有分类ID用逗号拼成一个字符串,搜索的时候类似sql的like。

麻烦的问题:这样的表设计在建立索引时,从数据库load数据比较麻烦,因为一本书是一个Document,而它有多个分类。
问题2: 对于一些数据库是空的字段,在建立索引时也让其为null,还是给个default值?


------解决方案--------------------
你的办法不行,你可以使用Lucene.net多字段(Fields)、多索引目录(IndexSearcher)搜索,要注意排重
1、多字段搜索就是同时要一个以上的字段中的内容进行比较搜索,类似概念在SQL中就是select * from Table where a like '%query%' or b like '%query%'。
 
Lucene.net中的单个字段查询大家都比较熟悉,这里对字段content进行搜索
 Query query = QueryParser.Parse(querystr,"content",new ChineseAnalyzer());
 Hits hits = searcher.Search(query);
 
对多个字段查询用到一个MultiFieldQueryParser对象,该对象继承自Query,我们要对字段title,content进行搜索。
 string[] fields = {"content","title"};
 Query multiquery = MultiFieldQueryParser.Parse(querystr,fields,new ChineseAnalyzer());
 Hits hits = searcher.Search(multiquery);
 
2、多索引目录就是要在多个索引目录的中进行比较搜索,类似概念在SQL中就是select * from TableA union select * from TableB。
 IndexSearcher[] searchers = new IndexSearcher[2];
 searchers[0] = new IndexSearcher(IndexPath0);
 searchers[1] = new IndexSearcher(IndexPath1);
 
MultiSearcher multisearcher = new MultiSearcher(searchers);
 TopDocs multitopdocs = multisearcher.Search(query, null, 1000);
 这个搜索的结果可能有相同的信息,比如你有一条相同的信息在多个目录中索引,搜索的结果就会出现多次相同的信息。
 
还有一种搜索方式是用到ParallelMultiSearcher这个对象,它是从MulitSearcher继承而来。
 ParallelMultiSearcher parallelmultisearcher = new ParallelMultiSearcher(searchers);
 TopDocs paralleltopdocs = parallelmultisearcher.Search(query, null, 1000);
 这个搜索是对搜索后的结果进行合并,剔除重复的信息。 
  相关解决方案
本站暂不开放注册!
内测阶段只得通过邀请码进行注册!