【发布时间】:2020-02-26 15:53:23
【问题描述】:
我想使用 Lucene.Net 4.8 实现可搜索索引,为用户提供单个单词和短语的建议/自动完成。
索引创建成功;这些建议是我停滞不前的地方。
4.8 版似乎引入了大量的重大更改,但我发现没有可用的示例有效。
我的立场
供参考,LuceneVersion 是这样的:
private readonly LuceneVersion LuceneVersion = LuceneVersion.LUCENE_48;
解决方案 1
I've tried this,但无法通过reader.Terms:
public void TryAutoComplete()
{
var analyzer = new EnglishAnalyzer(LuceneVersion);
var config = new IndexWriterConfig(LuceneVersion, analyzer);
RAMDirectory dir = new RAMDirectory();
using (IndexWriter iw = new IndexWriter(dir, config))
{
Document d = new Document();
TextField f = new TextField("text","",Field.Store.YES);
d.Add(f);
f.SetStringValue("abc");
iw.AddDocument(d);
f.SetStringValue("colorado");
iw.AddDocument(d);
f.SetStringValue("coloring book");
iw.AddDocument(d);
iw.Commit();
using (IndexReader reader = iw.GetReader(false))
{
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.Termsno longer exists。作为 Lucene 的新手,目前还不清楚如何重构它。
解决方案 2
尝试this,报错:
public void TryAutoComplete2()
{
using(var analyzer = new EnglishAnalyzer(LuceneVersion))
{
IndexWriterConfig config = new IndexWriterConfig(LuceneVersion, analyzer);
RAMDirectory dir = new RAMDirectory();
using(var iw = new IndexWriter(dir,config))
{
Document d = new Document()
{
new TextField("text", "this is a document with a some words",Field.Store.YES),
new Int32Field("id", 42, Field.Store.YES)
};
iw.AddDocument(d);
iw.Commit();
using (IndexReader reader = iw.GetReader(false))
using (SpellChecker speller = new SpellChecker(new RAMDirectory()))
{
//ERROR HERE!!!
speller.IndexDictionary(new LuceneDictionary(reader, "text"), config, false);
string[] suggestions = speller.SuggestSimilar("dcument", 5);
IndexSearcher searcher = new IndexSearcher(reader);
foreach (string suggestion in suggestions)
{
TopDocs docs = searcher.Search(new TermQuery(new Term("text", suggestion)), null, Int32.MaxValue);
foreach (var doc in docs.ScoreDocs)
{
System.Diagnostics.Debug.WriteLine(searcher.Doc(doc.Doc).Get("id"));
}
}
}
}
}
}
调试时,speller.IndexDictionary(new LuceneDictionary(reader, "text"), config, false); 抛出了The object cannot be set twice! 错误,我无法解释。
欢迎提出任何想法。
澄清
我想返回给定输入的建议术语列表,而不是文档或其完整内容。
例如,如果文档包含“您好,我的名字是 Clark。我来自亚特兰大”,并且我提交了“Atl”,那么“Atlanta”应该作为建议返回。
【问题讨论】:
标签: c# lucene.net