首页 > 解决方案 > 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!

标签: lucenefull-text-search

解决方案


I created a solution using an in-memory search index. It's not ideal, but it does the task.

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;
    }
}

推荐阅读