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

限制Elastic Search中应子句的结果数

松增
2023-03-14
问题内容

我正在编写查询以获取与多个词组之一匹配的结果,例如

{
  'size': 10,
  'from': 0,

  'query': {
    'bool': {
      'should': [
        {'text': {'title': { 'query': 'some words' }}},
        {'text': {'title': { 'query': 'other words' }}},
        {'text': {'title': { 'query': 'some other words' }}},
      ]
    }
  }
}

它可以按预期工作,但我有一个问题:10个得分结果都匹配相同的短语。

我想到的解决方案是将每个should子句的结果数限制为例如5个元素

问题在于,我看不到如何使用Elastic Search查询来实现此目的,也不知道是否可能,或者是否存在另一种执行我想要的方式。

有任何想法吗 ?

谢谢 !


问题答案:

当您尝试实现3个查询的并集时,ElasticSearch会寻找与您的查询匹配的“最相关”文档。

最简单(也是最快)的方法是使用多重搜索运行三个查询:

curl -XGET 'http://127.0.0.1:9200/my_index/_msearch?pretty=1'  -d '
{}
{"query" : {"text" : {"title" : "some words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "some other words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "other words"}}, "size" : 5}
'

根据您的要求,一种替代方法是使用限制过滤器,但请注意,它会限制每个SHARD(而不是每个索引)的结果数量。默认情况下,索引有5个主要分片,因此,如果将限制指定为5,则很可能会获得25个结果。

所以也许是这样的:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "bool" : {
         "should" : [
            {
               "filtered" : {
                  "filter" : {
                     "limit" : {
                        "value" : 1
                     }
                  },
                  "query" : {
                     "text" : {
                        "title" : "some words"
                     }
                  }
               }
            },
            {
               "filtered" : {
                  "filter" : {
                     "limit" : {
                        "value" : 1
                     }
                  },
                  "query" : {
                     "text" : {
                        "title" : "other words"
                     }
                  }
               }
            },
            {
               "filtered" : {
                  "filter" : {
                     "limit" : {
                        "value" : 1
                     }
                  },
                  "query" : {
                     "text" : {
                        "title" : "some other words"
                     }
                  }
               }
            }
         ]
      }
   }
}
'

这将为您提供每个分片上每个短语的得分最高的文档(有5个分片,最多15个文档,(由于您未指定size=15)将减少到前10个文档)。

您的里程可能会有所不同,具体取决于您的文档在各个分片中的分布方式。



 类似资料:
  • 问题内容: 在我的elasticsearch索引“ people”中,包含以下文件: 我想得到一个文档的结果,该文档的分区为2或1,但是最多只能包含2个。因此,如果以上是我的整个索引,我希望它返回: 用Elastic中的单个查询是否可以实现此目标?非常感谢您的帮助! 问题答案: 这样的事情应该做到:

  • 问题内容: 如何限制从数据库检索到的结果数? 问题答案: 您可以这样尝试,以明确获取10个结果。 如果后端支持,它将自动在后端创建本机查询以检索特定数量的结果,否则将在获取所有结果后进行内存限制。

  • 问题内容: 在MySQL中,我可以执行以下操作: 如果表有10,000行,那么该查询的速度要比我省略LIMIT部分的速度快得多。 在ElasticSearch中,我得到以下内容: 当我运行此搜索时,它需要花费几秒钟的时间,而mysql可以在短得多的时间内返回相同查询的结果。 如果传入size参数(设置为1),则它仅成功返回1个结果,但是查询本身并没有比将size设置为unlimited并返回所有结

  • 我调用了一些JSON结果,它在一个名为“cast”的数组中列出了一组参与者。我用这个JS调用列表中的第一项。。。 把它们放在一个小隔间里,像这样。。。 我需要列出前5个结果(不仅仅是第一个)。他们的方法简单吗?

  • 主要内容:指定初始位置,不指定初始位置,LIMIT和OFFSET组合使用当数据表中有上万条数据时,一次性查询出表中的全部数据会降低数据返回的速度,同时给数据库服务器造成很大的压力。这时就可以用  LIMIT 关键字来限制查询结果返回的条数。 LIMIT 是 MySQL 中的一个特殊关键字,用于指定查询结果从哪条记录开始显示,一共显示多少条记录。 LIMIT 关键字有 3 种使用方式,即指定初始位置、不指定初始位置以及与 OFFSET 组合使用。 指定初始位置 LIMI

  • 问题内容: 在MySQL 5.0中,为什么尝试在FROM子句中创建带有子查询的视图时会发生以下错误? 错误1349(HY000):视图的SELECT在FROM子句中包含一个子查询 如果这是MySQL引擎的限制,那么为什么他们还没有实现此功能呢? 此外,对于此限制有什么好的解决方法? 是否有任何变通方法可用于FROM子句中的任何子查询,或者是否存在某些无法在FROM子句中使用子查询无法表达的查询?