Пустой вывод при запросе определенного поля - PullRequest
0 голосов
/ 06 ноября 2019

Я хотел бы получить данные из моего индексаasticSearch.

Итак, у меня есть следующий индекс:

С узлом, если я сделаю:

const hits = await elasticClient.search({
    index: esIndex,
    size: 999,
    sort: 'ts:desc',
    body: {
      query: {
        bool: {
          must: [
            {
              term: {
                userId: '56',
              },
            }
          ],
        },
      },
    },
  });

он вернет:

[
    {
        "_index": "events_rc",
        "_type": "_doc",
        "_id": "tf-szm0B_tB6kax4xmnr",
        "_score": null,
        "_source": {
            "userId": "56",
            "eventName": "synchronizationStart",
            "ts": 1571130486383
        }
    },
    {
        "_index": "events_rc",
        "_type": "_doc",
        "_id": "tP-szm0B_tB6kax4xmnr",
        "_score": null,
        "_source": {
            "userId": "56",
            "eventName": "showSynchronizationModal",
            "ts": 1571130447209
        }
    }
]

, но если я сделаю следующий запрос:

const hits = await elasticClient.search({
    index: esIndex,
    size: 999,
    sort: 'ts:desc',
    body: {
      query: {
        bool: {
          must: [
            {
              term: {
                eventName: 'synchronizationStart',
              },
            }
          ],
        },
      },
    },
});

, он вернет пустой массив ...

Я хотел бы знатьпочему он может найти совпадения с userId, но не с eventName?

Отображение, кажется, идентично для 2 полей

"eventName": {
  "type": "text",
  "fields": {
  "keyword": {
    "type": "keyword",
    "ignore_above": 256
  }
}
"userId": {
  "type": "text",
  "fields": {
  "keyword": {
    "type": "keyword",
    "ignore_above": 256
  }
}

thx

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

eventName имеет тип текст . Вы должны использовать совпадение, а не термин.

Избегайте использования термина запрос для текстовых полей.

Взят из Здесь

Если вы будете использовать eventName.keyword , вам нужно будет добавить пользовательский нормализатор к вашему полю, в противном случае вам придется искать термин точный .

Изменить

    const hits = await elasticClient.search({
    index: esIndex,
    size: 999,
    sort: 'ts:desc',
    body: {
      query: {
        bool: {
          must: [
            {
              term: {
                eventName: 'synchronizationStart',
              },
            }
          ],
        },
      },
    },
});

Кому:

const hits = await elasticClient.search({
index: esIndex,
size: 999,
sort: 'ts:desc',
body: {
  query: {
    bool: {
      must: [
        {
          match: {
            eventName: 'synchronizationStart',
          },
        }
      ],
    },
  },
},

});

1 голос
/ 06 ноября 2019

Вам нужно запросить в поле eventName.keyword, и оно будет работать:

const hits = await elasticClient.search({
    index: esIndex,
    size: 999,
    sort: 'ts:desc',
    body: {
      query: {
        bool: {
          must: [
            {
              term: {
                'eventName.keyword': 'synchronizationStart',
              },
            }
          ],
        },
      },
    },
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...