2014-01-07 3 views
0

Я пытаюсь найти человека по имени или фамилии, все из которых имеют одинаковое имя building_id.
Например, кто-то будет помещать имя в текстовое поле, которое может быть первым или последним. У всех будет одинаковый идентификатор здания. Кажется, я не могу найти это в документации для поиска эластичности. Мой результат данных выглядит следующим образом:Поиск по имени или фамилии и конкретному связанному идентификатору?

{ 
    took: 9, 
    timed_out: false, 
    _shards: { 
     total: 5, 
     successful: 5, 
     failed: 0 
    }, 
    hits: { 
     total: 56, 
     max_score: 1, 
     hits: [ 
    { 
     _index: "jdbc", 
     _type: "jdbc", 
     _id: "5", 
     _score: 1, 
     _source: { 
      first_name: "some first name", 
      last_name: "some last name", 
      building_id: 1 
     } 
    }, 
... 
... 
+0

Итак, что вы пробовали? – Mureinik

ответ

2

Один из способов заключается в использовании 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

+0

Удивительно. Почему 'multi_match' в' query' и 'term' в' filter'? И для их обоих они должны быть «отфильтрованы»? – Johnston

+1

Это именно то, как вы настроили отфильтрованный запрос: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html. Я внимательно следил за этим примером. Единственная запутанная вещь заключается в том, что вся конструкция должна войти в блок запроса. –

+2

Основная идея состоит в том, что отфильтрованный запрос содержит запрос и фильтр. Фильтр будет блокировать документы, которые не соответствуют определенным критериям, и немного эффективнее других запросов. Отфильтрованный запрос - это не единственный способ выполнить то, что вы хотели, он был первым, кто пришел на ум. –

Смежные вопросы