我有这样的一个需求:
一个数据库表格:(有很多个主要字段,其中内容固定,每个字段的长度都很短, 记录数10W+ 可能更多)
1.省份 | 2. 市 | 3. 街 | 4. 经度 | 5. 纬度 | ………………
目标:1)可以实现:( 省市街 )三个条件的 单独 或者 组合 模糊查找如找 纬度:120~~130 以内 经度 80~~100以内 的记录 :如: 单查: “某某街” ( 符合要求的全部列出)
组合: "某" (市) "某" (街) 或者 "某" (省) "某" (街) ( 符合要求的全部列出)
2)经度和纬度是类似于 (123.48,46.54 )的双精度类型的数据
可以实现:通过给出一组 经纬度值,查出在其范围内的符合要求的记录 :
3)很短时间完成
以上需求都要把满足条件的 所有的字段 取出来,有可能以后要扩展!
您的回答1:需要这样的一些要求,是用Lucene好?还是数据库索引好?哪个速度快?
您的回答2:我们BOOS叫我用数据库索引,但是我不是DBA。才毕业,我用lucene做了个测试500W+的数据查找需要400毫秒左右!这样的速度是不是太慢了? 【2.5G的CPU,1G内存,XP】
您的回答3:我们BOOS昨天给我说,他的目标是:(10W+的模糊查找)【1毫秒】内出结果!我才毕业。觉得【1毫秒】太快了,真的可以吗?(我们用的是 mysql5 数据库)
请知道的前辈多说几句,我是一新人。在此先谢过了!
马上过年了,希望过个开心年啊!!谢谢大家了!
[b]问题补充:[/b]
说老实话。。我也觉得1毫秒绝对不可能。可惜。。。
[b]问题补充:[/b]
问题是 用lucene快点还是 数据库索引快啊??
今天又把我留下来学习。,。
叫我去弄。
我本来就是搞java的。喊我自己写 索引规则。。
我会个屁啊
[b]问题补充:[/b]
听说:
如果我想找上海酒店,价格在300~500之间。用Lucene处理,它会在内部形成类似这样的查询项:
地点:上海酒店
价格:300
地点:上海酒店
价格:301
…………
地点:上海酒店
价格:500
总共要生成200个这样的查询项,这是倒排索引的机制所限定的。这还算好,如果客户来个100~10000,Lucene就直接挂掉了。
以上是在一个讨论中看到的。。
请问是吗?
如果在我的应用的经纬度的查询中,经纬度是 double的
我想办法把他转成int 在给lucene 索引,那样不是要生成 n万 个这样的查询项?
你通过RangeQuery来做范围查询的话....
RangeQuery是通过BooleanQuery来做的...
每个条件就会加一个BooleanQuery...
BooleanQuery默认最在的条件为1024个.
但是可以通过BooleanQuery.setMaxClauseCount(10000000);来调整...
但是扩大也是有限的,并且随着maxClauseCount扩大,占用内存也扩大
用RangeFilter代替RangeQuery,但是仍然有性能瓶颈,查询的90%以上时间耗费在 RangeFilter,研究其源码发现RangeFilter实际上是首先遍历所有索引,生成一个BitSet,标记每个document,在时间范围内的标记为true,不在的标记为false,然后将结果传递给Searcher查找,这是十分耗时的。
模糊查找,你在怎么建索引,数据库也是做全表扫描的...
如果用模糊查询的话,要是能在1MS内找出来的话,,你可以直接给你们BOSS一巴掌..不懂还装....
Lucene的话..1MS出来.估计也不可能..因为你需要的是一个范围的查询...
但是Lucene不管你是什么查询,它多会走他的索引...
10W数据的话,,应该在80MS左右...
10W条数据1MS内模糊查询出来..也就你们BOSS能想到...
肯定是lucene快呀....你直接把整个索引文件加载到内存..在查询