【问题标题】:How to score similar documents in Lucene?如何在 Lucene 中对类似的文档进行评分?
【发布时间】:2013-06-08 23:48:00
【问题描述】:

我想在 Lucene 中对类似的文档进行评分。让我解释一下我的情况。

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

ID|名字|姓氏|出生日期 1 |约翰 |Doe |03/18/1990 1 |约翰 |吐温 |03/18/1990 3 |乔伊 |约翰逊 |05/14/1978 3 |乔伊 |约翰逊 |05/14/1987 4 |乔伊 |约翰逊 |05/14/1987

当我搜索“John Doe”时

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

ID|名字|姓氏|出生日期 1 |约翰 |Doe |03/18/1990 3 |乔伊 |约翰逊 |05/14/1978 3 |乔伊 |约翰逊 |05/14/1987 4 |乔伊 |约翰逊 |05/14/1987 1 |约翰 |吐温 |03/18/1990 2 |丹尼尔 |Doe |03/25/1989

如您所见,Lucene 根据我搜索的术语显示记录,而不是根据记录之间的相似性显示记录。我希望它使用提供的术语搜索记录,但根据它们的相似性显示它们。

我想要什么

ID|名字|姓氏|出生日期 1 |约翰 |Doe |03/18/1990 1 |约翰 |吐温 |03/18/1990 3 |乔伊 |约翰逊 |05/14/1978 3 |乔伊 |约翰逊 |05/14/1987 4 |乔伊 |约翰逊 |05/14/1987 2 |丹尼尔 |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

【问题讨论】:

  • sasearchfield的值是多少?
  • sa 是用户输入的查询。 String sa=textbox1.Text 和 String String[] SearchField= new string[] { "ID", "First Name", "Last Name","DOB"};

标签: lucene lucene.net similarity morelikethis


【解决方案1】:

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

我认为你可以创建一个新字段"name",它由名字和姓氏组成,你可以使用FuzzyQuery 在新字段中搜索。 FuzzyQuery 是根据字符串的 levenshtein 距离对文档进行评分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 2012-03-16
    • 1970-01-01
    • 2017-01-04
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多