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