#elasticsearch
#elasticsearch
Вопрос:
PUT test
{
"mappings":{
"folks":{
"properties":{
"works_at": {
"type": "nested"
}
}
}
}
}
PUT /test/folks/1
{
"type": "lawyer",
"works_at": [
{ "location":"New York"},
{ "location":"Boston"}
]
}
PUT /test/folks/2
{
"type": "lawyer",
"works_at": [
{"location":"Chicago"},
{"location":"Boston"}
]
}
PUT /test/folks/3
{
"type": "writer",
"works_at": [
{"location":"San Francisco"},
{"location":"Boston"}
]
}
Этот поиск приносит НУЛЕВЫЕ результаты:
GET /test/folks/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"works_at.location": "Boston"
}
},
{
"match": {
"type": "lawyer"
}
}
]
}
}
}
Если часть местоположения удалена из поиска:
GET /test/folks/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"type": "lawyer"
}
}
]
}
}
}
Это принесет правильные результаты:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.2876821,
"hits": [
{
"_index": "test",
"_type": "folks",
"_id": "2",
"_score": 0.2876821,
"_source": {
"type": "lawyer",
"works_at": [
{
"location": "Chicago"
},
{
"location": "Boston"
}
]
}
},
{
"_index": "test",
"_type": "folks",
"_id": "1",
"_score": 0.2876821,
"_source": {
"type": "lawyer",
"works_at": [
{
"location": "New York"
},
{
"location": "Boston"
}
]
}
}
]
}
}
Чего мне не хватает в моем запросе с несколькими поисковыми системами?
Комментарии:
1. привет, @JsonGenX, не могли бы вы, пожалуйста, обновить вопрос с деталями сопоставления?
2. @Kamal конечно. добавлено. Спасибо.
3. Отправленный вами запрос не соответствует полям в сопоставлении. В запросе, который у вас есть,
works_at.location
пока в сопоставлении упоминается толькоlocation
. Вы проверили сопоставление теста с помощьюGET test/_mapping
и убедились, что это то, о чем вы упомянули в вопросе выше.4. это проблема с копированием / вставкой. Я пытаюсь упростить проблему… Я еще поработаю над этим. В то же время, знаете ли вы, как ПРИНУДИТЕЛЬНО использовать «И», а не «ИЛИ»? Какой правильный синтаксис для этого?
5. @Kamal Теперь у меня есть полный «нерабочий» пример со всем необходимым кодом.
Ответ №1:
Для поиска вложенного объекта вам нужно использовать вложенный запрос.
Поскольку location
это свойство works_at
вложенного объекта, вы должны изменить запрос, как показано ниже:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "works_at",
"query": {
"match": {
"works_at.location": "Boston"
}
}
}
},
{
"match": {
"type": "lawyer"
}
}
]
}
}
}