当我不知道创建时的最大大小时,如何使用 Lucene 的 PriorityQueue?

2024-01-27

我为 Lucene.Net 构建了一个自定义收集器,但我不知道如何对结果进行排序(或分页)。每次调用 Collect 时,我都可以将结果添加到内部 PriorityQueue 中,我认为这是执行此操作的正确方法。

我扩展了 PriorityQueue,但它在创建时需要一个大小参数。您必须在构造函数中调用 Initialize 并传入最大大小。

然而,在收集器中,搜索器仅在获得新结果时调用 Collect,因此我不知道创建 PriorityQueue 时有多少结果。基于此,我不知道如何使 PriorityQueue 工作。

我意识到我可能在这里遗漏了一些简单的东西......


优先队列不是SortedList or SortedDictionary。 它是一种排序实现,它返回 N 个元素的前 M 个结果(您的 PriorityQueue 的大小)。您可以添加InsertWithOverflow你想要多少个元素就可以多少,但它只会保存最上面的 M 个元素。

假设您的搜索结果为 1000000 次点击。您会将所有结果返回给用户吗? 更好的方法是将前 10 个元素返回给用户(使用PriorityQueue(10)) 和 如果用户请求下 10 个结果,您可以使用以下命令进行新搜索PriorityQueue(20)并返回下一个10元素等。 这是大多数搜索引擎(如谷歌)使用的技巧。

Everytime Commit gets called, I can add the result to an internal PriorityQueue.

我无法理解之间的关系Commit and search,因此我将附上 PriorityQueue 的示例用法:

public class CustomQueue : Lucene.Net.Util.PriorityQueue<Document>
{
    public CustomQueue(int maxSize): base()
    {
        Initialize(maxSize);
    }

    public override bool LessThan(Document a, Document b)
    {
        //a.GetField("field1")
        //b.GetField("field2");
        return  //compare a & b
    }
}

public class MyCollector : Lucene.Net.Search.Collector
{
    CustomQueue _queue = null;
    IndexReader _currentReader;

    public MyCollector(int maxSize)
    {
        _queue = new CustomQueue(maxSize);
    }

    public override bool AcceptsDocsOutOfOrder()
    {
        return true;
    }

    public override void Collect(int doc)
    {
        _queue.InsertWithOverflow(_currentReader.Document(doc));
    }

    public override void SetNextReader(IndexReader reader, int docBase)
    {
        _currentReader = reader;
    }

    public override void SetScorer(Scorer scorer)
    {
    }
}

searcher.Search(query,new MyCollector(10)) //First page.
searcher.Search(query,new MyCollector(20)) //2nd page.
searcher.Search(query,new MyCollector(30)) //3rd page.

编辑@nokturnal

public class MyPriorityQueue<TObj, TComp> : Lucene.Net.Util.PriorityQueue<TObj>
                                where TComp : IComparable<TComp>
{
    Func<TObj, TComp> _KeySelector;

    public MyPriorityQueue(int size, Func<TObj, TComp> keySelector) : base()
    {
        _KeySelector = keySelector;
        Initialize(size);
    }

    public override bool LessThan(TObj a, TObj b)
    {
        return _KeySelector(a).CompareTo(_KeySelector(b)) < 0;
    }

    public IEnumerable<TObj> Items
    {
        get
        {
            int size = Size();
            for (int i = 0; i < size; i++)
                yield return Pop();
        }
    }
}

