3

大量の都市名にオートコンプリート テキスト ボックスを作成しようとしています。検索機能は次のとおりです。複数の単語からなるフレーズに対して「で始まる」検索が必要です。たとえば、ユーザーが「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);

結果が出ません。アドバイスをいただければ幸いです。

4

2 に答える 2

3

Field.Index.NOT_ANALYZEDこれを行うには、使用する UN_TOKENIZED と同じ設定でフィールドにインデックスを付ける必要があるため、機能するはずです。Heres は、私がすぐにテストするために作成した実用的なサンプルです。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();
于 2012-08-28T19:44:13.253 に答える
0

「で始まる」検索を保証する唯一の方法は、インデックス付き文字列の先頭に区切り文字を配置することです。そのため、「ダイヤモンド リング」は「lucenedelimiter ダイヤモンド リング lucenedelimiter」のようにインデックス付けされます。これにより、「有名なダイヤモンド リッジ リゾート」という検索結果が「ダイヤモンド ri*」の検索で表示されなくなります。

于 2012-08-28T22:34:21.163 に答える