如何在Lucene中获得类似的文件?

时间:2013-06-12 18:29:52

标签: lucene lucene.net similarity morelikethis

我想在Lucene得分类似的文件。让我解释一下我的情景。

例如,假设我在我创建索引的文件中有以下记录。

ID|First Name|Last Name|DOB
1 |John      |Doe      |03/18/1990
1 |John      |Twain    |03/18/1990
3 |Joey      |Johnson  |05/14/1978
3 |Joey      |Johnson  |05/14/1987
4 |Joey      |Johnson  |05/14/1987 

当我搜索“John Doe”时

我创建的搜索索引将按以下顺序显示记录

ID|First Name|Last Name|DOB
1 |John      |Doe      |03/18/1990
3 |Joey      |Johnson  |05/14/1978
3 |Joey      |Johnson  |05/14/1987
4 |Joey      |Johnson  |05/14/1987
1 |John      |Twain    |03/18/1990 
2 |Daniel    |Doe      |03/25/1989

正如您所看到的,Lucene根据我搜索的条件显示记录,但不根据记录之间的相似性。我想让它用提供的术语搜索记录,但根据它们的相似性显示它们。

我想要什么

ID|First Name|Last Name|DOB
1 |John      |Doe      |03/18/1990
1 |John      |Twain    |03/18/1990 
3 |Joey      |Johnson  |05/14/1978
3 |Joey      |Johnson  |05/14/1987
4 |Joey      |Johnson  |05/14/1987
2 |Daniel    |Doe      |03/25/1989

这里记录的John Twain和John Doe一起显示,因为它们都很相似,其中一个在用户查询中有最大匹配。

你来找我吗?

搜索代码。

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类,但不确定我是否正确行事,或者即使它是正确的方法。此外,我将如何为两个或更多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);

如果您有任何疑问,请与我们联系。

我试图在过去两周内学习Lucene,所以不太了解它。

注意:我使用的是Lucene.Net 3.0.3

1 个答案:

答案 0 :(得分:2)

你能展示方法QueryMaker()的代码吗?

我认为您可以创建一个由firstname和lastname组成的新字段"name",并且可以使用FuzzyQuery在新字段中进行搜索。根据levenshtein字符串距离,FuzzyQuery是得分文档。