Эластичный поиск - Как совместить фильтр и предложения? - PullRequest
0 голосов
/ 30 ноября 2018

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

[
{
  "firstName": "John",
  "lastName": "Doe",
  "id": 10
},
{
  "firstName": "Mary",
  "lastName": "Jane",
  "id": 10
},
{
  "firstName": "John",
  "lastName": "Lennon",
  "id": 12
}
]

Я хочу написать упругий поисковый запрос, который может соответствовать по firstName или lastName (must), а затем отфильтровать результаты с помощью идентификатора.

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

{
  "query": {
    "bool": {
      "filter": [{
        "term": {
          "id": 10
        }
      }],
      "should": [{
        "match": {
            "firstName": "john"
        }
      }, {
        "match": {
            "lastName": "john"
        }
      }]
    }
  }
}   

я понимаю, что когда я выполняю вышеуказанный запрос, я должен получить только запись, имя которой firstName равно "John" иid 10. Но на самом деле я получаю несколько записей.

Что я здесь не так делаю?Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Принятый ответ Камала, безусловно, является лучшим и более элегантным способом решения этой проблемы.Но другой вариант может быть следующим:

{
   "query":{
      "bool":{
         "must":{
                    "bool": {
                        "should": [
                            {"match": {"firstName": "john"}},
                            {"match": {"lastName": "john"}}
                        ]
                    }
                },
         "filter":{
            "term":{
               "id":10
            }
         }
      }
   }
}
0 голосов
/ 30 ноября 2018

Обновляя мой ответ в соответствии с @Val, вам просто нужно добавить предложение minimum_should_match, и ниже вы найдете то, что вы ищете:

POST <your_index_name>/_search
{
  "query": {
    "bool" : {
      "filter": {
        "term" : { "id" : "10" }
      },
      "should" : [
        { "match" : { "firstName" : "john" } },
        { "match" : { "lastName" : "john" } }
      ],
      "minimum_should_match": 1
    }
  }
}

Дайте мне знать, если это поможет!

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