我正在编写查询以获取与多个词组之一匹配的结果,例如
{
'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子句中使用子查询无法表达的查询?