Elasticsearch bool запрос, который проверяет, отсутствует ли свойство полностью или свойство существует и содержит определенную строку - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь написать запрос boolasticsearch, который проверяет, существует ли поле в объекте, а затем пытается сопоставить строку в этом поле, которая может существовать или не существовать.Я хочу, чтобы запрос возвращал все объекты (записи), которые удовлетворяют одному из следующих условий: 1. поле postMeta.byline не существует 2. если postMeta.byline существует, то оно содержит строку «John Doe»

Вот последний запрос, который я пытался выполнить, но он не работает:

{ "query": 
  { "bool": 
    { "filter": 
      [ { "match": { "status": "publish" } },
        { "match": { "authors": "104" } } 
      ],
      "should": [
        { "must_not": { "exists": { "field": "postMeta.byline" } } },
        { "filter": {
            "wildcard": {
              "postMeta.byline": "*John Doe*"
             }
          }
        }
      ]
    } 
  }
}

Ответы [ 2 ]

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

Спасибо @nitzien, за ваш ответ!Ваш запрос почти сработал;единственное изменение, которое я должен был сделать, заключалось в том, чтобы обернуть предложение «must_not» в другое предложение «bool» следующим образом:

{ "query":  
  { "bool": 
    { "filter": 
      [ { "match": { "status": "publish" } },
        { "match": { "authors": "104" } } , 
        { "bool" : 
           { "should" : [
               { "bool": { "must_not": { "exists": { "field": "postMeta.byline" } } } },
               { "wildcard": { "postMeta.byline": "*John Doe*" } }
             ]
           }
        }
       ]
    } 
  }
}
0 голосов
/ 27 сентября 2018

В запросе bool должен иметь эффект, если у вас уже есть must или filter.Следующее задокументировано здесь -

Предложение (запрос) должно появиться в соответствующем документе.Если запрос bool находится в контексте запроса и имеет предложение must или filter, то документ будет соответствовать запросу bool, даже если ни один из запросов must не совпадает.В этом случае эти пункты используются только для влияния на оценку.

То, что вы можете попробовать - это вложенный запрос bool.

{ "query":  
  { "bool": 
    { "filter": 
      [ { "match": { "status": "publish" } },
        { "match": { "authors": "104" } } , 
        { "bool" : 
           { "should" : [
               { "bool": {  "must_not": { "exists": { "field": "postMeta.byline" } } } },
               { "wildcard": { "postMeta.byline": "*John Doe*" } }
             ]
           }
        }
       ]
    } 
  }
}

Первый бул имеет три условия в фильтре.Таким образом, это будет соответствовать всем трем.Вложенный бул должен.Таким образом, он будет соответствовать как минимум одному из двух.

Я не проверял запрос.

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