У меня есть коллекция адресов. Давайте упростим и скажем, что единственными полями являются postcode
, city
, street
, streetnumber
и name
. Я хотел бы иметь возможность предлагать список улиц, когда пользователь вводит почтовый индекс, город и некоторый запрос для улицы.
Например, если пользователь в HTML-форме вводит:
postcode: 75010
city: Paris
street: rue des
Я хотел бы получить список улиц, например
'rue des petites écuries'
'rue des messageries'
...
'rue du faubourg poissonnière'
...
что я мог бы предложить пользователю.
Итак, я хотел бы получить список уникальных значений поля «улица», отсортированных по тому, насколько хорошо они соответствуют моему запросу в поле «улица». Я хочу получить 10 наиболее подходящих улиц для этого запроса.
Запрос, возвращающий документы, будет выглядеть так:
{
"query": {
"bool": {
"must": [
{{"term": {"postcode": "75010"}},
{{"term": {city": "Paris"}},
{{"match": {"street": "rue des"}}
]
}
}
}
Но, конечно, одна и та же улица будет появляться много раз, поскольку каждая улица может появляться несколько раз по разным адресам в коллекции.
Я попытался использовать структуру «агрегации» и добавил аггс:
{
"query": {
"bool": {
"must": [
{{"term": {"postcode": "75010"}},
{{"term": {city": "Paris"}},
{{"match": {"street": "rue des"}}
]
}
},
"aggs": {
"street_agg": {
"terms": {
"field": "street",
"size": 10
}
}
}
}
Проблема в том, что он автоматически сортируется не по количеству баллов, а по количеству документов в каждой корзине.
Я хотел бы, чтобы корзины были отсортированы по оценке произвольного документа, выбранного в каждой корзине (да, достаточно получить оценку из одного документа в корзине, так как оценка зависит только от содержимого поля улицы в моем пример).
Как бы вы этого добились?