Lucene.net和部分“开头”短语搜索

我正在寻找在大量城市名称上构建一个自动完成的文本框。 搜索function如下:我希望在多词短语中搜索“开始”。 例如,如果用户输入“chicago he”,则只需返回“Chicago Heights”等位置。
我正在尝试使用Lucene。 我在理解如何实施这个问题时遇到了问题。

我已经尝试过我认为应该有效的方法:

我用KeywordAnalyzer索引了位置(我已尝试过TOKENIZED和UN_TOKENIZED):

doc.Add(new Field("Name", data.ToLower(), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.NO)); 

并通过以下方式搜索它们(我还尝试了各种其他查询/分析器/等):

 var luceneQuery = new BooleanQuery(); var wildcardQuery = new WildcardQuery(new Term("Name", "chicago hei*")); luceneQuery.Add(wildcardQuery, BooleanClause.Occur.MUST); 

我没有得到任何结果。 非常感谢任何建议。

为此,您需要使用Field.Index.NOT_ANALYZED设置索引字段,该设置与您使用的UN_TOKENIZED相同,因此它应该可以工作。 下面是一个工作样本,我很快就做了测试。 我正在使用Nuget上的最新版本

 IndexWriter iw = new IndexWriter(@"C:\temp\sotests", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true); Document doc = new Document(); Field loc = new Field("location", "", Field.Store.YES, Field.Index.NOT_ANALYZED); doc.Add(loc); loc.SetValue("chicago heights"); iw.AddDocument(doc); loc.SetValue("new-york"); iw.AddDocument(doc); loc.SetValue("chicago low"); iw.AddDocument(doc); loc.SetValue("montreal"); iw.AddDocument(doc); loc.SetValue("paris"); iw.AddDocument(doc); iw.Commit(); IndexSearcher ins = new IndexSearcher(iw.GetReader()); WildcardQuery query = new WildcardQuery(new Term("location", "chicago he*")); var hits = ins.Search(query); for (int i = 0; i < hits.Length(); i++) Console.WriteLine(hits.Doc(i).GetField("location").StringValue()); Console.WriteLine("---"); query = new WildcardQuery(new Term("location", "chic*")); hits = ins.Search(query); for (int i = 0; i < hits.Length(); i++) Console.WriteLine(hits.Doc(i).GetField("location").StringValue()); iw.Close(); Console.ReadLine(); 

保证“以”开始搜索的唯一方法是在索引字符串的开头放置分隔符,因此“钻石环”的索引类似于“lucenedelimiter diamond ring lucenedelimiter”。 这可以防止搜索“着名的钻石岭度假村”出现在寻找“钻石ri *”。