【问题标题】:Lucene: Multiple StringFields with same name - query only matches on lastLucene:具有相同名称的多个 StringFields - 查询仅匹配最后一个
【发布时间】:2014-06-30 19:49:04
【问题描述】:

我有一个包含多个同名字符串字段的 Lucene 文档,如下所示:

doc.add(new StringField("uri", "http://www.doesn-t-work.com/foo", Field.Store.YES))
doc.add(new StringField("uri", "http://www.doesn-t-work.com/baz", Field.Store.YES))
doc.add(new StringField("uri", "http://www.this-works.com/bar", Field.Store.YES))

我使用 StandardAnalyzer 将 Document 写入索引,但据我了解,这无关紧要,因为我使用的是 StringField:

new IndexWriter(placeIndex, new IndexWriterConfig(Version.LUCENE_48, new StandardAnalyzer(Version.LUCENE_48)))

我想做的(显然)是运行一个查询,我可以在其中搜索 URI 字段的任何值,然后取回文档。但是,当我使用最后添加到文档中的 URI 值进行查询时,我只会得到一个结果。使用任何其他字段值(即“doesn-t-work”值)进行查询返回零命中。

我正在使用的查询是这样的:

new TermQuery(new Term("uri", "http://www.doesn-t-work.com/foo")) // 0 hits

new TermQuery(new Term("uri", "http://www.this-works.com/bar")) // 1 hit

附加说明:当我通过查询最后一个 URI 来取回文档时,我可以肯定地验证所有三个 URI 值都已存储。这只是似乎被覆盖的索引......(或者我误解了多值StringFields如何/如果工作)。

非常感谢任何提示!

【问题讨论】:

    标签: java scala lucene


    【解决方案1】:

    哎呀——原来这是由另一个问题引起的。我单独测试了这个场景,它以上述方式完美运行。

    然而,在我的应用程序中,我在索引之间一一添加不同的 URI。 IE。我添加了一个 URI,将 Document 写入索引。稍后,我会检索 Document,添加另一个 URI,然后将其写回,等等。

    简而言之,问题在于重用 Documents:当我从头开始创建一个具有多个 URI 字段的新 Document 实例时,一切都很顺利。

    今天的教训,我猜:不要重复使用你的 Lucene 文档。

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      相关资源
      最近更新 更多