请熟悉lucene.net,用lucene.net开发过项目的大侠帮忙分析一下问题

一天到晚游泳的鱼2016 2010-12-25 10:38:03
请熟悉lucene.net,用lucene.net开发过项目的大侠帮忙分析一下问题。
我们公司搜索采用lucene.net 分词器lucene.net不多,采用的是Lucene.Net.Analysis.China.dll 。
也是从网上下载的一个第三方分词器。字词分词还能基本满足需求。

现在项目完成上线,问题是,网站的服务器内存不断上涨,到最后“System.OutOfMemoryException”的异常 网站死掉,无法打开。

对于lucene.net,耗费性能的排序去掉了,要不死的更快。

对于搜索,IndexSearcher每次打开都及时关闭,清理了。

下面是异常日志,还请对lucene.net有研究的大侠,帮忙分析一下。

时间:2010-12-25 07:57:58,843 线程ID:[5] 日志级别:ERROR 类:Gk.Framework.Lucene.AbstractBase.AbstractLuceneBase property:[(null)] - 描述:引发类型为“System.OutOfMemoryException”的异常。
System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
在 Lucene.Net.Analysis.China.Graph.x33543d3035807139.GetEnumerator()
在 Lucene.Net.Analysis.China.Graph.xef2f0a201b1de90d.xc82b0b6ba0540317()
在 Lucene.Net.Analysis.China.x93a9632f89e5228b.xa19ed99e4a8e3c37(xbe3359edea77d2e1 x8bab43510084bb0f)
在 Lucene.Net.Analysis.China.ChineseTokenizer.xd32c157ba2a173fa()
在 Lucene.Net.Analysis.China.ChineseTokenizer.Next()
在 Lucene.Net.Analysis.China.ChineseFilter.Next()
在 Lucene.Net.Highlight.Highlighter.GetBestTextFragments(TokenStream tokenStream, String text, Boolean mergeContiguousFragments, Int32 maxNumFragments)
在 Lucene.Net.Highlight.Highlighter.GetBestFragments(TokenStream tokenStream, String text, Int32 maxNumFragments)
在 Lucene.Net.Highlight.Highlighter.GetBestFragment(TokenStream tokenStream, String text)
在 Lucene.Net.Highlight.Highlighter.GetBestFragment(Analyzer analyzer, String fieldName, String text)
在 GongKong.Projects.UniteSearch.Indexer.ZhiDaoIndexer.BuildHighlight(String field, String fieldValue, Query keyquery)
在 Gk.Framework.Lucene.AbstractBase.AbstractLuceneBase.SearchIndex(Int32 pageSize, Int32 pageIndex, Int32& recordCount, String sortField, Boolean isAsc, Dictionary`2 condition)
...全文
330 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我给你发了站内消息,加我QQ
  • 打赏
  • 举报
回复
晕,你觉得用户 搜索 会输入整个公司名吗

最多输四个字。分词就是为了输入一两个关键词,然后定位到相应的公司

不分词,是不行的。
Dylan-Wang 2010-12-25
  • 打赏
  • 举报
回复
如果还有问题的话,给我发站内信,QQ上聊吧,这里发帖太墨迹了
Dylan-Wang 2010-12-25
  • 打赏
  • 举报
回复
新版本的盘古有个扩展文件, Wildcard.txt ,可以扩展词库,公司名称都是必须要录入词库的,要不你可以在建立索引的时候对于公司名称这一项,选择不分词搜索,这样得到的结果就不是生僻词了,而是整个名称来搜索,你觉得呢?
  • 打赏
  • 举报
回复
盘古我们有一个项目也在用

可能盘古对于一般新闻类站点,是一个好的选择,词库更新也不是很频繁

我们公司数据,有好多外国公司名称

比如:德国威琅电气 CRYDOM(快达)IDEC-爱德克电气贸易

这样分出词来,都是比较偏,生僻的多,索引维护会很频繁
Dylan-Wang 2010-12-25
  • 打赏
  • 举报
回复
如果要求高的话,用盘古分词吧,带词库的,要维护,我还写了个盘古分词和Lucene.net的搜索类,楼主可以借鉴一下

盘古分词下载:
http://download.csdn.net/source/2889457

搜索类:

http://blog.csdn.net/dongdongleng/archive/2010/12/06/6058416.aspx
  • 打赏
  • 举报
回复
对精度还是有要求的。

对于词库,原来项目,还有其他项目在用,觉得效果不是很理想。

二分法的有吗

我现在用的这个,它介绍说比二分法精度高。

就是下面这个网址http://blog.csdn.net/wangkun9999/archive/2007/04/18/1568495.aspx
Dylan-Wang 2010-12-25
  • 打赏
  • 举报
回复
中文分词要求精度吗?不要求精度的话,基本的二分法实现分词就可以了,这个可以自己写一个二分法分词,但是楼主如果要求精度的话,那么就需要一个词库匹配,词库的维护成本当然有。
  • 打赏
  • 举报
回复
谢谢 dongdongleng

我们主要是中文分词。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dongdongleng 的回复:]

楼主把你 建立索引,分词方法和搜索方法贴出来,我看看,光写出错误找不到原因的
[/Quote]

大家看看我的搜索方法有问题吗

分词方法,我就是调用的Lucene.Net.Analysis.China.dll中的Analyzer。

搜索方法:
public object SearchIndex(int pageSize, int pageIndex, out int recordCount, string sortField, bool isAsc, Dictionary<string, SearchConditionEntity> condition)
{
recordCount = 0;
Hits hits = null;
IndexSearcher searcher = null;
try
{
//查询条件
Query query = this.BuildQuery(condition);
//加载索引,创建搜索对象
searcher = new IndexSearcher(this.Path);
//排序
if (!StringUtil.IsNullOrEmpty(sortField))
{
//Sort dateSort = new Sort(sortField, isAsc);
Sort dateSort = new Sort(new SortField(sortField, SortField.STRING, isAsc));

hits = searcher.Search(query, dateSort);
}
else
{
hits = searcher.Search(query);
}

recordCount = hits.Length();//总数量
//返回查询的List<Document>
IList<Document> documentList = new List<Document>();

int i = (pageIndex - 1) * pageSize;
while (i < recordCount && documentList.Count < pageSize)
{
//获取具体当前索引数据
Document doc = hits.Doc(i);
float fl = hits.Score(i);
doc.Add(new Field("Qzscore", fl.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
//需要分词字段集合
List<string> listfield = HighlightFileds();
//分词所需Query
Query keyquery = BuildHighlightQuery(condition);
//遍历需要分词字段集合
if (listfield != null && keyquery != null)
{
foreach (string field in listfield)
{
//分词字段值
string fieldValue = doc.Get(field);
//返回分词后的字段值
string val = BuildHighlight(field, fieldValue, keyquery);
//有分词结果,重新构造分词高亮字段
if (val != null)
{
//删除原来字段
doc.RemoveField(field);
//添加分词后,原来字段
doc.Add(new Field(field, StringUtil.ToString(val, ""), Field.Store.YES, Field.Index.UN_TOKENIZED));
}
}
//重新构造后的doc,写入documentList
documentList.Add(doc);
}
else
{
//没有分词查询,添加到documentList
documentList.Add(doc);
}
i++;
}
return this.BuildResultList(documentList);
}
catch (Exception ex)
{
log.Error(ex.Message, ex);
return null;
}
finally
{
searcher.Close();
searcher = null;
System.GC.Collect();
}
}
Dylan-Wang 2010-12-25
  • 打赏
  • 举报
回复
楼主先说说你要搜索的效果,我在给你推荐分词器,是倾向于中文搜索,还是英文搜索?lucene.net的内存机制很好了,现在怀疑的是你下载的那个分词组建的问题
  • 打赏
  • 举报
回复
我现在也怀疑是哪个分词组件有问题。

网上说,lucene.net内部也有内存溢出bug。请问是这样吗?

还有,大家请推荐一下lucene.net较好的中文分词组件,最好不要词库的,维护太麻烦。

还有,我们索引的好多都是外国公司名称,如果词库不及时更新,这些都是查不到

最好是字词混合分词。
Dylan-Wang 2010-12-25
  • 打赏
  • 举报
回复
楼主把你 建立索引,分词方法和搜索方法贴出来,我看看,光写出错误找不到原因的
winner2050 2010-12-25
  • 打赏
  • 举报
回复
分词组件爆出的错误,肯定是它的bug。

wuyq11 2010-12-25
  • 打赏
  • 举报
回复
程序存在死循环

62,244

社区成员

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

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

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

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