#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. Я обновил его. Спасибо, теперь это работает. в моей последней попытке была опечатка. работает отлично!