当前位置: 代码迷 >> Java Web开发 >> 精确查询时数据库与lucene目录效率哪个高呢
  详细解决方案

精确查询时数据库与lucene目录效率哪个高呢

热度:49   发布时间:2016-04-16 22:15:00.0
精确查询时数据库与lucene索引效率哪个高呢?
本帖最后由 u010810874 于 2014-06-30 00:38:57 编辑
举个例子,现在有A、B、C、D四个字段。A是主键ID,B和C是用于精确查询的字段,D是用于模糊查询的字段。现在对于形如B=? AND C=? AND D LIKE ?的查询我有两种查询方案:
<1>Lucene索引时,A字段只Stored,D字段只Indexed,先根据Lucene索引把A字段查询出来,再去数据库执行条件是A=? AND B=? AND C=?;
<2>把所有字段都Stored,除A以外的字段Indexed,然后所有查询仅依赖Lucene索引完成。
上面两种方案哪种的查询效率更高?我直觉感觉是第一种,但是。。。求从原理上简单分析利弊来说服我
------解决方案--------------------
引用:
举个例子,现在有A、B、C、D四个字段。A是主键ID,B和C是用于精确查询的字段,D是用于模糊查询的字段。现在对于形如B=? AND C=? AND D LIKE ?的查询我有两种查询方案:
<1>Lucene索引时,A字段只Stored,D字段只Indexed,先根据Lucene索引把A字段查询出来,再去数据库执行条件是A=? AND B=? AND C=?;
<2>把所有字段都Stored,除A以外的字段Indexed,然后所有查询仅依赖Lucene索引完成。
上面两种方案哪种的查询效率更高?我直觉感觉是第一种,但是。。。求从原理上简单分析利弊来说服我


这个对比的意义不大,因为两种技术完全不是解决同一个问题的。
就譬如你要问,是中餐能填饱肚子还是西餐能填饱肚子?当然both都可以填饱肚子,只是填饱的人不一样,一个填中国人,一个填老毛子。

下面对比一下两种技术:
数据库技术就不多说了,这是传统的数据存储技术
lucene是做全文索引的,不是用来像你理解这样存数据的,当然lucene也存数据,不然就做不了索引了,但是它还是偏向于全文索引这个功能。

效率方面,面临的查询挑战不一样,数据量大了以后,数据库可以做分业务分库分表,水平垂直两个方向的扩展,但是lucene受困于搜索全文,扩展方面比较麻烦。

回到LZ的比较,当数据量很小的时候,两者效率没有明显差别.不过这个结论不是我实测的,是我评估的:两种的查询时间都在10-100ms这个级别。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

举个例子,现在有A、B、C、D四个字段。A是主键ID,B和C是用于精确查询的字段,D是用于模糊查询的字段。现在对于形如B=? AND C=? AND D LIKE ?的查询我有两种查询方案:
<1>Lucene索引时,A字段只Stored,D字段只Indexed,先根据Lucene索引把A字段查询出来,再去数据库执行条件是A=? AND B=? AND C=?;
<2>把所有字段都Stored,除A以外的字段Indexed,然后所有查询仅依赖Lucene索引完成。
上面两种方案哪种的查询效率更高?我直觉感觉是第一种,但是。。。求从原理上简单分析利弊来说服我


这个对比的意义不大,因为两种技术完全不是解决同一个问题的。
就譬如你要问,是中餐能填饱肚子还是西餐能填饱肚子?当然both都可以填饱肚子,只是填饱的人不一样,一个填中国人,一个填老毛子。

下面对比一下两种技术:
数据库技术就不多说了,这是传统的数据存储技术
lucene是做全文索引的,不是用来像你理解这样存数据的,当然lucene也存数据,不然就做不了索引了,但是它还是偏向于全文索引这个功能。

效率方面,面临的查询挑战不一样,数据量大了以后,数据库可以做分业务分库分表,水平垂直两个方向的扩展,但是lucene受困于搜索全文,扩展方面比较麻烦。

回到LZ的比较,当数据量很小的时候,两者效率没有明显差别.不过这个结论不是我实测的,是我评估的:两种的查询时间都在10-100ms这个级别。

我觉得是很有意义的。。。首先我标题明确了是精确查询,回到你的比喻,就相当于关于能否填饱肚子这个问题有了一个共同的裁判;其次这样的选择应该是很常见的,因为我看了两三个项目,发现他们都喜欢用lucene来存数据然后彻底替代数据库索引,我就感觉被颠覆认知了,还能这么玩?最后,我很喜欢你的解答


喜欢用lucene来存数据,这种行为我只能说很奇怪,如果想用nosql,lucene的这种数据格式完全可以直接上mongo,上hbase上redis都可以,一定要用lucene我只能说我也不懂。

最后说一个结论:lucene是用来做全文索引的,别拿来做和数据库一样的事情
  相关解决方案