【问题标题】:What would be the best way to index and search my data using Lucene?使用 Lucene 索引和搜索我的数据的最佳方法是什么?
【发布时间】:2012-01-19 11:28:01
【问题描述】:

我在 SO 和其他地方发现了多个问题,这些问题类似于“我如何在 Lucene 中建立索引然后搜索关系数据”之类的问题。非常正确地,这些问题得到了标准的回答,即 Lucene 不是为这样的数据建模而设计的。我找到的这句话总结了它……

Lucene 索引是一个文档存储。在文档存储中,单个 文档代表一个概念,所有必要的数据都存储到 代表该概念(与传播的相同概念相比 跨 RDBMS 中的多个表需要多个连接 重新创建)。

所以我不会问这个问题,而是提供我的高级要求,看看是否有任何 Lucene 大师可以帮助我。

  • 我们有关于人的数据(姓名、性别、出生日期、国籍等)
  • 以及有关公司的数据(名称、国家、城市等)。
  • 我们还有关于这两种类型的实体如何相互关联的数据,其中一个人在公司工作(人、公司、角色、开始日期、结束日期等)。

我们有两个实体——Person 和 Company——它们有自己的属性,然后属性存在用于它们之间的多对多链接。

一些示例搜索可能如下......

  • 查找澳大利亚的所有公司
  • 查找所有在两个日期之间出生的人
  • 查找所有曾担任 .Net 开发人员的人
  • 查找所有在伦敦担任过 .Net 开发人员的男性。
  • 查找所有在 2008 年至 2010 年间担任 .Net 开发人员的人

标准涵盖所有三组数据。我们的要求是为接受各种属性的任意组合的数据提供Faceted Search,我已经给出了一些示例。

我想为此使用Lucene.Net。我们是一家 .Net 软件公司,因此对 java 感到有些害怕。但是,我们欢迎所有建议。

我知道在构建索引时应该考虑到搜索。但我似乎无法提出一个能满足所有搜索条件组合的合理索引

  • Lucene 原生的哪些类或我们可以使用哪些扩展点。
  • 是否有成熟的技术来做这种事情?
  • 是否有任何我错过的第三个开源贡献可以帮助我们?

现在我不会描述我们考虑过的场景,因为我不想夸大这个问题并让它变得太吓人。如有必要,请让我详细说明。

【问题讨论】:

  • 我不认为 Lucene.Net(或任何其他文本搜索引擎)非常适合您的需求。也许你应该选择embedded databases
  • 考虑在 Lucene-net-user@a.o 邮件列表中提出这个问题
  • 我赞同@Prescott 的建议。这是一个友好的列表,如果您提供足够好的信息(您在此处所做的),他们愿意提供帮助。 1 条建议(现在没有太多时间)您说:“但我似乎无法提出一个能够满足所有搜索条件组合的合理索引”.. 这真的没有必要。如果你不能让它与 1 个概念文档类型一起工作。(例如:公司扁平化的人)使用 2(扁平化人的公司)等等。(顺便说一句,过于简化)。我对 .Net 端口的了解为零。如果我是你,我会在问题列表中省略它
  • 续:只是为了获得最好的解决方案。之后,您可以随时检查 .net 变体是否支持它。 (或者,如果符合规范,您最终可能会将 java 变体作为独立服务器通过 http 与 .net 进行通信。)
  • 非常感谢邮件列表的建议。我也在那里问过。

标签: lucene lucene.net faceted-search


【解决方案1】:

要将公司和人员存储在一个索引中,您可以创建带有type 字段的文档,该字段标识他们所描述的实体类型。

生日可以存储为日期字段。

您可以给每个人一个简单的文本字段,其中包含他们工作的公司的名称。请注意,如果您输入的公司不在索引中的文档中表示,则不会出现错误。 Lucene 不是关系数据库工具,但您知道这一点。

(抱歉,我没有发布任何指向 API 的链接;我熟悉 Lucene Core,但不熟悉 Lucene.NET。)

【讨论】:

  • 谢谢@larsmans。我们实际上已经考虑过这种索引结构,但我想知道您是否可以帮助我解决我如何解释结果的问题。我会更新我的问题...
  • 实际上,在我这样做之前。您如何看到与公司一起存储的角色,这些角色已经是个人文档的一部分?每个公司/角色对都必须分开,以便可以正确识别两者的匹配 - 然后当然还有角色的开始/结束日期。您认为需要第三种文档类型的“角色”吗?如果需要,我们如何将它们“链接”在一起?
  • 一个选项是每个公司/角色对实际上被建模为单个值。 [公司 X 角色] -> 例如 int。将其存储在多值字段中。让您的客户知道如何对其进行编码/解码等。目前没有每个角色的开始/结束的答案。指定您可能遇到的包含这些角色 x 开始/结束日期组合的查询可能会有所帮助
  • 感谢 Geert-Jan。我接受您对公司/角色多值字段的建议,但我似乎无法理解如何结合多种概念文档类型来查询它。您是否建议查询将返回两种类型的文档,然后我必须对它们进行后期处理以过滤我想要的文档。我回到查找“所有在伦敦担任 .Net 开发人员的人”的示例。 .Net Dev 将属于 Person 文档类型,London 将属于 Company 文档类型。我可以创建一个查询以仅返回个人文档吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 2016-08-21
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多