Lucene,内存中字符串的相关性/得分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene,内存中字符串的相关性/得分相关的知识,希望对你有一定的参考价值。

我正在构建一个监视HN的机器人,以寻找我感兴趣的主题。

我想分析一个内存中的字符串,并确定它是否包含我感兴趣的一些关键字。

我希望它能够考虑Lucene在执行标准查询时所做的事情(词干,停止词,标准化标点符号等)。

我可以构建一个内存中的索引,并使用常规方法进行查询,但有没有办法可以使用Lucene的内部来避免构建不必要的索引?

如果我可以获得相关性值(0.0-1.0),而不仅仅是真/假值,则可以获得奖励积分。

伪代码:

public static decimal IsRelevant(string keywords, string input)
{
   // Does the "input" variable look like it contains "keywords"?
}

IsRelevant("books", "I just bought a book, and I like it."); // matching!
IsRelevant("book", "I just bought many books!"); // matching!

答案

我使用内存搜索索引创建了一个解决方案。这不是理想的,但它完成了任务。

public static float RelevanceScore(string keyword, string input)
{
    var directory = new RAMDirectory();
    var analyzer = new EnglishAnalyzer(LuceneVersion.LUCENE_48);

    using (var writer = new IndexWriter(directory, new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer)))
    {
        var doc = new Document();
        doc.Add(new Field("input", input, Field.Store.YES, Field.Index.ANALYZED));

        writer.AddDocument(doc);

        writer.Commit();
    }

    using (var reader = IndexReader.Open(directory))
    {
        var searcher = new IndexSearcher(reader);

        var parser = new QueryParser(LuceneVersion.LUCENE_48, "input", analyzer);
        var query = parser.Parse(keyword);

        var result = searcher.Search(query, null, 10);

        if (result.ScoreDocs.Length == 0)
        {
            return 0;
        }

        var doc = result.ScoreDocs.Single();
        return doc.Score;
    }
}

以上是关于Lucene,内存中字符串的相关性/得分的主要内容,如果未能解决你的问题,请参考以下文章

Lucene08-Lucene的相关度排序

Elasticsearch——评分机制详解

Lucene 时间排序

Lucene底层储存结构优化和相关度排序

Lucene 五分钟教程

cassandra lucene - 如何获得更高的分数