布尔查询是复合查询类(compound queris)
的成员,允许混合多个term/query
查询,提供逻辑来组合这些子句的匹配。布尔查询提供了对子句进行分组和混合的语法, 可以在must、should、must_not和should_not块中有多个子句。should查询是逻辑或
条件,而must查询是逻辑与
条件。
运行以下查询:
GET /my-movie-index/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"genres": "action"
}
},
{
"match": {
"title": "matrix"
}
},
{
"match": {
"actors": "reeves"
}
}
]
}
}
}
这里有几点需要注意:
OpenSearch使用一个默认的评分函数,称为Okapi BM25
。这个函数(广义上是词频/逆文档频率
,或TF/IDF
)是统计性质的。Term的得分值与它们在整个语料库中的稀有程度成正比(IDF)。文档的得分是通过将匹配的术语得分乘以该术语在文档中出现的次数(TF)来计算的。
要了解某个特定文档为什么会得到它的得分,可以发起一个explain查询。最简单的方法是在搜索查询中添加explain=true
,这样解释结果就会添加到返回的文档中(也可以在查询的JSON主体中添加["explain": "true"]
)。
GET /my-movie-index/_search?explain=true
{
"query": {
"bool": {
"should": [
{
"match": {
"genres": "action"
}
},
{
"match": {
"title": "matrix"
}
},
{
"match": {
"actors": "reeves"
}
}
]
}
}
}
GET /my-movie-index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"genres": "action"
}
},
{
"match": {
"title": "matrix"
}
},
{
"match": {
"actors": "reeves"
}
}
]
}
}
}
使用“should”关键字进行搜索会返回很多文档,而使用“must”关键字进行搜索只会返回满足所需条件的文档。使用“must”条件可以得到精确的结果:
接下来,看看将must与should结合使用会发生什么:
GET /my-movie-index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"actors": "reeves"
}
}
],
"should": [
{
"match": {
"title": "matrix"
}
},{
"match": {
"genres": "action"
}
}
]
}
}
}
在这里,定义了 actors 必须包含 reeves,但 title 和 types条件只要满足一个就行。结果是一个文档集,根据查询中所有条件的匹配程度对其进行评分(排名)