Lucene.net和部分搜索短语“开头”(Lucene.net and partial “star

2019-09-21 20:33发布

我期待在城市名称的大量建立一个自动完成文本框。 搜索功能如下:我想搜索在多词短语“大词典”。 例如,如果用户在输入“芝加哥他”,只有诸如“芝加哥高地”位置需要归还。
我想利用Lucene实现这一点。 我在了解如何需要实现的问题。

我已经试过我觉得是应该的工作方式:

我已经用索引KeywordAnalyzer(我都试过记号化和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);

我没有得到任何结果。 希望得到任何建议。

Answer 1:

要做到这一点,你需要索引你的领域与Field.Index.NOT_ANALYZED设置,这是一样的,你用UN_TOKENIZED,所以它应该工作。 继承人我很快做出了一个工作样本进行测试。 IM使用可用上的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();


Answer 2:

以保证只有这样,“打头”的搜索是把一个分隔符的索引字符串的开头,所以“钻石戒指”被收录,如“lucenedelimiter钻戒lucenedelimiter”。 这样可以防止从搜索在搜索转向了“钻石里*”调高“的著名钻石岭度假村”。



文章来源: Lucene.net and partial “starts with” phrase search