Фильтр Elasticsearch для "поля не существует ИЛИ поле равно true" - PullRequest
0 голосов
/ 24 января 2020

У меня есть поисковый запрос следующего формата:

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": {
            "simple_query_string": {
              "query": "*",
              "fields": [
                "field1^10",
                "field2^3"
              ]
            }
          },
          "filter": [
            {
              "terms": {
                "field3": [
                  "val1",
                  "val2"
                ]
              }
            },
            {
              "terms": {
                "field4": [
                  "val4"
                ]
              }
            },
            {
              "term": {
                "field5": true
              }
            }
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "field1": {
              "scale": "31d"
            }
          },
          "weight": 5
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  },
  "size": 10
}

Теперь я хочу изменить фильтр на field5 так, чтобы он фильтровал значения, для которых либо field5 установлено как true, либо если они не индексированы field5. Мне нужны оба вида результатов, и я хочу исключить только те, для которых field5 имеет значение false.

Я пробовал различные комбинации must_not с should внутри filter, но не смог заставить запрос работать. Спасибо за помощь!

Я пользуюсьasticsearch версии 6.5.1.

1 Ответ

2 голосов
/ 24 января 2020

Учитывая предоставленную вами информацию, особенно

Мне нужны оба вида в результатах, а хочу исключить только те, для которых field5 установлено в false.

запрос должен выглядеть следующим образом:

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": {
            "simple_query_string": {
              "query": "*",
              "fields": [
                "field1^10",
                "field2^3"
              ]
            }
          },
          "must_not": [
            {
              "term": {
                "field5": {
                  "value": false
                }
              }
            }
          ], 
          "filter": [
            {
              "terms": {
                "field3": [
                  "val1",
                  "val2"
                ]
              }
            },
            {
              "terms": {
                "field4": [
                  "val4"
                ]
              }
            }
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "field1": {
              "scale": "31d"
            }
          },
          "weight": 5
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  },
  "size": 10
}

Я добавил предложение must_not, чтобы исключить все документы, у которых field5 равно false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...