Один из способов заключается в использовании term
фильтр с multi_match
запроса. Для того, чтобы проиллюстрировать, сначала создать некоторые документы:
curl -XPUT "http://localhost:9200/test_index"
curl -XPUT "http://localhost:9200/test_index/person/1" -d'
{
"first_name": "Bob",
"last_name": "Jones",
"building_id": 1
}'
curl -XPUT "http://localhost:9200/test_index/person/2" -d'
{
"first_name": "Bill",
"last_name": "Smith",
"building_id": 1
}'
curl -XPUT "http://localhost:9200/test_index/person/3" -d'
{
"first_name": "Joe",
"last_name": "Williams",
"building_id": 2
}'
curl -XPUT "http://localhost:9200/test_index/person/4" -d'
{
"first_name": "John",
"last_name": "Taylor",
"building_id": 2
}'
curl -XPUT "http://localhost:9200/test_index/person/5" -d'
{
"first_name": "Taylor",
"last_name": "Johnson",
"building_id": 2
}'
Затем, если вы хотите найти все «Taylor» с в дом 2, выполните следующие действия:
curl -XPOST "http://localhost:9200/test_index/person/_search" -d'
{
"query": {
"filtered": {
"query": {
"multi_match": {
"query": "taylor",
"fields": [
"first_name",
"last_name"
]
}
},
"filter": {
"term": {
"building_id": 2
}
}
}
}
}'
, и вы получите обратно результаты:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.94125634,
"hits": [
{
"_index": "test_index",
"_type": "person",
"_id": "5",
"_score": 0.94125634,
"_source": {
"first_name": "Taylor",
"last_name": "Johnson",
"building_id": 2
}
},
{
"_index": "test_index",
"_type": "person",
"_id": "4",
"_score": 0.5906161,
"_source": {
"first_name": "John",
"last_name": "Taylor",
"building_id": 2
}
}
]
}
}
Вот является работоспособным пример (вы должны Elasticsearch на вашем компьютере установлен и работает на локальном хосте: 9200):
http://be6c2e3260c3e2af000.qbox.io/gist/cc47b232ec60f09b93906a5c80028c1317dbdf28
Итак, что вы пробовали? – Mureinik