Эластичный комбайн должен и не должен

#elasticsearch

#эластичный поиск

Вопрос:

Я хотел бы создать запрос в elastic, где я получаю все документы, которые соответствуют значению и не имеют определенного поля: то, что я пытаюсь сделать, это следующее:

 {
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "some-field.b": true
                    }
                },
                {
                    "bool": {
                        "must_not": {
                            "exists": {
                                "field": "some-other-field.a"
                            }
                        }
                    }
                }
            ]
        }
    }
}
  

Даже если я изменяю документ в elastic и присваиваю значение какому-то другому полю.a запрос продолжает возвращать мне одинаковое количество общих обращений. Есть идеи, почему это происходит?

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

Я заметил еще одну вещь. Если я повторяю запрос, имея минимальный результат, количество возвращенных обращений меняется.

Комментарии:

1. можете ли вы поделиться своим отображением, некоторыми примерами документов и ожидаемым результатом?

2. @Panos у вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂

Ответ №1:

Поскольку вы ничего не упомянули о своих данных сопоставления и индекса.

Добавление рабочего примера с отображением индекса, индексными данными и поисковым запросом (учитывая, что данные имеют вложенный тип, поскольку some-other-field.a выглядят как вложенное поле)

Сопоставление индексов:

 {
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      },
      "qualification": {
        "type": "nested" 
      }
    }
  }
}
  

Индексировать данные:

 {
  "user" : [ 
    {
      "first" : "Bhavya",
      "last" :  "Gupta"
    }
  ]
}

{
  "user" : [ 
    {
      "first" : "Bhavya",
      "last" :  "Gupta"
    }
  ],
  "qualification": [
    {
      "degree": "MTech"
    }
  ]
}

{
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    }
  ],
  "qualification": [
    {
      "degree": "BTech"
    }
  ]
}
  

Поисковый запрос:

 {
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "user",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "user.first": "Bhavya"
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "must_not": {
        "nested": {
          "path": "qualification",
          "query": {
            "exists": {
              "field": "qualification.degree"
            }
          }
        }
      }
    }
  }
}
  

Результат поиска:

 "hits": [
      {
        "_index": "stof",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.35667494,
        "_source": {
          "user": [
            {
              "first": "Bhavya",
              "last": "Gupta"
            }
          ]
        }
      }
    ]
  

Комментарии:

1. Этот запрос ведет себя точно так же, как тот, который я опубликовал. Похоже, что сопоставляется только первое «должно», поскольку запрос возвращает мне документы, в которых есть какое-то другое поле. присутствует

2. @Panos пожалуйста, ознакомьтесь с моим обновленным ответом и дайте мне знать, решило ли это вашу проблему или нет

3. Спасибо за ваш ответ, это было действительно полезно. Хотя мне понадобились некоторые изменения, чтобы заставить его работать, поэтому я опубликую свой точный запрос

4. @Panos рад, что это было полезно для вас 🙂 Было бы здорово, если бы вы также могли поддержать мой ответ

Ответ №2:

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

 "query": {
    "bool": {
        "must": [
            {
                "match": {
                    "some-field.b": true
                }
            }
        ],
        "must_not": {
            "nested": {
                "path": "some-other-field",
                "query": {
                    "exists": {
                        "field": "some-other-field.a"
                    }
                }
            }
        }
    }
}
  

Похоже, что моей ошибкой была часть запроса must_not, поскольку какое-то другое поле было вложенным полем