ElasticSearch: Поиск полей во вложенных массивах
Я довольно новичок в ES и использую его для своего нового проекта. Для начала у меня есть простое сопоставление для клиента, которое имеет имя и фамилию, а также список объектов платежной информации. Если бы я делал это в SQL, это было бы что-то вроде таблицы customer и таблицы payment info с отношением 1:many.
вот простой пример того, что я пытаюсь сделать: https://gist.github.com/anonymous/6109593
Я надеюсь найти клиент, основанный на любом совпадении во вложенном массиве paymentInfos, то есть на поиске пользователей, у которых был paymentInfo с billingZip 10101. Этот запрос не возвращает результатов, и я не уверен, почему. Может ли кто-нибудь указать мне в правильном направлении, почему этот запрос не работает, и если есть какие-либо изменения, которые я могу внести в свой запрос или сопоставление, чтобы он вернул пользователя правильно?
спасибо!
1 ответов
вложенные поля следует искать с помощью вложенный запрос:
echo "Deleting old ElasticSearch index..."
curl -XDELETE 'localhost:9200/arrtest'
echo
echo "Creating new ElasticSearch index..."
curl -XPUT 'localhost:9200/arrtest/?pretty=1' -d '{
"mappings" : {
"cust2" : {
"properties" : {
"firstName" : {
"type" : "string",
"analyzer" : "string_lowercase"
},
"lastName" : {
"type" : "string",
"analyzer" : "string_lowercase"
},
"paymentInfos": {
"properties": {
"billingZip": {
"type": "string",
"analyzer": "string_lowercase"
},
"paypalEmail": {
"type": "string",
"analyzer": "string_lowercase"
}
},
"type": "nested"
}
}
}
},
"settings" : {
"analysis" : {
"analyzer" : {
"uax_url_email" : {
"filter" : [ "standard", "lowercase" ],
"tokenizer" : "uax_url_email"
},
"string_lowercase": {
"tokenizer" : "keyword",
"filter" : "lowercase"
}
}
}
}
}
'
echo
echo "Index recreation finished"
echo "Inserting one record..."
curl -XPUT 'localhost:9200/arrtest/cust2/1' -d '{
"firstName": "john",
"lastName": "smith",
"paymentInfos": [{
"billingZip": "10101",
"paypalEmail": "foo@bar.com"
}, {
"billingZip": "20202",
"paypalEmail": "foo2@bar2.com"
}]
}
'
echo
echo "Refreshing index to make new records searchable"
curl -XPOST 'localhost:9200/arrtest/_refresh'
echo
echo "Searching for record..."
curl -XGET 'localhost:9200/arrtest/cust2/_search?pretty=1' -d '{
"sort": [],
"query": {
"bool": {
"should": [],
"must_not": [],
"must": [{
"nested": {
"query": {
"query_string": {
"fields": ["paymentInfos.billingZip"],
"query": "10101"
}
},
"path": "paymentInfos"
}
}]
}
},
"facets": {},
"from": 0,
"size": 25
}'
echo