Какова цель «фильтра» BoolQuery в ElasticSearch? - PullRequest
0 голосов
/ 28 июня 2019

Я прочитал документацию 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;
    }

, но я не могу получить свойголова вокруг, это.Когда я должен использовать фильтр против (должен или должен)

Вот пример, над которым я работаю:

Я хочу отфильтровать некоторые записи на основе следующих предположений:

Выбрать все

1) Записи, где deleted=0 и isPrivate=true

И

2) Записи, где (isPrivate=false or [isPrivate=true and createdBy=loggedInUser])

Вот 2 запроса, которые дают один и тот же результат, я хочу знать, что означает filter запрос

Результат без фильтра, использующий предложение must и must.

"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
          }
        }
      ]
    }
  }

1 Ответ

1 голос
/ 28 июня 2019

В вашем случае вам определенно следует использовать bool/filter, поскольку у вас нет каких-либо ограничений, способствующих оценке, все ограничения соответствуют да / нет, а с помощью filter вы можете воспользоваться фильтрами кэшей (которые выне при использовании must)

Так что определенно используйте опцию 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 = условие ИЛИ
  • must = условие И (при желании получить оценку)
  • filter = условие И (если оценка не нужна и / или когда вы хотите воспользоваться преимуществами кэширования фильтра)
  • Бонус: must_not = НЕ условие
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...