Ошибка синтаксического анализа при использовании терминов в ElasticSearch - PullRequest
0 голосов
/ 28 декабря 2018

Я получаю ошибку в этом упругом поиске по терминам.Сообщение об ошибке:

"[parsing_exception] [термины] неизвестный токен [START_ARRAY] после [activeIds], с {line = 1 & col = 63}"

Active Ids - это массивуникальные идентификаторы.Это выглядит как

const activeIds = [ '157621a1-d892-4f4b-80ca-14feddb837a0',
'd04c5c93-a22c-48c3-a3b0-c79a61bdd923',
'296d40d9-f316-4560-bbc9-001d6f46858b',
'2f8c6c37-588d-4d24-9e69-34b6dd7366c2',
'ba0508dd-0e76-4be8-8b6e-9e938ab4abed',
'ab076ed9-1dd5-4987-8842-15f1b995bc0d',
'ea6b0cff-a64f-4ce3-844e-b36d9f161e6f' ]



let items = await es.search({
        "index": table,
        "body": {
          "from": 0, "size": 25,
          "query": {
            "terms" : {
                "growerId" : { 
                    activeIds
                }
            },
            "bool": {
                "must_not": [ 
                    { "match":  
                        { 
                            "active": false
                        }
                    },
                ],
                "must": [
                            { "query_string" : 
                                { 
                                    "query": searchQuery,
                                    "fields": ["item_name"] 
                                }
                            }
                        ],
                    }
                }
            }
        })

Оцените помощь!

Редактировать: Отвечая на этот вопрос: «Каков ожидаемый результат? Можете ли вы разработать и поделиться некоторыми образцами данных? - Нишант Саини 15 часовago "

Я попытаюсь немного уточнить.

1) В целом я пытаюсь получить элементы, которые принадлежат активным пользователям.Есть 2 таблицы: user и items.Поэтому я изначально запускаю ES, который возвращает всех пользователей, которые содержат { active: true } из таблицы user

2) Запуск этого ES возвращает массив идентификаторов, которые я называю activeIds.Массив выглядит так, как я уже показал в моем примере.Так что пока это работает (дайте мне знать, если вы хотите увидеть код для этого, но если я получаю ожидаемый результат, то я не думаю, что нам это нужно сейчас)

3) Теперь я хочувыполнить поиск в таблице items и извлечь только элементы, содержащие один из активных идентификаторов.Таким образом, элемент должен выглядеть следующим образом:

ITEM

4) ожидаемый результат - получить массив объектов, которые соответствуют growerId одному из activeIds.Так что, если я сделаю поисковый запрос для «цветов», один ожидаемый результат должен выглядеть следующим образом:

[ { _index: 'items-dev',
_type: 'items-dev_type',
_id: 'itemId=fc68dadf-21c8-43c2-98d2-cf574f71f06d',
_score: 11.397207,
_source: 
{ itemId: 'fc68dadf-21c8-43c2-98d2-cf574f71f06d',
'@SequenceNumber': '522268700000000025760905838',
item_name: 'Flowers',
grower_name: 'Uhs',
image: '630b5d6e-566f-4d55-9d31-6421eb2cff87.jpg',
dev: true,
growerId: 'd04c5c93-a22c-48c3-a3b0-c79a61bdd923',
sold_out: true,
'@timestamp': '2018-12-20T16:09:38.742599',
quantity_type: 'Pounds',
active: true,
pending_inventory: 4,
initial_quantity: 5,
price: 10,
item_description: 'Field of flowers' } },

Так что здесь growerId соответствует activeIds[1]

Но если я сделаюВ результате поиска «невидимый», созданный неактивным пользователем, я получаю:

[ { _index: 'items-dev',
_type: 'items-dev_type',
_id: 'itemId=15200473-93e1-477c-a1a7-0b67831f5351',
_score: 1,
_source: 
{ itemId: '15200473-93e1-477c-a1a7-0b67831f5351',
'@SequenceNumber': '518241400000000004028805117',
item_name: 'Invisible too',
grower_name: 'Field of Greens',
image: '7f37d364-e768-451d-997f-8bb759343300.jpg',
dev: true,
growerId: 'f25040f4-3b8c-4306-9eb5-8b6c9ac58634',
sold_out: false,
'@timestamp': '2018-12-19T20:47:16.128934',
quantity_type: 'Pounds',
pending_inventory: 5,
initial_quantity: 5,
price: 122,
item_description: 'Add' } },

Теперь, когда growerId не соответствует ни одному из идентификаторов в activeIds.

5) Используя код, с которым вы помогли, он возвращает 0 элементов.

Дайте мне знать, если вам нужно больше деталей.Я работал над этим слишком долго: \

1 Ответ

0 голосов
/ 28 декабря 2018

Запрос условий принимает массив терминов, поэтому запрос условий должен быть определен следующим образом:

  "terms": {
    "growerId": activeIds
  }

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

{
  "from": 0,
  "size": 25,
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "active": false
          }
        }
      ],
      "must": [
        {
          "query_string": {
            "query": searchQuery,
            "fields": [
              "item_name"
            ]
          }
        },
        {
          "terms": {
            "growerId": activeIds
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...