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 を使用しています