我想在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
最佳答案 你能展示QueryMaker()方法的代码吗?
我认为你可以创建一个由firstname和lastname组成的新字段“name”,你可以使用FuzzyQuery在新字段中搜索. FuzzyQuery是根据字符串的levenshtein距离得分的文档.