我已经浏览了Lucene的Java版本的文档,但我无法真正看到顶层"这就是它的工作原理"到目前为止的信息(我知道我需要RTFM,我只是看不到树木的木材)。
我了解Lucene使用搜索索引返回结果。据我所知,它只会返回"命中"从那些索引。如果我在构建索引时没有添加数据项,那么它将无法返回。
那很好,所以现在我想检查以下假设:
问:这是否意味着我想在搜索页面上显示的任何数据都需要添加到Lucene索引中?
即
如果我想通过sku,说明,类别名称等搜索Product
,但我还想在搜索结果中显示他们所属的Customer
,请执行以下操作:
Customer
的名称。JOIN
获取Customer
的名称。我认为它的选项 1 ,因为我假设没有办法加入" Lucene查询到RDBMS的结果,但想问一下我对一般用法的假设是否正确。
答案 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,可以做以下事情:
IN (value [, value])
谓词的数据库构建查询。JOIN
到其他表格。)当然,第5步和第6步可能会更好,但为了便于解释,我将这个冗长的方法放在我的描述中。如果Lucene命中包含某种“相关性”值,那么您可以将其归因于结果集并执行标准排序,但这对读者来说是一种练习。 :)
这可能吗?