2014-02-20 4 views
8

Я относительно новичок в поиске elastics, и я хотел бы сопоставить одно из моих полей с структурой associative array.Сопоставление ассоциативного массива в Elasticsearch

Что я в настоящее время:

один продукт типа product в индексе products:

{ 
    "name":"Nexus 10", 
    "category":"Tablets", 
    "interests": { 
     "1":30, 
     "3":70 
    } 
} 

Как вы можете видеть, поле interests является ассоциативным массивом. Ключ - User ID, а значение - the number of times the user talked about this product.

Динамическое отображение дало мне:

{ 
    "products":{ 
     "mappings":{ 
     "product":{ 
      "properties":{ 
       "category":{ 
        "type":"string" 
       }, 
       "interests":{ 
        "properties":{ 
        "1":{ 
         "type":"long" 
        }, 
        "3":{ 
         "type":"long" 
        }, 
        } 
       }, 
       "name":{ 
        "type":"string" 
       } 
      } 
     } 
     } 
    } 
} 

Что я хочу:

Поскольку я собираюсь иметь много записей в interests поле, я не хочу, динамическое отображение для сопоставления каждого идентификатора.

Идея заключается в том, чтобы иметь возможность искать конкретное значение user ID в поле interests, чтобы я мог увеличить оценку результата в зависимости от количества раз, когда этот конкретный пользователь говорил об этом продукте.

Я хотел бы иметь возможность сопоставить этот вид структуры.

У вас есть идеи, как достичь этого?

Thanks,

ответ

8

Вам необходимо будет изменить определения объектов.

Имея ключи, основанные на том, что на самом деле значения является проблематичным, так как это приведет к постоянно растущему отображения и, таким образом, кластерный состояние. Это также приведет к изворотливым поисковым запросам.

Это довольно распространенный вопрос/вопрос, который я посвятил этому разделу в своей статье о Troubleshooting Elasticsearch searches, for Beginners.

Что вы, вероятно, захотите сделать, это либо использовать вложенные документы, либо отношения parent-child. Если вы часто обновляете счетчики, вам нужно использовать parent-child, поскольку вложенные документы будут вызывать переиндексацию всего объекта. Однако вложенные doc будут быстрее искать время поиска, и вы, скорее всего, захотите каким-то образом заглушить обновления.

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

name: Nexus 10 
category: Tablets 
interests: 
    - user_id: 1 
     mentions: 30 
    - user_id: 3 
     mentions: 70 
+0

Большое спасибо за ваш ответ. Ваша статья очень интересная, я буду держать это: D. Просто быстрый вопрос, однако, это означает, что вместо того, чтобы иметь такой скрипт: '_score * (интересы содержат userId? NumberOfMentions: 1)' Мне нужно 'foreach интересы: искать userId передано как param'? – Brice

+1

Если вы используете «вложенный» запрос, вы можете использовать, например. 'total' как' score_mode', чтобы суммировать десятки всех соответствующих документов. Вот пример: https://www.found.no/play/gist/4a68e0e1e724e0f9e693 –

+0

Большое вам спасибо! – Brice

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