使用Solr Lucene索引不同类型的实体/对象

时间:2010-06-14 11:41:33

标签: php lucene solr search-engine

假设我想使用Solr Lucene索引我的商店。

我有很多类型的实体:产品,产品评论,文章

如何让我的Lucene为这些类型编制索引,但每种类型都有不同的Schema?

4 个答案:

答案 0 :(得分:5)

我建议您创建索引,使所有实体具有或多或少相同的基本字段:title, content, url, uuid, entity_type, entity_sourcename等。如果您的每个实体都有一组唯一的相应索引字段,那么您将拥有很难构建查询以同时搜索所有实体,并且您的结果视图可能会变得非常混乱。如果您需要某个特定实体的某些特定字段,请根据其entity_type添加该特定字段并为该实体执行特殊逻辑。

我是根据经验说的:我们正在管理一个包含10多个不同实体的索引,这种方法就像魅力一样。

P.S。其他一些简单的建议。

  1. 确保您的Lucene文档包含构建结果的所有必要数据并将其显示给用户(这样您就不需要转到数据库来构造结果)。 Lucene查询通常比数据库查询快得多。
  2. 如果您绝对需要使用数据库来构建结果集(例如,应用权限),请首先使用Lucene查询来缩小结果,然后使用数据库查询来过滤它们。
  3. 如果您需要,请不要害怕在某些文档中添加自定义字段:将Lucene文档视为键值数据存储区。

答案 1 :(得分:2)

多核是一种谨慎使用的方法。使用像你这样的简单模式,这是一个更好的方式来做buru命令。 这意味着要查找不同实体之间的公共字段,然后查找仅由on或其中几个使用的字段。然后,您可以添加一个字段“type”或“type_id”,它会说明您的实体是产品还是产品评论......

这样做可以使您拥有唯一索引,并快速处理查询。

答案 2 :(得分:1)

使用Lucene / Solr,每个文档不需要为每个字段设置值。在同一模式中,您可以为实体A提供一组字段,为实体B提供另一组字段,并根据实体填充相应的字段。

使用Solr,您还可以选择多核。每个核心都有自己的架构。您可以为每个实体定义核心。

答案 3 :(得分:1)

您可能希望拥有3个名为Products,ProductReviews和Articles的索引。每个索引都可以有自己的架构。 Lucene和关系数据库方法之间的区别在于db中的行,粗略转换为Lucene中的文档。注意:每个文档都可以有自己的模式(这是与关系数据库的另一个区别)。