4

Lucene で同様のドキュメントをスコア付けしたいと考えています。私のシナリオを説明しましょう。

たとえば、インデックスを作成したファイルに次のレコードがあるとします。

ID|名|姓|生年月日
1 |ジョン |ドウ |1990 年 3 月 18 日
1 |ジョン |トウェイン |1990 年 3 月 18 日
3 |ジョーイ |ジョンソン |1978 年 5 月 14 日
3 |ジョーイ |ジョンソン |1987 年 5 月 14 日
4 |ジョーイ |ジョンソン |1987/05/14

「ジョン・ドウ」で検索すると

作成した検索インデックスは、次の順序でレコードを表示します

ID|名|姓|生年月日
1 |ジョン |ドウ |1990 年 3 月 18 日
3 |ジョーイ |ジョンソン |1978 年 5 月 14 日
3 |ジョーイ |ジョンソン |1987 年 5 月 14 日
4 |ジョーイ |ジョンソン |1987/05/14
1 |ジョン |トウェイン |1990 年 3 月 18 日
2 |ダニエル |ドゥ |1989/03/25

ご覧のとおり、Lucene は検索した用語に従ってレコードを表示していますが、レコード間の類似性に従ってではありません。提供された用語でレコードを検索したいが、それらの類似性に基づいて表示したい。

私が欲しいもの

ID|名|姓|生年月日
1 |ジョン |ドウ |1990 年 3 月 18 日
1 |ジョン |トウェイン |1990 年 3 月 18 日
3 |ジョーイ |ジョンソン |1978 年 5 月 14 日
3 |ジョーイ |ジョンソン |1987 年 5 月 14 日
4 |ジョーイ |ジョンソン |1987/05/14
2 |ダニエル |ドゥ |1989/03/25

ここでは、レコード John Twain と John Doe が一緒に表示されています。これは、どちらも類似しており、そのうちの 1 つがユーザー クエリで最大一致したためです。

あなたは私を手に入れていますか?

検索コード。

String sa=textbox1.Text; // Assume this value to be John Doe in this case.
String[] searchfield= new string[] { "ID", "First Name", "Last Name","DOB"};
IndexReader reader = IndexReader.Open(dir, true);
TopScoreDocCollector coll = TopScoreDocCollector.Create(50, true);
indexSearcher.Search(QueryMaker(sa, searchfield), coll);
        ScoreDoc[] hits = coll.TopDocs().ScoreDocs;
for (int i = 0; i < hits.Length; i++)
        {
            SearchResults result = new SearchResults();
            int docID = hits[i].Doc;
            Document d = indexSearcher.Doc(docID);
            result.fname=d.Get("First Name").ToString();
         }

試みた方法:

私は MoreLikeThis クラスを使用しようとしていましたが、それが正しいのか、それとも正しい方法なのかさえわかりません。さらに、2 つ以上の docid に対して Like メソッドを使用するにはどうすればよいですか? また、docid を使用すると、同じリーダーから読み取っているため、重複したドキュメントが表示されます

コード:

IndexSearcher mltsearcher = new IndexSearcher(reader);
MoreLikeThis mlt = new MoreLikeThis(reader);
int docid =hits[1].Doc;
Query query = mlt.Like(docid);
TopDocs similardocs = mltsearcher.Search(query, 10);

ご不明な点がございましたら、お知らせください。

私は過去 2 週間から Lucene を学ぼうとしているので、よくわかりません。

注: Lucene.Net 3.0.3 を使用しています

4

1 に答える 1

2

メソッドのコードを表示できますQueryMaker()か?

"name"姓と名の両方で構成された新しいフィールドを作成し、新しいフィールドでFuzzyQuery検索するために使用できると思います。FuzzyQuery文字列のレーベンシュタイン距離に応じたスコア ドキュメントです。

于 2013-06-17T06:47:36.313 に答える