Использование поиска в строке запроса с помощью post_filter

#javascript #elasticsearch

#javascript #elasticsearch

Вопрос:

Я пытаюсь выполнить поиск по городу, используя query_string и asterix ( query: `${city}*` ), а также фильтруя результаты по countryId . Запрос хорошо работает без фильтрации по идентификатору страны, но при добавлении фильтра он ничего не находит. Boty city и countryId были отображены как text .

Код:

 const elasticsearch = require('elasticsearch');

...

this.client = new elasticsearch.Client({
            hosts: [this._serviceUri]
        });

...

// The interesting part:
const results = await this.client.search({
            index: 'cities',
            body: {
                query: {
                    query_string: {
                        query: `${city}*`,
                        fields: ['city', 'countryId'],
                        // type: 'best_fields'
                    }
                },
                post_filter: { term: { countryId } }
            }
        });
  

Как я могу правильно отфильтровать результаты с помощью post_filter или чего-то подобного?

ОБНОВЛЕНИЕ: Вот как выглядит сопоставление:

 mappings: {
        _doc: {
            properties: {
                "city": {type: 'text'},
                "countryId": {type: 'text'}
            }
        }
    }
  

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

1. почему вы используете post_filter, а не bool / filter?

2. потому что у меня это не сработало. возможно, я сделал что-то не так с этим. не могли бы вы показать мне пример? Спасибо!

Ответ №1:

Я бы сделал это таким образом, не прибегая к post_filter :

 // The interesting part:
const results = await this.client.search({
        index: 'cities',
        body: {
            query: {
                bool: {
                    must: {
                        query_string: {
                            query: `${city}*`,
                            fields: ['city', 'countryId'],
                            // type: 'best_fields'
                        }
                    },
                    filter: {
                        term: { 
                            countryId: `${countryId}`,
                        }
                    }
                }
            }
        }
    });
  

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

1. спасибо, но это также не дает мне никакого результата … может ли это иметь какое-либо отношение к отображению? или чего я здесь не понимаю? обратите внимание, что без части ‘filter’ это действительно дает мне результаты. но, как я уже упоминал, мне нужно, чтобы они фильтровались по CountryId

2. Пожалуйста, обновите свой пост своим отображением и примером документа, который должен соответствовать

3. Я обновил его. Спасибо, теперь это работает. в моей последней попытке была опечатка. работает отлично!