Elasticsearch: фильтрация по нескольким полям с помощью ИЛИ - PullRequest
0 голосов
/ 13 июля 2020

У меня есть указатель документов. Я хочу отфильтровать документы, которые либо опубликованы c, либо опубликованы в группе членами моей группы (пользователи 1 и 3).

privacy = "publi c" ИЛИ (privacy = "group" И user_id в (1,3))

Я могу сделать их отдельно, но как объединить их с ИЛИ?

"filter" : [
            {"terms" : { "privacy" : ["public"]}},
        ]
"filter" : [
            {"terms" : { "privacy" : ["group"]}},
            {"terms" : { "user_id" : [1,3]}},
        ]

Документы:

  • {"id": 1, "user_id": 1, "privacy": "publi c", "title": "Готовим для одного",}
  • {"id": 3, "user_id": 1, "privacy": "group", "title": "Компания трех"}
  • {"id": 4, "user_id" : 2, "privacy": "publi c", "title": "Четыре пути к диете"}
  • {"id": 6, "user_id": 2, "privacy": "group "," title ":" Six O'Clock News "}
  • {" id ": 7," user_id ": 3," privacy ":" publi c "," title ":" Удачный Семь "}
  • {" id ": 9," user_id ": 3," privacy ":" group "," title ":" Девять животных для рисования "}

Правильный запрос вернет документы 1,3,4,7,9, но не 6.

1 Ответ

1 голос
/ 13 июля 2020

Хитрость заключается в том, чтобы заключить оба подзапроса в bool-should:

{
  "query": {
    "bool": {
      "should": [
        {
          "terms": { "privacy": [ "public" ] }
        },
        {
          "bool": {
            "filter": [
              {
                "terms": { "privacy": [ "group" ] }
              },
              {
                "terms": { "user_id": [ 1, 3 ] }
              }
            ]
          }
        }
      ]
    }
  }
}

FYI: обратите внимание на разницу между must и filter. TL; DR filter не оценивает.

РЕДАКТИРОВАТЬ:

{
  "terms":{
    "privacy":[
      "public"
    ]
  }
}

примерно эквивалентно (за исключением оценочной части, как обсуждалось выше)

{
  "bool":{
    "filter":{
      "terms":{
        "privacy":[
          "public"
        ]
      }
    }
  }
}

, что полностью эквивалентно

{
  "bool":{
    "filter":[
      {
        "terms":{
          "privacy":[
            "public"
          ]
        }
      }
    ]
  }
}

Это просто вопрос многословия.

РЕДАКТИРОВАТЬ 2: переписанный запрос, включающий 2 фильтра

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": [
              {
                "terms": { "privacy": [ "public" ] }
              }
            ]
          } 
        },
        {
          "bool": {
            "filter": [
              {
                "terms": { "privacy": [ "group" ] }
              },
              {
                "terms": { "user_id": [ 1, 3 ] }
              }
            ]
          }
        }
      ]
    }
  }
}
...