各位大侠们好啊,
我现在在做一个数据库检索功能用lucene
我的表结构是
id (编号) content(内容
表中存放的记录格式都是这样的
1 杯子\水杯\瓷杯子
2 办公桌\写字桌
实现的功能是 我输入的名字 “水杯” 点击查询 通过lucene.net 就能查询出是第一条记录
这样的功能怎么实现啊,小妹在线等,各位路过的帮帮忙吧,小妹的园豆不多了就20个了,都给了。!!!
那个查询结果 “SQL Server 2008 的发布”是怎么被查询来的呢?
@刘颖: 这就是Lucene做的事啊
建议把上面那个链接的系列看完,弄明白lucene的原理
@artwl: 哦,我明白了,是这个 Query query = parser.Parse("sql"); 中的”sql“将有关”sql“的都查询出来的,呵呵!
但是我怎样检索数据库中的记录呢,难道是将数据库中的所有记录都的创建索引吗,存放在一个指定目录下,然后根据这个目录在进行搜索吗,我这样想对吗,还是可以直接用lucene.net 操作数据库呢?
@刘颖: 用lucene都是要建索引的
难道是将数据库中的所有记录都的创建索引吗,存放在一个指定目录下,然后根据这个目录在进行搜索吗,我这样想对吗
步骤就是这样的
我在回答中说的一样,lucne有自己的存储,比如文本,但是跟sql server一点关系没有,人家是apache的一个项目。
@artwl: 谢谢您的帮助,现在我明白了,其实lucene.net 就是将不同的格式转换成索引文件,然后根据索引文件在进行查找相应的记录,我会认真努力看完您的其他系列,再次感谢您!!
@artwl: 从数据库读出来的记录需要建立索引文件,然后在访问索引文件,这样会不会太慢了啊,放到内存中会不会耗性能啊,如果我将索引文件放到内存,什么时候需要考虑到内存的开销,当我将索引文件放到内存lucene.net 会不会等我使用完了,自动进行垃圾回收呢?
Lucene.net是根据索引文件查询,先要根据数据库表中的内容建立索引。
建立内容索引是不是就得首先通过sql语句查询出数据库,然后将这些数据通过IndexWriter这个创建成内容索引(本地指定某一个文件目录下假如是A),然后在通过这个IndexSearcher访问A下的文件找到想要记录,是这样的吗?
@刘颖: 是的,参考文章:Lucene.NET 2.0示例代码
@dudu: 谢谢您的帮助,我认真努力看完您发的例子!!
@dudu: 从数据库读出来的记录需要建立索引文件,然后在访问索引文件,这样会不会太慢了啊,放到内存中会不会耗性能啊,如果我将索引文件放到内存,什么时候需要考虑到内存的开销,当我将索引文件放到内存lucene.net 会不会等我使用完了,自动进行垃圾回收呢?
@刘颖: 在索引中搜索内容速度很快
@刘颖:Lucene是一个高性能、可伸缩的信息搜索(IR)库。工作原理简单说就是把一段话的先切割为最小单元(字、词)编入索引库(ir库),这个中间的过程设计非常复杂的分析工作,比如动词、主语等等。当要搜索的时候,就会检索这个库。建议你看看lucene in action,现在据说有中文版了,不过有英文阅读能力还是建议看原版的,另外lucene中term 和token的概念很重要,也不要把sql server拉进来,他们没有关系。
谢谢您的帮助!!!
从数据库读出来的记录需要建立索引文件,然后在访问索引文件,这样会不会太慢了啊,放到内存中会不会耗性能啊,如果我将索引文件放到内存,什么时候需要考虑到内存的开销,当我将索引文件放到内存lucene.net 会不会等我使用完了,自动进行垃圾回收呢?
@刘颖: 说实话,不建议你放内存,如果索引文件实在小的可以那随你。其实你的问题主要在搜索速度上没有量的概念,我可以告诉你,百万条记录,每条记录上千字正常的服务器返回结果不会超过50ms(不算其它时间,比如你还去sql server逛逛什么的,只算你发起搜索到得到结果)。
对了你也可以这样想想,如果这些东西还需要我们考虑,那lucene的功能就是不完整的,它的定义就是“如何快速存取文档”,比如lucene中有个叫索引域的东西,它内部有非常复杂的内存管理机制,比如什么时候放什么进内存,放多少进内存都已经帮你考虑好了。
简单一句:要快,你就用它吧!只是分词库比较难搞,可以看看园子里的盘古分词!!~