我正在开发一个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();
}
}
}
}
谢谢。
答案 0 :(得分:0)
你的问题对我来说不是很清楚,所以下面只是猜测答案,
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
查看这些方法是否可以解决您的问题。
如果您只是想根据分数进行排序,那么不要仅收集文档ID,而是在具有该分数字段的pojo中收集分数。
在一些List
然后在外部循环排序列表中收集所有这些pojos
得分。
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()));