查询场景:要查询文档中包含 Elasticsearch or (Golang or Go) or function_score 的文档。
GET /_search
{
"query":{
"bool":{
"should":[
{"term":{"content":"elasticsearch"}},
{"term":{"content":"Golang"}},
{"term":{"content":"Go"}},
{"term":{"content":"function_score"}}
]
}
}
}
复制代码
虽然上述查询能把只要包含了 or 条件中的所有文档都查询出来,而且每个条件的紧张程度都一样。但实际 Golang or Go 是一个组合条件,和其他 2 个条件是并列的关系,所以下面是更好的写法。
用 Bool 查询把 Golang or Go 包起来,这样如今的 Golang or Go 跟其他两个条件就处于顶层相互竞争的关系了。原来每个词的紧张性是 25%,如今 Elasticsearch 和 function_score 紧张性各占 33.3%, Golang or Go 加起来占 33.3%。
GET /_search
{
"query":{
"bool":{
"should":[
{ "term":{"content":"elasticsearch"}},
{ "term":{"content":"function_score"}},
{
"bool":{
"should":[
{"term":{"content":"Golang"}},
{"term":{"content":"Go"}}
]
}
}
]
}
}
}
复制代码
排序沉底 - Boosting 查询
查询场景:文档中要包含 Elasticsearch,但不希望包含 MySQL。
方案一:利用 must_not
在这个方案里利用的 must_not 过于严格,会把包含了 MySQL 的文档排除出去。但如果一个文档中包含了许多 Elasticsearch,只是恰好包含了一个 MySQL,那就错过了一个“好”的文档。
通过以上先容我们可以了解到 ES 可支持的排序本领还是非常丰富的,我们要实现置顶或沉底效果,并不能非黑即白的选择,更多的场景中须要根据实际须要做多个本领的组合,只管 function_score 表现优异,但越复杂的查询对 ES 的查询压力也越大,当数据量很大时必须要权衡性能和排序效果。上线前,也须要在仿真环境中验证大数据量下的性能表现。