2014-02-23 79 views
4

我想使用Lucene.NET来存储和查询术语向量。但是,我不希望从文档创建术语向量。相反,我希望能够直接编写和更新术语向量,而不需要术语/标记的位置或偏移量。是否可以直接修改术语频率/术语向量?

的解决方法是从术语向量

foo: 3; bar: 1

生成从术语载体,即文本生成文本

foo, foo, foo, bar

和让Lucene索引该文本。如果我想更新吧期限频率2,我能得到存储的文本(或从旧项向量生成它,如果我不保存它),将其更改为

foo, foo, foo, bar, bar

并更新索引中的相关文档。

这对于这样一个简单的任务来说相当昂贵。很明显,这不是用例,Lucene是为了用来构建的。尽管如此,我还是希望能够使用Lucene的强大功能来查询等。

有没有办法直接为文档编写术语向量,或者您是否有其他好的想法?

+1

嗨,我有同样的问题。你有没有找到解决方案? – eroy4u

+0

@ eroy4u:不是,看看我的回答如下... – Marc

+0

对于Elasticsearch同样的问题 - 我认为这个功能会非常有用。 –

回答

2

正如我在我的问题中所说的,Lucene不适用于直接存储和操作术语向量。最初的方法是或多或少地与问候至少去更新所述词语向量的处理方式:

  1. 检索其表示相关的术语向量
  2. 更新文档
  3. 的根据字段文档
  4. 重新索引文件(Delete, then Add在Lucene中等于Update

我还没有找到一种方法来更新所述向量的单个术语频率而不重新索引整个文档。在问题中描述的方法的

一个改进是编码termvector作为术语频率对:

代替

FOO FOO FOO酒吧

字段内容可以写为

foo:3;棒:1;

然后,您可以编写自定义TokenFilter读取这些标记逐一然后返回术语n倍。这不会提高性能,但可以简化术语向量的处理。如果您对自定义令牌过滤器和分析器不熟悉,则可能不值得使用此方法,并坚持我已经在问题中提出的天真版本。