Не должен с и в упругом поиске - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть 4 поля в эластичной схеме поиска.

date
status
type
createdAt

Теперь мне нужно выбрать все строки, где

date=today
status = "confirmed" 
and where type is not equals to "def"

Тем не менее, это нормально, если

type=def exists 

, но только когда поле createdAt не равно today.

Мой текущий запрос выглядит так:

{
    must: [
        { "bool":
            {
                "must": [
                    {"term": {"date": 'now/d'}},
                    {"term": {"status": 'confirmed'}},
                ]
          }
        }
    ],
    mustNot: [
        {"match": {'createdAt': 'now/d'}},
        {"match":{"type": "def"}}
    ]
}

Извлекаются строки, где тип не равен "def". Однако, если строка имеет type=def AND createdAT any date but today, строка не отображается.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Предполагая настройку, подобную этой:

PUT twitter
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date",
          "format": "epoch_millis"
        },
        "createdAt": {
          "type": "date",
          "format": "epoch_millis"
        },
        "status": {
          "type": "keyword"
        },
        "type": {
          "type": "keyword"
        }
      }
    }
  }
}

и пример документа, подобный этому (скорректируйте значения для проверки запроса):

post twitter/_doc/1
{
 "date": 1536562800000, //start of TODAY September 10, 2018 in UTC
 "createdAt": 1536562799999,
 "status": "confirmed",
 "type": "def"
}

следующий запрос должен работать:

get twitter/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "date": {
                  "gte": "now/d",
                  "lte": "now/d"
                }
              }
            },
            {
              "term": {
                "status": "confirmed"
              }
            }
          ],
          "must_not": [
            {
              "range": {
                "createdAt": {
                  "gte": "now/d",
                  "lte": "now/d"
                }
              }
            },
            {
              "term": {
                "type": "def"
              }
            }
          ]
        }
      }
    }
  }
}

Это отфильтрованный запрос, который, по моему мнению, лучше подходит для этого сценария, поскольку он не рассчитывает оценку.Если вы хотите рассчитать балл, просто удалите bool и фильтр сверху.

0 голосов
/ 10 сентября 2018

Этот запрос должен работать.

{
  "query": {
    "bool": {
       "must": [
          { "term": {"date": "now/d" } },
          { "term": {"status": "confirmed" } }
       ],
       "must_not": {
         "bool": {
           "must": [
              { "match": { "createdAt": "now/d" } },
              { "match": { "type": "def" } }
           ]
         }
       }
    }
  } 
}

Я считаю, что причина, по которой ваша версия не работает, заключается в том, что каждый запрос в must_not не должен совпадать. https://www.elastic.co/guide/en/elasticsearch/guide/current/bool-query.html#_controlling_precision

Все предложения must должны совпадать, и все предложения must_not не должны совпадать, но сколько должно совпадать предложений? По умолчанию ни одно из предложений must не требуется для сопоставления, за одним исключением: если нет обязательных предложений, то должно совпадать хотя бы одно предложение must.

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