【问题标题】:Lucene IndexingLucene 索引
【发布时间】:2010-07-13 16:25:19
【问题描述】:

我想使用 Lucene 来索引现有数据库中的表。我一直在想这个过程是这样的:

  1. 为表中的每一列创建一个“字段”
  2. 存储所有字段
  3. “分析”除具有主键的字段之外的所有字段
  4. 将表中的每一行存储为 Lucene 文档。

虽然此表中的大多数列都很小,但有一列很大。此列也是包含将对其执行搜索的大部分数据的列。

我知道 Lucene 提供了不存储字段的选项。我在想两个解决方案:

  1. 无论大小如何都存储该字段,如果找到要搜索的结果,则从文档中获取相应的字段
  2. 不要存储字段,如果找到了搜索结果,请查询数据库以获取相关信息

我意识到可能没有一刀切的答案...

【问题讨论】:

    标签: lucene


    【解决方案1】:

    当然,如果您将所有内容都存储在 Lucene 上,您的系统会更加灵敏。存储字段不会影响查询时间,它只会使索引的大小变大。如果它只是具有大量数据的行的一小部分,则可能不会那么大。因此,如果索引大小对您的系统来说不是问题,我会同意。

    【讨论】:

    • +1 表示帕斯卡的回应。您还可以标记大字段并且不存储它。这样您就可以在字段上查询(搜索),获取相关的文档/记录标识符并从数据库中检索记录。
    • 感谢您的回复。如果我选择不存储任何字段,我也将无法使用 Highlighting(Lucene contrib 模块)来突出显示搜索结果?
    • 可以在不存储文本的情况下完成,但这不是简单的方法。见lucidimagination.com/search/document/5ea8054ed8348e6f/…
    • Oups,在我之前的评论中,我指的是 Solr。使用普通的 Lucene,是的,我认为您需要存储该字段。
    • 以及如何获取特定的行详细信息以将该信息存储为字段信息!
    【解决方案2】:

    我强烈不同意帕斯卡的回答。索引大小会对搜索性能产生重大影响。主要原因是:

    • 存储字段增加索引大小。这可能是 I/O 系统相对较慢的问题;
    • 当您在内存中加载文档时,所有存储的字段都会被加载。这可能会给 GC 带来很大的压力
    • 存储的字段可能会影响阅读器重新打开时间。

    当然,最终的答案取决于。如果原始数据已经存储在其他地方,最好从原始数据存储中检索它。

    【讨论】:

    • Lucene 不应被视为数据的权威来源。无论如何,数据都应该存储在其他地方,因此对非存储文本字段进行基于关键字的查询,然后进行查找以从单一事实来源获取实际数据。
    • 好的。那么,如何实现呢?如果有任何可用的参考链接,那将非常有帮助。
    【解决方案3】:

    从数据库中添加一行到 Lucene 时,可以判断是否真的需要写入倒排索引。如果没有,您可以使用 Index.NOT 来避免向倒排索引写入过多数据。 同时,可以通过key-value来判断某列会在哪里查询。如果没有,则不需要使用 Store.YES 来存储数据。

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多