2013-04-12 88 views
2

我有一個Lucene索引存儲客戶,基本上包括一個視圖模型(存儲和未索引的文檔字段),ID(字段存儲和索引,以便查找和更新文檔) ,以及谷歌搜索(名詞Term的多個字段實例)涵蓋的術語列表。術語可能是視圖模型中的字段或不是。谷歌喜歡與Lucene.net autosuggest

這適用於按字詞實際搜索文檔。問題是我如何實現自動建議,基本上得到可能是輸入值的延續(即「Co」可能導致「Colorado」,「Coloring Book」)的術語(字段,而非Lucene術語) 」等,因爲這些都是在至少一個文檔的期限場實際值。

+0

只是爲了澄清,是否在您的索引中將「圖畫書」索引爲單個術語? –

+0

是的。 1 Lucene文檔將在其中包含多個Term字段,如客戶名稱,客戶所在的城市,參考編號... – Rich

回答

1

Theres很多的方式做到這一點,但如果你需要一個快速和簡單的方法來做到這一點,使用TermEnum

只需將這個小代碼示例粘貼到新的C#控制檯應用程序中,並檢查它是否適用於您。

RAMDirectory dir = new RAMDirectory(); 
IndexWriter iw = new IndexWriter(dir, new KeywordAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED); 

Document d = new Document(); 
Field f = new Field("text", "", Field.Store.YES, Field.Index.ANALYZED); 
d.Add(f); 

f.SetValue("abc"); 
iw.AddDocument(d); 

f.SetValue("colorado"); 
iw.AddDocument(d); 

f.SetValue("coloring book"); 
iw.AddDocument(d); 

iw.Commit(); 
IndexReader reader = iw.GetReader(); 

TermEnum terms = reader.Terms(new Term("text", "co")); 
int maxSuggestsCpt = 0; 
// will print: 
// colorado 
// coloring book 
do 
{ 
    Console.WriteLine(terms.Term.Text); 
    maxSuggestsCpt++; 
    if (maxSuggestsCpt >= 5) 
     break; 
} 
while (terms.Next() && terms.Term.Text.StartsWith("co")); 

reader.Dispose(); 
iw.Dispose(); 
+0

此示例看起來像我應該需要的。謝謝。希望儘快試用。 – Rich

+0

您的示例工作正常,但出於某種原因,使用我的索引,它似乎忽略了我傳入的值,並從頭開始。 – Rich

+0

@Rich你在現場使用哪種分析儀? –