gpt4 book ai didi

java - Lucene:获取类别的最新文档

转载 作者:行者123 更新时间:2023-11-29 08:51:36 28 4
gpt4 key购买 nike

我是 lucene 索引的新手,所以如果我想做的事情微不足道,我提前道歉。我有一个索引,其中文档包含(除其他外)两个字段:

documentoIdemployeeId

每个员工都可以提交各种文件。结构与 bookstore 中的结构几乎相同。例子。
我想要实现的是获取所有与查询匹配的最新文档,这意味着每个 employeeId 具有最高的 documentoId

在 SQL 中,这类似于:

选择最大值(documentoId),employeeId
从文件
像“mySearchValue”这样的内容
按 employeeId 分组

我不知道我是否应该使用 facet API,或者这是否可以通过查询或 searchAfter 方法来完成...我对文档感到很迷茫。

任何帮助将不胜感激!谢谢

最佳答案

Lucene支持分组搜索;您需要做的是定义您的组以及如何对其进行排序。在下面的示例中,我按 documentoId 分组并按降序排序。

public static void main(String[] args) throws IOException, ParseException {
StandardAnalyzer standardAnalyzer = new StandardAnalyzer(Version.LUCENE_46);
RAMDirectory ramDirectory = new RAMDirectory();

IndexWriter indexWriter = new IndexWriter(ramDirectory, new IndexWriterConfig(Version.LUCENE_46, standardAnalyzer));

Document d0 = new Document();
d0.add(new TextField("employeeId", "foo", Field.Store.YES));
d0.add(new IntField("documentoId", 1, Field.Store.YES));
indexWriter.addDocument(d0);

Document d1 = new Document();
d1.add(new TextField("employeeId", "bar", Field.Store.YES));
d1.add(new IntField("documentoId", 20, Field.Store.YES));
indexWriter.addDocument(d1);

Document d2 = new Document();
d2.add(new TextField("employeeId", "baz", Field.Store.YES));
d2.add(new IntField("documentoId", 3, Field.Store.YES));
indexWriter.addDocument(d2);

indexWriter.commit();

GroupingSearch groupingSearch = new GroupingSearch("documentoId");
Sort groupSort = new Sort(new SortField("documentoId", SortField.Type.INT, true)); // in descending order
groupingSearch.setGroupSort(groupSort);
groupingSearch.setSortWithinGroup(groupSort);

IndexReader reader = DirectoryReader.open(ramDirectory);
IndexSearcher searcher = new IndexSearcher(reader);

TopGroups<?> groups = groupingSearch.search(searcher, new MatchAllDocsQuery(), 0, 10);

Document highestScoredDocument = reader.document(groups.groups[0].scoreDocs[0].doc);
System.out.println(
"Descending order, first document is " +
"employeeId:" + highestScoredDocument.get("employeeId") + " " +
"documentoId:" + highestScoredDocument.get("documentoId")
);
}

上面的代码检测到 d1(中间文档)得分最高并打印以下内容:

Descending order, first document is employeeId:bar documentoId:20

上面的代码没有解决 content like 'mySearchValue' 部分,您必须将 MatchAllDocsQuery 替换为相关查询才能做到这一点。

关于java - Lucene:获取类别的最新文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22564763/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com