【问题标题】:Can I insert a Document into Lucene without generating a TokenStream?我可以在不生成 TokenStream 的情况下将文档插入 Lucene 吗?
【发布时间】:2013-06-30 05:17:49
【问题描述】:

有没有办法通过直接提供术语和术语频率而不是通过分析和/或 TokenStream 来将文档添加到索引中?我问是因为我想对一些我知道术语频率的数据进行建模,但没有要分析的基础文本文档。我可以通过多次重复相同的术语来创建一个(在这种情况下,我也不关心位置或突出显示,只是得分),但这似乎有点不合常理(并且可能比直接提供计数要慢)。

(也在邮件列表中询问)

【问题讨论】:

  • 我正试图弄清楚如何使用 Solr (stackoverflow.com/questions/17996604/…) 做同样的事情。 femtoRgon 下面的答案是否对您来说是最佳解决方案?
  • 我认为这将是最好的方式,但我还没有实现

标签: lucene indexing scoring


【解决方案1】:

无论如何,您不需要将所有内容都通过分析器来创建文档。我不知道有什么方法可以按照您的要求传递术语和频率(尽管我很想知道您是否找到了一种好的方法),但是您当然可以传递 IndexableFields 一个学期一次。这仍然需要您多次添加每个术语,例如:

IndexableField field = new StringField(fieldName, myTerm, FieldType.TYPE_NOT_STORED);
for (int i = 0; i < frequency; i++) {
    document.add(field);
}

您还可以后退一步,完全删除 Document 类,例如使用任何 Iterable&lt;IndexableField&gt;,一个简单的 List,这可能足以使用更直接的方法对数据进行建模.

不确定这是否能让你更接近你正在寻找的东西,但也许是朝着正确方向模糊的一步。

【讨论】:

  • 是的,考虑到标准的公共 Lucene API,这似乎是最好的方法。任何更直接的方法似乎都涉及到一些相当低级的方法。它类似于:定义一个新的 IndexingChain,将其作为 IndexWriterConfig 的一部分传递。然后在链中,定义一种不同类型的 DocFieldConsumer,以特殊方式处理特殊字段。
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2020-06-20
  • 2018-05-02
  • 1970-01-01
  • 2012-11-26
  • 2014-07-04
  • 2012-08-16
相关资源
最近更新 更多