Фасетная постфильтрация в Solr (перевод с постфильтрации агрегации ElasticSearch)

Допустим, у меня есть такая структура:

{"account_number":171,"balance":7091,
"firstname":"Nelda","lastname":"Hopper",
"age":39,"gender":"M",
"address":"742 Prospect Place","employer":"Equicom",
"email":"neldahopper@equicom.com",
"city":"Finderne","state":"SC"}

(данные поступают отсюда).

Если я напишу следующий запрос в ElasticSearch:

POST /bank/_search?pretty
{
 "query":
  { "bool":
    { "must":
      [ { "range":
      { "balance": { "gte": 30000 } } } ] }   
  },
   "fields":["gender", "balance", "age"],

  "aggs":{
    "age_filter":{
      "filter":{
        "match":{
       "age":"30"
        }
      },
      "aggs":{
    "gender_stats":{
      "terms":{"field":"gender"}
    }
      }
    }
  }
}

Я получу (1) 402 результата запроса для основного запроса и (2) агрегацию по 18 результатам, прошедшим фильтр "age:30".

Я пытался сделать аналогичный трюк в Solr 5.1, но я смог получить следующие результаты:

q=balance:[30000%20TO%20*]&facet=true&facet.field=gender&fq=age:30

с большой разницей, что фильтр теперь применяется к основным результатам запроса, поэтому я получаю только 18 результатов, а затем применяю соответствующую фасетку.

Есть ли способ написать запрос Solr, который полностью эквивалентен запросу ElasticSearch? Т.е. получить полные результаты, а затем применить фильтрацию только к агрегации / огранке?

NB: я пробовал исключение по тегу:

q={!ex=tagForAge}balance:[30000%20TO%20*]&facet=true&facet.field=gender&fq={!tag="tagForAge"}age:30 

но это не относится к основному запросу.

1 ответ

Попробуйте добавить &facet.query=age:30 на ваш запрос.

Это в основном сгенерирует ваши аспекты из определенного поискового запроса, который в вашем случае age:30,

Для получения дополнительной информации проверьте здесь.

Другие вопросы по тегам