【问题标题】:Lucene Field.Store.YES versus Field.Store.NOLucene Field.Store.YES 与 Field.Store.NO
【发布时间】:2015-10-05 02:57:33
【问题描述】:

谁能解释一下在什么情况下我可以使用Field.Store.NO而不是Field.Store.YES?我对 Lucene 非常陌生。我正在尝试创建一个文档。根据我的基本知识,我正在做

doc.add(new StringField(fieldNameA,fieldValueA,Field.Store.YES));
doc.add(new TextField(fieldNameB,fieldValueB,Field.Store.YES));

【问题讨论】:

    标签: lucene


    【解决方案1】:

    将文档写入 Lucene 有两种基本方式。

    • 已编入索引 - 对该字段进行分析和编入索引,并且可以进行搜索。
    • 已存储 - 字段的全文已存储,并将与搜索结果一起返回。

    如果一个文档被索引但没有存储,你可以搜索它,但它不会与搜索结果一起返回。

    一个相当常见的模式是使用 lucene 进行搜索,但只存储一个 ID 字段,该字段可用于从 SQL 数据库、文件系统或一个网络资源。

    当字段只是一个搜索工具时,您也可以选择不存储该字段,但您不会将其显示给用户,例如 soundex/metaphone 或内容字段的替代分析。

    【讨论】:

    • 感谢您的回复。为了准确/完整:如果我想要返回的是 documentId,那么我应该使用Field.Store.NO:将进行搜索,没有可察觉的差异,但只会返回 documentId?我还必须明确指定fieldType.setIndexed(true)吗?而文档 id 就是 scoreDoc.doc?
    • 对,使用该模式,您的 documentId 可能是唯一设置为 Store.YES 的字段。是否存储字段对搜索时匹配的文档有没有影响,只有当您检索文档时返回的内容(例如来自IndexSearcher.doc)。关于标识符的用途,如果您尝试从外部资源中识别文档,我不会使用 Lucene 的内部 DocID。使用数据库中的密钥、文件系统路径或任何适合情况的方式。
    • 您通常不需要指定是否要对文档进行索引。 TextFieldStringField 等对于如何分析文档都有自己的隐含策略(TextField 被索引和分析,StringField 被索引但不被分析,StoredField 未被索引)。
    【解决方案2】:

    当您需要从 Lucene 文档返回文档时,请使用 Field.Store.YES。当您只需要从文档中搜索时,请使用 NO。这是一个用场景解释的链接。 https://handyopinion.com/java-lucene-saving-fields-or-not/

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2011-01-01
      • 1970-01-01
      • 2013-08-24
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多