var pq = new MyPriorityQueue<Document, string>(3, doc => doc.GetField("SomeField").StringValue);
foreach (var item in pq.Items)
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我不知道创建时的最大大小时,如何使用 Lucene 的 PriorityQueue? 的相关文章

  • Solr 查询无法正常工作

    我不知道出了什么问题 这实际上是一个非常简单的查询 在我的 Solr 搜索中不起作用 http IP ADDRESS solr CORE NAME select indent on q Bangalore wt json 我的数据库中有超过
  • Solr 中的 docValues 是什么?我什么时候应该使用它们?

    因此 我阅读了多个来源 试图解释 Solr 中的 docValues 是什么 但我似乎不明白何时应该使用它们 尤其是与索引字段和存储字段相关的时候 谁能解释一下吗 Solr 中的 docValues 是什么 Doc Values 可以解释为
  • Umbraco 检查 - 查询问题

    我使用 检查 检索的对象具有以下数据值 图片链接 https i stack imgur com 8sUOb jpg为了更方便查看 Icon icon shopping basket alt 2 color red IndexType co
  • Lucene 查询解析器在查询条件中带有“/”

    当我尝试在 Lucene 中搜索诸如 解决方法 修复 之类的内容时 它会抛出此错误 org apache lucene queryparser classic ParseException Cannot parse workaround f
  • 在哪里可以找到 Apache Lucene/Solr 的性能基准

    是否有任何针对大型数据集上 Lucene Solr 性能基准的链接 资源 500GB 5TB以上范围的数据集 Thanks Lucene 提交者 Mike McCandless 运行基准 http people apache org mik
  • 对 SolrConfig.xml 文件的更新未得到反映

    我在 SolrConfig xml 文件中添加了一个新的请求处理程序 但是每当我尝试使用新的处理程序时 我都会收到带有 未知处理程序 错误的 404 修改SolrConfig xml文件时是否还需要修改其他文件 Thanks 您需要重新启动
  • Solr 4 - 缺少必填字段:uuid

    我在使用 Solr4 中的 dataImportHandler 生成 UUID 时遇到问题 我正在尝试从现有的 MySQL 数据库导入 我的 schema xml 包含
  • 找出 maxClauseCount 设置为 1024 错误的原因

    我有两组搜索索引 TestIndex 在我们的测试环境中使用 和ProdIndex 在生产环境中使用 Lucene 搜索查询 date 20090410184806 TO 20091007184806 对于测试索引工作正常 但对于 Prod
  • 如何在 Orchard CMS 上使用 lucene 查询语法

    我想使用完整的Lucene 查询语法 http lucene apache org core 2 9 4 queryparsersyntax html在基于 Orchard CMS 的网站上 目前 启用后索引和搜索 http docs or
  • 如何在 Lucene 6 中对数字字段进行排序

    我想根据数字字段对搜索结果进行排序 在下面的示例代码中 我想根据 年龄 字段进行排序 我从使用以下答案开始 如何在 Lucene 6 中对 IntPont 或 LongPoint 字段进行排序 https stackoverflow com
  • elasticsearch - 具有多个条件的术语过滤器

    我想实现一次对ES的搜索具有2个或更多条件的多个值 For Eg customer index has 2 fields userid and order 我使用下面的查询来搜索与这两个字段匹配的结果 query filtered quer
  • 将 Nutch 爬虫与 Solr 结合使用

    我可以将 Apache Nutch 爬虫程序与 Solr 索引服务器集成吗 Edit 我们的一位开发人员从这些帖子中提出了一个解决方案 运行 Nutch 和 Solr http wiki apache org nutch RunningNu
  • 包 org.apache.commons.io 不存在错误

    我正在使用 ant 编译器编译 java 文件 我收到以下错误 包 org apache commons io 不存在错误 我下载了 apache Commons IO 二进制文件并将 jar 文件粘贴到 C Program Files J
  • 在 lucene.net 中,我们可以在不给出字段名称的情况下搜索内容吗?它会搜索所有已索引的字段吗?

    在 lucene net 中 我们可以在不给出字段名称的情况下搜索内容 并且它将搜索所有已索引的字段 如果不提供字段名称 则无法搜索内容 但是您可以使用 MultiFieldQueryParser 在所有可用字段中进行搜索 E g Dim
  • lucene:如何添加不重复的文档

    就我而言 插入 lucene 索引的每个文档都有其唯一的 ID 当向lucene索引添加新文档时 如果该文档已经存在于索引中 则不应将该文档插入到索引中 如何实施这一战略 我想我应该先用docId搜索文档 如果lucene找不到该文档 那么
  • Lucene 3 上的“令牌”列表

    我是 Lucene 的新手 我开始学习版本 3 分支 但有一件事我不明白 显然是因为我在该主题上没有经验 在 Lucene 2 9 中 如果我想要一个令牌列表 我会创建一个 Token 类的 ArrayList 例如 ArrayList 这
  • 随着索引和文档数量恒定,elasticsearch 批量索引会随着时间的推移而变慢

    我遇到了使用 NET NEST 客户端和 ElasticSearch 进行批量索引的性能随着时间的推移 索引数量和文档数量恒定而降低的情况 我们正在奔跑ElasticSearch Version 0 19 11 JVM 23 5 b02在具
  • Solr 过滤查询 - 字符串与整数

    假设我正在尝试查询一堆具有类别的文档 并且我想将查询限制为指定的类别 据我所知 这只是使用 fq 参数 过滤器查询 我想知道将参数设置为整 数而不是字符串或数据通常的情况是否会提高性能 我只是会在右侧犯错 但我想我应该仔细检查一下 以防万一
  • Lucene,索引已经/外部标记化的标记并定义自己的分析过程

    在使用Lucene的过程中 我有点失望 我不明白或不明白我应该如何继续为任何 Lucene 分析器提供已经可直接索引的东西 或者我应该如何继续创建我自己的分析器 例如 如果我有一个List
  • MultiFieldQueryParser 正在从首字母缩略词中删除点

    我再次发布这个问题 因为我的查询没有得到答复 我正在使用 Lucene 开发图书搜索 api 用户可以搜索标题或描述字段包含 C F A 的书籍 我正在使用 StandardAnalyzer 以及停用词列表 我使用 MultiFieldQu

