2014-02-23 115 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倍。這不會提高性能,但可以簡化術語向量的處理。如果您對自定義令牌過濾器和分析器不熟悉,則可能不值得使用此方法,並堅持我已經在問題中提出的天真版本。