当前位置: 首页 > 面试题库 >

根据数字字段在Lucene中对搜索结果进行排序

左丘源
2023-03-14
问题内容

我有一些文档有两个字段:文本,计数。

我曾经Lucene为文档编制索引,现在我想在文本中搜索并按降序将结果按计数排序。我怎样才能做到这一点?


问题答案:

Apache Lucene的默认搜索实现返回按分数(最相关的结果排在最前),然后按ID(最旧的结果排在前)的结果。

可以在查询时使用附加的Sort参数自定义此行为。

TopFieldDocs Searcher#search(查询查询,过滤器过滤器,int n,排序排序)

Sort参数指定用于排序的字段或属性。默认实现是通过以下方式定义的:

new Sort(new SortField[] { SortField.FIELD_SCORE, SortField.FIELD_DOC });

要更改排序,只需将字段替换为所需的字段即可:

new Sort(new SortField[] {
SortField.FIELD_SCORE,
new SortField("field_1", SortField.STRING),
new SortField("field_2", SortField.STRING) });

这听起来很简单,但要满足以下条件才能起作用:

  • 您必须指定SortField(String field,int type)的type参数,以使Lucene找到您的字段,即使这通常是可选的。
  • 排序字段必须建立索引,但不能标记化:

document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.NOT_ANALYZED));

  • 排序字段的内容只能是纯文本。如果仅一个元素在用于排序的字段之一中具有特殊字符或重音,则整个搜索将返回未排序的结果。

检查本教程。



 类似资料:
  • 问题内容: 假设我将这样的文档存储在ElasticSearch中: 假设我使用location = CA进行搜索,如何根据“标签”中项目的数量对结果进行排序? 我想在首页中列出标签数量最多的人。 问题答案: 您可以为包含标签数量的其他字段建立索引,然后在其上轻松地对结果进行排序。否则,如果您愿意在查询时付出一点性能成本,那么有个不错的解决方案不需要重新索引数据:您可以根据如下脚本进行排序: 从基于

  • 问题内容: 我有这样的Elasticsearch数据- 在此示例中,我进行了全文搜索,正在“ text”字段中搜索所有具有“ unemployment”子字符串的文档。最后,我希望所有文档以“文本”字段中“失业”字符串的索引值的升序排列。例如- 子字符串“失业”首先在doc2中的索引“ 4”处出现,因此我希望此文档在结果中首先返回。 我尝试了一些诸如term_vector这样的事情,这是我使用的映

  • 我对mongodb query builder很陌生,并试图结合query builder和mongodb在php(Symfony2.6)中进行全文搜索。然后,在我的操作中,我有以下查询: 此查询返回所需的结果,但不对其进行排序。我的意思是,它不会根据与查询匹配的每个文档的得分对结果进行排序。我已经研究了mongoDb中的所有文本搜索和排序文档以及堆栈溢出解答,如php、mongoDb全文搜索和排

  • 我在建立一个简单的地址数据库。有一个名为的类,其中的地址被分解为字段(street、city、state、ZIP)。每个字段都是字符串类型。 我想能够搜索地址中的任何一个字。例如:查找地址,无论搜索的词是在街道名称或城市名称等。换句话说,我希望用户能够轻松搜索,而不必指定他们感兴趣的地址的哪一部分。 但是当我执行以下查询时,我不会得到结果或错误消息: =>没有结果,应该是2条邮政编码为46250和

  • 我想根据数字字段对搜索结果进行排序。在下面的示例代码中,我希望基于'Age'字段进行排序。我从以下答案开始: [如何在Lucene 6中对IntPont或LongPoint字段进行排序 [在Lucene中根据数字字段对搜索结果进行排序 我在搜索函数中将sortfield.type.score更改为sortfield.type.long。但我得到: 意外的docvalues为字段“年龄”键入NONE

  • 我在我的应用程序中使用Hibernate搜索。其中一个子集合映射为IndexeDemBedded。子对象有两个字段,一个是id,另一个是date(使用date resoultion到毫秒)。当我搜索ID=1(或某个值)并且date等于另一个值时,我会得到第一个和第二个匹配的所有情况的结果。我只想在同一个孩子中获得两个字段匹配的记录,但我在不同的孩子中获得匹配,结果会高得多。下面是代码片段 主类是用