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

如何根据ElasticSearch中的项目数对搜索结果进行排序?

皇甫建木
2023-03-14
问题内容

假设我将这样的文档存储在ElasticSearch中:

{
    'name':'user name', 
    'age':43, 
    'location':'CA, USA', 
    'bio':'into java, scala, python ..etc.', 
    'tags':['java','scala','python','django','lift']
}

假设我使用location = CA进行搜索,如何根据“标签”中项目的数量对结果进行排序?

我想在首页中列出标签数量最多的人。


问题答案:

您可以为包含标签数量的其他字段建立索引,然后在其上轻松地对结果进行排序。否则,如果您愿意在查询时付出一点性能成本,那么有个不错的解决方案不需要重新索引数据:您可以根据如下脚本进行排序:

{
    "query" : {
        "match_all" : {}
    },
    "sort" : {
        "_script" : { 
            "script" : "doc['tags'].values.length",
            "type" : "number",
            "order" : "asc"
        }
    }
}

从基于脚本的排序部分可以看到:

请注意,对于基于单个自定义脚本的排序,建议使用custom_score查询,因​​为基于分数的排序更快。

这意味着最好使用自定义分数查询来影响您的分数,然后按分数排序,如下所示:

{
    "query" : {
        "custom_score" : {
            "query" : {
                "match_all" : {}
            },
            "script" : "_score * doc['tags'].values.length"
        }
    }
}


 类似资料:
  • 问题内容: 我有一些文档有两个字段:文本,计数。 我曾经为文档编制索引,现在我想在文本中搜索并按降序将结果按计数排序。我怎样才能做到这一点? 问题答案: Apache Lucene的默认搜索实现返回按分数(最相关的结果排在最前),然后按ID(最旧的结果排在前)的结果。 可以在查询时使用附加的Sort参数自定义此行为。 TopFieldDocs Searcher#search(查询查询,过滤器过滤器

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

  • 问题内容: 我在使用Elasticsearch查询时遇到问题。我希望能够对结果进行排序,但是elasticsearch忽略了排序标签。这是我的查询: 但是,当我删除查询部分并仅发送排序标签时,它就可以工作。谁能指出正确的方法? 我还尝试了以下查询,这是我所拥有的完整查询: 设定值 对应 提前致谢! 问题答案: 文档中的 “标题” 字段是一个 分析的 字符串字段,也是一个多值字段,这意味着Elast

  • 我有一个调用,比如,它附加了一些查询参数。 用户可以搜索或仅搜索术语的。 导出函数如下所示, 像这样的查询,

  • 问题内容: 我对MYSQL相对较新,遇到了困扰我一段时间的问题。我已经尝试在所有地方使用Google搜索来寻找答案,但到目前为止仍无法找到可接受的解决方案。 这是我当前正在运行的查询,用于查找给定搜索词的最佳匹配项: 它返回的结果是全面的,因为它们包括所有相关的行。但是,它们没有按照任何特定的顺序排序,我希望在用PHP打印结果时首先显示完全匹配的匹配项。像这样: 1 | 字<精确匹配 2 | 填字

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