随机推荐

  • 帮我解决我的 JavaScript 测验 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经参加这个测验很多年了 只是无法
  • 从 std::vector 中连续擦除的安全方法?

    我认为下面的代码可以工作 但是当目标小部件位于向量末尾时它会崩溃 for std vector
  • 试图推迟我的部分计划

    我试图拍摄我打开的网页的快照 但我需要延迟代码的第二部分 以便程序有时间打开页面 这是代码 import os import sys import time import Image import ImageGrab import webb
  • MSBuild - 它可以计算出解决方案文件中的项目依赖关系吗?如果是这样怎么办?

    我有一个 msbuild 项目 它从 Visual Studio 构建一个 SLN 文件 其中包含所有项目 大约 70 多个项目 并且许多项目相互依赖 这意味着它们需要按顺序构建 有时开发人员会忘记在解决方案文件中的 Visual Stud
  • javascript 中函数声明后的冒号[重复]

    这个问题在这里已经有答案了 我正在查看 Vue js 的源代码 在几乎所有的函数声明中 我找到了一种定义函数的新方法 function isStringStart chr number boolean return chr 0x22 chr
  • 如何在leiningen项目中打包资源

    在示例项目中 https github com technomancy leiningen blob master sample project clj https github com technomancy leiningen blob
  • Anaconda提示加载错误:输入行太长

    我在 Windows 7 64 位版本上安装了 Anaconda 64 python 2 7 安装后 anaconda提示符可以正常启动 但是每当我重新启动 关闭并重新启动笔记本电脑时 anaconda提示符都会显示以下错误消息 并且某些p
  • 自动镜像 GitHub 存储库

    我怀疑这个问题以前曾被问过 尽管我能找到的都是相似但不同的问题 或者是相同的问题 但只有不适合我的解决方案 GitHub 上有一个我无法控制但想要镜像的存储库 对于镜像 我的意思是拥有一个自动更新的克隆 我希望这个镜像也能出现在 GitHu
  • 当使用 PHP 选择值“other”时,如何显示 HTML 输入字段

    我想弄清楚的是如何拥有一个 htmlinput当值为other从下拉菜单中选择 现在 下拉列表的值来自 MySQL DB 查询的结果 该查询有效 但我似乎无法弄清楚当我选择其他选项时如何显示输入 query mysql query SELE
  • Visual Studio 2015 + Xamarin + 本机便携式 PCL + WCF

    因此 我们的企业正在使用 Visual Studio 走 Xamarin 路线 浏览所有在线文档表明 从 Web 服务创建 WCF 代理客户端并将其放置在 PCL 中应该很简单 经过一番努力并试图找出为什么我无法使用 SLSVcUtil e
  • JavaScript使用变量的基本功能

    我目前正在 Codecademy 上学习 JavaScript 在那里 它给出了一个基本变量的示例 var divideByThree function number var val number 3 console log val 然而
  • C# 使用反射时确定 Nullable 属性 DateTime 类型

    我有一个关于如何确定对象的 Nullable 属性类型的问题 ObjectA有财产DateTime CreateDate 当我像下面的代码一样迭代它的属性时 如何检查属性是否是Nullable DateTime type foreach P
  • 在 PowerShell v3 中运行并行 Invoke-WebRequest 作业

    在 PowerShell 中运行同步后台作业非常简单 但我似乎无法让它与新的 v3 中 cmdlet Invoke WebRequest 一起使用 我正在通过 PowerShell 以脚本方式下载数千个文件 效果很好 但串联起来需要几天时间
  • 将计算列转换为常规列

    我在 SQL Server 2005 的一个大表中有一个持久计算列 我想将其转换为常规列 保留当前值 我是否必须重新创建列并更新事务中的整个表 或者是否可以仅更改计算列规范 以及如何操作 Create a new Column unpers
  • SCons 不会清除所有文件

    我有一个包含 builds 目录的文件系统 每个目录都包含一个名为 build info xml 的文件 然而 一些构建发生在构建脚本生成 build info xml 之前 因此在这种情况下 我有一个有点不平凡的 SCons SConst
  • execCommand insertHTML 中断存储的 window.getSelection()

    当使用在页面中选择文本和恢复所选文本的方法时 我发现运行execCommand insertHTML in Between 会导致存储的选择中断 这是如何选择和恢复文本的示例 Get Selection var sel window get
  • 将php文件加载到布局模板中?

    我正在开发我的第一个 php 网站 我遇到了一个我无法解决的问题 我试图拥有一个包含我的结构的 php 页面 以及其他在其中注入 html 的页面 同时保留 url 更改 以便我仍然可以直接链接页面 到目前为止 这就是我正在做的事情 但似乎
  • ggmap 具有值的热图

    谁能帮我制作 ggmap 热图 我的数据 val Qtd lt c 34 10 11 7 55 18 33 16 16 249 nom State lt c Distrito Federal Bahia Ceara Espirito San
  • 突出显示 Jupyter 单元中的部分代码

    有没有办法突出显示 Jupyter 单元格的某些行 类似于下图的内容 我用照片编辑器创建的 我的意思不是用光标进行选择 而是永久性的选择 例如 当您想要突出显示新添加的代码时 这对于演示文稿非常有用 下面提供的 Jupyter 笔记本扩展允
  • 当我不知道创建时的最大大小时,如何使用 Lucene 的 PriorityQueue?

    我为 Lucene Net 构建了一个自定义收集器 但我不知道如何对结果进行排序 或分页 每次调用 Collect 时 我都可以将结果添加到内部 PriorityQueue 中 我认为这是执行此操作的正确方法 我扩展了 PriorityQu