Lucene.Net 搜索时候 如何拆词,分词啊?已经建立好索引了。

020job 2012-04-13 05:07:34
Lucene.Net 搜索时候 如何拆词,分词啊?已经建立好索引了。

比如搜索"设计人员"的时候,包括“设计”,或者”人员“的信息都出来。

我的代码是这样写的


//定义多条件搜索分析器
BooleanQuery bquery = new BooleanQuery();
//定义分词器
Analyzer analyzer = new StandardAnalyzer();

MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[]{ "shuju1", "shuju2"});

Query query = parser.Parse("设计人员");



我发现只有搜索"设计 人员" 加上空格才会出现我需要的信息,
但是不能指望所有用户都用空格啊?

比如说搜c语言,包括“c”的和“语言”的结果全部出来,搜索程序设计,“程序”和“设计”的全部出来。


谁能给个方法啊,
...全文
177 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
startstartsvip 2012-04-15
  • 打赏
  • 举报
回复
Za· NaLi Fen Ci
startstartsvip 2012-04-15
  • 打赏
  • 举报
回复 1
脑残法 用户输入加空格 拍列组合 然后搜索
  • 打赏
  • 举报
回复
哦当然扫描时应该从前一个词的结尾开始,对于例如“.....预先设计划分担词”这样的文字是应该可以跳过“设计”这个词的而不会返回的。

我不知道Lucene.Net这个东西的性能如何,觉得这种百八十行的小程序还是自己写为好。
  • 打赏
  • 举报
回复
实际上自己写这样的程序用几十行代码就行了,我不会用第三方类库。
  • 打赏
  • 举报
回复
如果你不纠结于什么 Lucene.net,实际上自己写一个其实还是很简单的(只要配个词库即可)。

例如参考:http://topic.csdn.net/u/20120402/17/35a9ef15-cc1b-40bf-b81f-31bf880a4c50.html?41547
基本的算法可以在这个找到。分词不过是比它扫描趟书稿一些。比如当扫描到“北”这个字的时候,要求把凡是被处理字符串中符合词库中以“北”这个字打头的词(例如北京、北京市、北京市朝阳区,等等)都显示出来,并且逐字扫描一遍。

这就要求词典的结构是按照单个字倒排树索引的,这样才能保证性能。
我就是大神 2012-04-14
  • 打赏
  • 举报
回复
以前写的,我也看不太懂了。不知道有没有用
private IEnumerable<string> SplitWords(string s)
{
List<string> listWords = new List<string>();
Analyzer analyzer = new PanGuAnalyzer();
TokenStream tokenStream = analyzer.TokenStream("",new StringReader(s));
Lucene.Net.Analysis.Token token = null;
while ((token = tokenStream.Next()) != null)
{
string word = token.TermText();
listWords.Add(word);
}
return listWords;
}

//返回搜索到的数据
public List<SearchResult> SearchWords(string keyWords)
{
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath),
new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader);
PhraseQuery query = new PhraseQuery();//查询条件,where

foreach (string word in SplitWords(keyWords))
{
query.Add(new Term("cContent", word));
}

query.SetSlop(100);//词之间的距离超过多少就不匹配
//盛放结果的容器
TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
searcher.Search(query, null, collector);//使用query这个查询条件进行搜索,结果放入collector中
ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;

List<SearchResult> list = new List<SearchResult>();
for (int i = 0; i < docs.Length; i++)
{
int docId = docs[i].doc;//文档的Id,这个Id是Lucene.net内部分配的
Document doc = searcher.Doc(docId);//为了降低内存占用,查询结果中只有id,如果想获得文档,需要调用searcher.Doc
long id = Convert.ToInt64(doc.Get("cId"));//只有保存的时候Store.Yes的字段才能用Get取出来
string name = doc.Get("cName");
string content = StrReplace(GetHightLight(keyWords, doc.Get("cContent"), "red"));
list.Add(new SearchResult { Id = id, Name = name,Content= content});
}
return list;
}
3610 2012-04-14
  • 打赏
  • 举报
回复
顶一下 Split 搞定

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