Как написать условное в поисковом запросе?

#elasticsearch

#elasticsearch

Вопрос:

Я ищу среди документов в определенном районе. Документы имеют различные статусы. Цель состоит в том, чтобы вернуть все документы, за исключением случаев, когда код статуса документа ABCD равен — такие документы должны быть возвращены только в том случае, если их идентификатор больше 100. Я пробовал писать несколько запросов, включая приведенный ниже, который возвращает только ABCD документы с идентификатором больше 100 и ни один из других документов. Что здесь не так? Как я могу также получить документы, отличные от ABCD?

     "_source": true,
    "from": 0,
    "size": 50,
    "sort": [
      {
        "firstStamp": "DESC"
      }
    ],
    "query": {
      "bool": {
        "must": [
          {
            "term": {
              "districtId": "3755"
            }
          },
          {
            "bool": {
              "must": [
                {
                  "terms": {
                    "documentStatus.code.keyword": [
                      "ABCD"
                    ]
                  }
                },
                {
                  "bool": {
                    "must": {
                      "script": {
                        "script": "doc['id'].value > 100"
                      }
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }```
  

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

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

Ответ №1:

Поскольку вы не добавили никакого сопоставления индексов, просмотр данных вашего поискового запроса, похоже, относится к типу данных поля объекта. Насколько я понимаю, ваша цель — вернуть все документы, за исключением случаев, когда код статуса документа ABCD равен и документ с кодом статуса ABCD должен быть возвращен только в том случае, если их идентификатор больше 100.

Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска

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

 {
  "id":200,
  "documentStatus":{
    "code":"DEF"
  }
}
{
  "id":200,
  "documentStatus":{
    "code":"ABCD"
  }
}
{
  "id":100,
  "documentStatus":{
    "code":"ABCD"
  }
}
  

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

 {
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "terms": {
                  "documentStatus.code.keyword": [
                    "ABCD"
                  ]
                }
              },
              {
                "bool": {
                  "must": {
                    "script": {
                      "script": "doc['id'].value > 100"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must_not": {
              "terms": {
                "documentStatus.code.keyword": [
                  "ABCD"
                ]
              }
            }
          }
        }
      ]
    }
  }
}
  

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

 "hits": [
      {
        "_index": "stof_64351595",
        "_type": "_doc",
        "_id": "2",
        "_score": 2.0,
        "_source": {
          "id": 200,
          "documentStatus": {
            "code": "ABCD"
          }
        }
      },
      {
        "_index": "stof_64351595",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.0,
        "_source": {
          "id": 200,
          "documentStatus": {
            "code": "DEF"
          }
        }
      }
    ]
  

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

1. @ikaln00 спасибо, что приняли мой ответ 🙂 не могли бы вы также поддержать мой ответ 🙂

Ответ №2:

Вам нужно использовать must_not в вашем запросе, если вы хотите иметь документы, у которых нет кода статуса = ABCD . Итак, ваш запрос будет примерно таким:

     "from": 0,
    "size": 50,
    "sort": [
      {
        "firstStamp": "DESC"
      }
    ],
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "districtId": "3755"
          }
        },
        {
          "range": {
            "id": {
              "gt": 100
            }
          }
        }
      ],
      "must_not": [
        {
          "terms": {
            "documentStatus.code.keyword": [
              "ABCD"
            ]
          }
        }
      ]
    }
  }
}