【问题标题】:Lucene, relevance/scoring for an in-memory stringLucene,内存中字符串的相关性/评分
【发布时间】:2019-04-07 20:16:19
【问题描述】:

我正在构建一个机器人来监控我感兴趣的主题的 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!

【问题讨论】:

    标签: lucene full-text-search


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2021-07-27
      • 2011-03-22
      • 2021-08-21
      相关资源
      最近更新 更多