Как найти несколько точных значений в определенном поле в запросе 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 ответ
Есть пара вещей:
address
должен быть объявлен какnested object
для предотвращения неправильных результатов поиска в будущем при поиске по адресным полям. Вы можете обратиться сюда для получения дополнительной информации о проблемах сinner object
,nested object
: http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/При использовании
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 } } }
И запрос немного изменится: используйте
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"}}
}
}
]
}
}
}
}
Вы должны ссылаться на документы эластичного поиска для синтаксиса каждого вида запроса. Надеюсь, это поможет