#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"
]
}
}
]
}
}
}