使用Lucene查询RDBMS数据库

时间:2011-01-17 15:55:53

标签: database lucene.net lucene

我已经浏览了Lucene的Java版本的文档,但我无法真正看到顶层"这就是它的工作原理"到目前为止的信息(我知道我需要RTFM,我只是看不到树木的木材)。

我了解Lucene使用搜索索引返回结果。据我所知,它只会返回"命中"从那些索引。如果我在构建索引时没有添加数据项,那么它将无法返回。

那很好,所以现在我想检查以下假设:

问:这是否意味着我想在搜索页面上显示的任何数据都需要添加到Lucene索引中?


如果我想通过sku,说明,类别名称等搜索Product,但我还想在搜索结果中显示他们所属的Customer,请执行以下操作:

  1. 确保Lucene索引在索引中具有非规范化Customer的名称。
  2. 使用Lucene返回的匹配以某种方式查询数据库中的实际产品记录,并使用JOIN获取Customer的名称。
  3. 我认为它的选项 1 ,因为我假设没有办法加入" Lucene查询到RDBMS的结果,但想问一下我对一般用法的假设是否正确。

3 个答案:

答案 0 :(得分:1)

通常,索引只包含您要搜索的字段,而不一定是您要显示的字段。索引应该优化为尽可能小,以保持良好的搜索性能。

为了能够显示更多数据,请在索引中添加一个字段,以便您检索完整的文档/数据,即Product的唯一键(产品ID?)。

答案 1 :(得分:1)

我一直试图弄清楚同样的问题,但我认为它的工作太多了。我认为这是另一种选择。如果我的想法错了,请纠正我!

你的情况是这样的: RDBMS产品(很多)< ------> (很多)客户

我建议,不要只将客户放在lucene索引中来获取产品密钥,然后使用IN Query查询RDBMS,而是使用Product和Customer的cartesian产品创建lucene索引。

像 customer_1,product_1 customer_1,product_2 customer_2,product_2 ..

这样,当您在lucene中搜索产品时,它将同时提供客户以及产品ID ..而不是在RDBMS中加入它们,您只需查找这些客户以及产品如果有需要,可以从RDBMS获取更多信息。如果您正在使用缓存,那么额外的详细信息查找成本也将下降。

答案 2 :(得分:0)

基于BrokenGlass's answer,我已经考虑了一些,并提出以下建议,看看我是否在正确的位置:

基本上,进一步采取选项2,可以做以下事情:

  1. 只将您要搜索的数据放入Lucene索引中,加上某种键值(例如数据库中表格的PK)。
  2. 查询Lucene以获取点击列表。
  3. 使用您选择的数据访问层,为包含IN (value [, value])谓词的数据库构建查询。
  4. 从您的数据库中获取该查询的结果(可能包括JOIN到其他表格。)
  5. 将结果集的PK作为键,将这些结果放入字典中。
  6. 按顺序重复Lucene命中,使用PK从字典中提取项目,这样您就可以按照Lucene返回命中的顺序构建结果列表(即按相关性排序)。
  7. 向用户显示“已排序”的结果列表。
  8. 当然,第5步和第6步可能会更好,但为了便于解释,我将这个冗长的方法放在我的描述中。如果Lucene命中包含某种“相关性”值,那么您可以将其归因于结果集并执行标准排序,但这对读者来说是一种练习。 :)

    这可能吗?