Java Lucene评分函数

Java Lucene评分函数,java,twitter,lucene,Java,Twitter,Lucene,我正在开发一个系统,在索引中索引和搜索tweet,每个tweet都有一个定义其社会重要性(社会价值)的字段,我想将这个值添加到相似度得分中,这样我就可以通过将文档的社会价值和它们在查询中的得分相结合来对文档进行排序 例如,我的评分函数如下 Final Score = QueryScore + Social score ( which is a float that I already calculated) 那么我如何才能做到这一点呢 我正在使用lucene-5.5.0 package Luc

我正在开发一个系统,在索引中索引和搜索tweet,每个tweet都有一个定义其社会重要性(社会价值)的字段,我想将这个值添加到相似度得分中,这样我就可以通过将文档的社会价值和它们在查询中的得分相结合来对文档进行排序

例如,我的评分函数如下

Final Score = QueryScore + Social score ( which is a float that I already calculated)
那么我如何才能做到这一点呢

我正在使用lucene-5.5.0

package Lucene;


import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class SearchFiles {

    @SuppressWarnings("deprecation")
    public static void main(String[] args){
        try{

            Path path = Paths.get("C:\\Users\\JUGURTHA\\Desktop\\boulot\\index");
            Directory dir = FSDirectory.open(path);
            DirectoryReader ireader = DirectoryReader.open(dir);
            IndexSearcher isearcher = new IndexSearcher(ireader);
            StandardAnalyzer analyzer = new StandardAnalyzer();
            //get each token            
            QueryParser parser = new QueryParser("text", analyzer);
            Query query = parser.parse("Love");
            ScoreDoc[] hits = isearcher.search(query, null, 20).scoreDocs;
            for (int i = 0; i <  hits.length; i++){
                Document hitDoc = isearcher.doc(hits[i].doc);
                System.out.println("Tweet " + i + " : " + hitDoc.get("text"));
                System.out.println("created_at: " + hitDoc.get("date"));
                System.out.println("id: " + hitDoc.get("id"));
                System.out.println();
                System.out.println();

            }


        } catch(Exception e){
            e.printStackTrace();
        }
    }
}
封装Lucene;
导入java.nio.file.Path;
导入java.nio.file.path;
导入org.apache.lucene.analysis.standard.StandardAnalyzer;
导入org.apache.lucene.document.document;
导入org.apache.lucene.index.DirectoryReader;
导入org.apache.lucene.search.indexsearch;
导入org.apache.lucene.search.Query;
导入org.apache.lucene.queryparser.classic.queryparser;
导入org.apache.lucene.search.ScoreDoc;
导入org.apache.lucene.store.Directory;
导入org.apache.lucene.store.FSDirectory;
公共类搜索文件{
@抑制警告(“弃用”)
公共静态void main(字符串[]args){
试一试{
Path Path=Path.get(“C:\\Users\\JUGURTHA\\Desktop\\boulot\\index”);
Directory dir=FSDirectory.open(路径);
DirectoryReader ireader=DirectoryReader.open(dir);
IndexSearcher isearcher=新的IndexSearcher(ireader);
StandardAnalyzer=新的StandardAnalyzer();
//获取每个令牌
QueryParser解析器=新的QueryParser(“文本”,分析器);
Query=parser.parse(“爱”);
ScoreDoc[]hits=isearcher.search(查询,空,20).scoreDocs;
for(int i=0;i
我找到了完成工作的方法,使用了CustomScoreProvider类,得到了我想要的结果

class CustomizedScoreProvider extends CustomScoreProvider {

    public CustomizedScoreProvider(LeafReaderContext reader) {
            super(reader);
            // TODO Auto-generated constructor stub
        }

    public  float customScore(int doc, float subQueryScore,float valSrcScores[]){

     try {

         subQueryScore+=4; // I only added this for testing , 
     } catch(Exception e) { 
         e.printStackTrace();
            }
    return subQueryScore;
             }
    }

class CustomizedScoreQuery extends CustomScoreQuery{


public CustomizedScoreQuery(Query subQuery,IndexReader ireader) {
        super(subQuery);
        // TODO Auto-generated constructor stub
    }
public CustomizedScoreProvider getCustomScoreProvider (LeafReaderContext reader){
    CustomizedScoreProvider i=new CustomizedScoreProvider(reader);
     return (i);
}
}

我找到了完成工作的方法,使用了CustomScoreProvider类,得到了我想要的结果

class CustomizedScoreProvider extends CustomScoreProvider {

    public CustomizedScoreProvider(LeafReaderContext reader) {
            super(reader);
            // TODO Auto-generated constructor stub
        }

    public  float customScore(int doc, float subQueryScore,float valSrcScores[]){

     try {

         subQueryScore+=4; // I only added this for testing , 
     } catch(Exception e) { 
         e.printStackTrace();
            }
    return subQueryScore;
             }
    }

class CustomizedScoreQuery extends CustomScoreQuery{


public CustomizedScoreQuery(Query subQuery,IndexReader ireader) {
        super(subQuery);
        // TODO Auto-generated constructor stub
    }
public CustomizedScoreProvider getCustomScoreProvider (LeafReaderContext reader){
    CustomizedScoreProvider i=new CustomizedScoreProvider(reader);
     return (i);
}
}

我已经解决了这个问题,我使用了CustomScoreProvider类我已经解决了这个问题,我使用了CustomScoreProvider类