Как найти несколько точных значений в определенном поле в запросе asticsearch?

Мои образцы данных показаны ниже:

{"listings":{"title" : "testing 1", "address" : { "line1" : "3rd cross", "line2" : "6th main", "line3" : "", "landmark" : "", "location" : "k r puram", "pincode" : "", "city" : "Bangalore" },"purpose":"rent","published": true, "inActive": false }, {"listings":{"title" : "testing 2", "address" : { "line1" : "3rd cross", "line2" : "6th main", "line3" : "", "landmark" : "", "location" : "banaswadi", "pincode" : "", "city" : "Bangalore" },"purpose":"sale","published": true, "inActive": false }, {"listings":{"title" : "testing 3", "address" : { "line1" : "3rd cross", "line2" : "6th main", "line3" : "", "landmark" : "", "location" : "tin factory", "pincode" : "", "city" : "Bangalore" },"purpose":"rent","published": true, "inActive": false }

Мое отображение индекса показано ниже:

curl -X PUT localhost:9200/testing/listings/_mapping -d '{
 "listings" : {
    "properties" : {
        "address" : {
           "properties": {
              "location": { "type" : "string",
                            "index" : "not_analyzed"
               }
            }
        },
        "suggest" : { 
             "type" : "completion", 
             "index_analyzer" : "simple",
             "search_analyzer" : "simple",
             "payloads" : true
        }                              
    }                                  
  }
}'

Я получаю доступ к объекту списков на основе целевого значения имущества, как аренда или продажа. Я могу получить доступ к объектам для аренды и продажи в индивидуальном порядке. Как я могу получить доступ к объектам списков как для стоимости аренды, так и для продажи. Я использовал приведенный ниже запрос, чтобы получить объект аренды и продажи.

{"query":{
   "filtered": {
     "filter": {
       "terms": {
         "purpose" : ["rent", "sale"]
        }
      }
    },
   "bool":{
     "must":[
       {"match":{"published":true}},
       {"match":{"inActive":false}},
       {"match":{"address.city": "bangalore"}}
      ]
   }
 }
}

Пожалуйста, предложите изменения по мере необходимости. Заранее спасибо.

1 ответ

Есть пара вещей:

  1. address должен быть объявлен как nested object для предотвращения неправильных результатов поиска в будущем при поиске по адресным полям. Вы можете обратиться сюда для получения дополнительной информации о проблемах с inner object, nested object: http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/

  2. При использовании nested objectотображение будет выглядеть так (тип адреса: вложенный): "listings" : { "properties" : { "address" : { "type" : "nested", "properties": { "location": { "type" : "string", "index" : "not_analyzed" } } }, "suggest" : { "type" : "completion", "index_analyzer" : "simple", "search_analyzer" : "simple", "payloads" : true } } }

  3. И запрос немного изменится: используйте terms с execution=andи использовать nested query для полей адреса:

"query":{ "filtered": { "filter": { "terms": { "execution" : "and", "purpose" : ["rent", "sale"] } }, "query" : { "bool":{ "must":[ {"term":{"published":true}}, {"term":{"inActive":false}}, { "nested": { "path": "address", "query": {"match":{"address.city": "bangalore"}} } } ] } } } }

Вы должны ссылаться на документы эластичного поиска для синтаксиса каждого вида запроса. Надеюсь, это поможет

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