Почему мой запрос ElasticSeach возвращает нулевой документ? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь запросить домен AWS ElasticSearch у Lambda worker.

Для этого я использую http- aws -es и основной javascript клиент для Elasti c Поиск.

Я запрашиваю документы со следующими соответствующими полями:

  • A ref поле - String
  • A status field - String ENUM (REMOVED, BLOCKED, PUBLISHED, PENDING, VERIFIED)
  • A field field - String Array
  • A thematics field - Строковый массив

Я хочу достичь:

  1. Отфильтровать все документы, которые не являются PUBLISHED или VERIFIED или где поле ref set
  2. Возвращает наилучшие совпадения с моим keywwords аргументом (строковым массивом) относительно значений в field и thematics
  3. Сортировка для размещения документов со статусом PUBLISHED сначала
  4. Ограничьте количество результатов до 20

Я нашел оператор more_like_this и попробовал. Я строю свой запрос шаг за шагом, и фактическая версия, по крайней мере, не возвращает ошибку, но документы не возвращаются. Он по-прежнему пропускает фильтр ref + # 3 и # 4 сверху. Вот запрос:

  const client = new elasticsearch.Client({
      host: ELASTICSEARCH_DOMAIN,
      connectionClass: httpAwsEs,
      amazonES: {
        region: AWS_REGION,
        credentials: new AWS.EnvironmentCredentials('AWS')
      }
    })
    let keywords = event.arguments.keywords
    let rst = await client.search({
      body: {
        'query': {
          'bool': {
            'filter': {
              'bool': {
                'must_not': [
                  {
                    'term': {
                      'status': 'REMOVED'
                    }
                  },
                  {
                    'term': {
                      'status': 'PENDING'
                    }
                  },
                  {
                    'term': {
                      'status': 'BLOCKED'
                    }
                  }
                ]
              }
            },
            'must': {
              'more_like_this': {
                'fields': ['field', 'thematics'],
                'like': keywords,
                'min_term_freq': 1,
                'max_query_terms': 2
              },
              'should': [
                {
                  'term': {
                    'status': 'PUBLISHED'
                  }
                }
              ]
            }
          }
        }
      }

    })
    console.log(rst)
    return rst

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

РЕДАКТИРОВАТЬ:

По запросу, вот мое отображение индекса (с типом JS):

  • текст города (строка)
  • текст contact_email ( String)
  • текст contact_entity (String)
  • contact_firstname text (String)
  • contact_lastname text (String)
  • текст контактов (String list)
  • текст страны (String)
  • createdAt date (String)
  • текст описания (String)
  • editKey text (String)
  • текст поля ( String)
  • id text (String)
  • name text (String)
  • pubId text (String)
  • ref текст (String)
  • текст состояния (строка)
  • текст состояния (строка)
  • тематический текст (массив строк)
  • текст типа (массив строк)
  • updatedAt ( String)
  • текст URL (String)
  • verifyKey text (String)
  • текст зоны (String Array)

Взято из AWS elasti c консоль управления поиском (вкладки указателя> сопоставление с)

1 Ответ

1 голос
/ 26 мая 2020

В вашем запросе есть одна или две проблемы (should внутри must и must_not внутри filter). Вместо этого попробуйте выполнить упрощенный запрос ниже:

{
  'query': {
    'bool': {
      'must_not': [
        {
          'term': {
            'status.keyword': 'REMOVED'
          }
        },
        {
          'term': {
            'status.keyword': 'PENDING'
          }
        },
        {
          'term': {
            'status.keyword': 'BLOCKED'
          }
        }
      ],
      'must': [
        {
          'more_like_this': {
            'fields': [
              'field',
              'thematics'
            ],
            'like': keywords,
            'min_term_freq': 1,
            'max_query_terms': 2
          }
        }
      ],
      'should': [
        {
          'term': {
            'status.keyword': 'PUBLISHED'
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...