Java,Lucene:对命中率最高的搜索结果进行排序。

时间:2017-07-04 08:56:03

标签: java lucene

我正在开发一个Spring-MVC应用程序,我在其中保存用户数据的内容并使用Lucene进行索引和搜索。目前功能正常。 是否可以先将匹配概率最高的结果排序?我目前正在保存索引中的段落或更多文本。谢谢。

保存代码:

 Directory directory = org.apache.lucene.store.FSDirectory.open(path);
            IndexWriterConfig config = new IndexWriterConfig(new SimpleAnalyzer());
            IndexWriter indexWriter = new IndexWriter(directory, config);
            indexWriter.commit();
            org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document();
            if (filePath != null) {
                File file = new File(filePath); // current directory
                doc.add(new TextField("path", file.getPath(), Field.Store.YES));
            }
            doc.add(new StringField("id", String.valueOf(objectId), Field.Store.YES));
FieldType fieldType = new FieldType(TextField.TYPE_STORED);
                fieldType.setTokenized(false);
                if(groupNotes!=null) {
                    doc.add(new Field("contents", text + "\n" + tagFileName+"\n"+String.valueOf(groupNotes.getNoteNumber()), fieldType));
                }else {
                    doc.add(new Field("contents", text + "\n" + tagFileName, fieldType));
                }

搜索代码:

File file = new File(path.toString());
                if ((file.isDirectory()) && (file.list().length > 0)) {
                    if(text.contains(" ")) {
                        String[] textArray = text.split(" ");
                        for(String str : textArray) {
                            Directory directory = FSDirectory.open(path);
                            IndexReader indexReader = DirectoryReader.open(directory);
                            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
                            Query query = new WildcardQuery(new Term("contents","*"+str + "*"));
                            TopDocs topDocs = indexSearcher.search(query, 100);

                            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                                System.out.println("Score is "+scoreDoc.score);
                                org.apache.lucene.document.Document document = indexSearcher.doc(scoreDoc.doc);
                                objectIds.add(Integer.valueOf(document.get("id")));
                            }
                            indexSearcher.getIndexReader().close();
                            directory.close();
                        }
                    }
}
}

谢谢。

1 个答案:

答案 0 :(得分:0)

你的问题对我来说不是很清楚,所以下面只是猜测答案,

  1. IndexSearcher中的方法以org.apache.lucene.search.Sort为参数,

    public TopFieldDocs search(Query query, int n, Sort sort, boolean doDocScores, boolean doMaxScore) throws IOException

    public TopFieldDocs search(Query query, int n, Sort sort) throws IOException

    查看这些方法是否可以解决您的问题。

  2. 如果您只是想根据分数进行排序,那么不要仅收集文档ID,而是在具有该分数字段的pojo中收集分数。

    在一些List然后在外部循环排序列表中收集所有这些pojos 得分。

  3. for (ScoreDoc hit : hits) { //additional code pojo.setScore(hit.score);

        list.add(pojo);
    
       }
    

    然后在for循环之外,

    list.sort((POJO p1, POJO p2) -> p2 .getScore().compareTo(p1.getScore()));