#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, поскольку какое-то другое поле было вложенным полем