我想使用Lucene.NET来存储和查询术语向量。但是,我不希望从文档中创建术语向量。相反,我希望能够直接编写和更新术语向量,而无需术语/令牌的位置或偏移。
解决方法是从术语向量生成文本,即从术语向量
生成文本 foo: 3; bar: 1
生成文本
foo, foo, foo, bar
让Lucene索引该文本。如果我想将条形频率更新为2
,我可以获取存储的文本(或者从旧术语向量生成它,如果我不存储它),将其更改为
foo, foo, foo, bar, bar
并更新索引中的相应文档。
这对于这么简单的任务来说非常昂贵。显然,这不是用例,Lucene是用来构建的。不过,我希望能够使用Lucene的强大功能进行查询等。
有没有办法直接为文档编写术语向量,还是有其他好的想法?
答案 0 :(得分:2)
正如我在我的问题中所说,Lucene不是用于直接存储和操纵术语向量。最初的方法或多或少是关于更新术语向量的过程的方式:
Delete, then Add
等于Update
)我没有找到更新矢量中单个术语频率的方法,而无需重新索引整个文档。
问题中描述的方法的一个改进是将termvector编码为术语 - 频率对:
而不是
foo foo foo bar
字段内容可以写为
FOO:3;棒:1;
然后,您可以编写一个自定义TokenFilter
,逐个读取这些令牌,然后返回n
次。这不会提高性能,但会简化术语向量的处理。如果您不熟悉自定义令牌过滤器和分析器,那么使用这种方法可能不值得,我会坚持使用我在问题中建议的天真版本。