我阅读了BoolQuery的文档,并据此达到目的
过滤器
子句(查询)必须出现在匹配的文档中。但是不像 必须忽略查询的分数。过滤子句是 在过滤器上下文中执行,这意味着计分被忽略,并且 子句考虑用于缓存。
也来自BoolQueryBuilder类:
/**
* Adds a query that <b>must</b> appear in the matching documents but will
* not contribute to scoring. No {@code null} value allowed.
*/
public BoolQueryBuilder filter(QueryBuilder queryBuilder) {
if (queryBuilder == null) {
throw new IllegalArgumentException("inner bool query clause cannot be null");
}
filterClauses.add(queryBuilder);
return this;
}
但是,我无法理解。我什么时候应该使用过滤器vs(应该还是必须)
这是我正在研究的示例:
我要根据以下假设过滤掉一些记录:
全部获取
1)记录
的位置deleted=0
和isPrivate=true
AND
2)记录
(isPrivate=false or [isPrivate=true and createdBy=loggedInUser])
以下是两个给出相同结果的查询,我想知道filter
查询表示什么
不带过滤器的结果仅使用must和should子句。
"query": {
"bool": {
"must": [
{
"term": {
"deleted": {
"value": "0",
"boost": 1
}
}
},
{
"match": {
"isPrivate": {
"query": true
}
}
},
{
"bool": {
"should": [
{
"term": {
"isPrivate": {
"value": "false",
"boost": 1
}
}
},
{
"bool": {
"must": [
{
"term": {
"createdBy": {
"value": "1742991596",
"boost": 1
}
}
},
{
"term": {
"isPrivate": {
"value": "true",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
]
}
}
]
}
},
使用过滤器查询
"query": {
"bool": {
"adjust_pure_negative": true,
"boost": 1,
"filter": [
{
"bool": {
"must": [
{
"term": {
"deleted": {
"value": "0",
"boost": 1
}
}
},
{
"match": {
"isPrivate": {
"query": true
}
}
}
],
"should": [
{
"term": {
"isPrivate": {
"value": "false",
"boost": 1
}
}
},
{
"bool": {
"must": [
{
"term": {
"createdBy": {
"value": "1742991596",
"boost": 1
}
}
},
{
"term": {
"isPrivate": {
"value": "true",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
]
}
}
答案 0 :(得分:1)
在您的情况下,您应该绝对使用bool/filter
,因为您没有任何有助于得分的约束,所有约束都是是/否匹配,并且通过使用filter
您可以从过滤器中受益缓存(使用时不需缓存)
因此绝对可以使用filter选项,但要稍加修改(您根本不需要,布尔逻辑没有正确地转换为bool查询):
{
"query": {
"bool": {
"minimum_should_match": 1,
"filter": [
{
"term": {
"deleted": {
"value": "0",
"boost": 1
}
}
},
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"term": {
"isPrivate": {
"value": "false",
"boost": 1
}
}
},
{
"bool": {
"filter": [
{
"term": {
"createdBy": {
"value": "1742991596",
"boost": 1
}
}
},
{
"term": {
"isPrivate": {
"value": "true",
"boost": 1
}
}
}
]
}
}
]
}
}
]
}
}
}
总而言之:
should
= OR条件must
= AND条件(需要评分时)filter
= AND条件(当不需要评分和/或希望从过滤器缓存中受益时)must_not
=不满足