2013-04-16 2 views
0

У меня есть приложение Rails, в котором за темой могут следовать различные пользователи. Я хочу, чтобы найти тему, соответствующую имени, и за ним следует конкретный пользователь. Только с использованием инструкции Tire query без filter.Как определить свойство Tire типа, вложенного в блок сопоставления ActiveRecord?

Для этого я намерен использовать a boolean query with a nested query.

Вот моя тема модель:

class Topic < ActiveRecord::Base 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    mapping do 
    indexes :name 
    indexes :follower_ids, type: 'nested', as: "indexed_follower_ids", id: 'integer' 
    end 
    def indexed_follower_ids 
    followers.pluck(:id).map { |id| {id: id} }.to_json 
    end 

    attr_accessible :name 

end 

Модель Follow содержит

after_save :update_topic_index 
def update_topic_index 
    topic.tire.update_index 
end 

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

User.create! name: "user0" 
Topic.create! name: "topic0" 
Follow.create! user: User.first, topic: Topic.first 

Я вижу следующие ошибки в журналах сервера ElasticSearch:

[2013-04-16 15:07:28,564][INFO ][cluster.metadata   ] [Sligguth] [topics] creating index, cause [api], shards [5]/[1], mappings [topic] 
[2013-04-16 15:07:28,690][DEBUG][action.index    ] [Sligguth] [topics][2], node[UdT6jTecRNuzdRkxkX2uUA], [P], s[STARTED]: Failed to execute [index {[topics][topic][1], source[{"name":"topic0","follower_ids":"[]"}]}] 
org.elasticsearch.index.mapper.MapperParsingException: object mapping for [topic] tried to parse as object, but got EOF, has a concrete value been provided to it? 
at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:457) 
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:494) 
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:438) 
at org.elasticsearch.index.shard.service.InternalIndexShard.prepareIndex(InternalIndexShard.java:308) 
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:202) 
at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:532) 
at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1.run(TransportShardReplicationOperationAction.java:430) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:680) 
[2013-04-16 15:07:28,709][DEBUG][action.index    ] [Sligguth] [topics][2], node[UdT6jTecRNuzdRkxkX2uUA], [P], s[STARTED]: Failed to execute [index {[topics][topic][1], source[{"name":"topic0","follower_ids":"[{\"key_id\":1}]"}]}] 
org.elasticsearch.index.mapper.MapperParsingException: object mapping for [topic] tried to parse as object, but got EOF, has a concrete value been provided to it? 
at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:457) 
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:494) 
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:438) 
at org.elasticsearch.index.shard.service.InternalIndexShard.prepareIndex(InternalIndexShard.java:308) 
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:202) 
at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:532) 
at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1.run(TransportShardReplicationOperationAction.java:430) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:680) 

Любая идея, почему ElasticSearch терпит неудачу на индексирует вложенную follower_ids?

+0

Глядя на фрагменте кода для 'Follow.create! user: User.first, topic: Topic.first', вы, кажется, ссылаетесь на класс User, а не на экземпляр объекта. Если вы говорите 'u0 = User.create! name: "user0"; t0 = Тема. Создать! name: "topic0"; Follow.create! user: u0, topic: t0; '- или что-то подобное? – Phil

+0

нет, 'User.first' возвращает экземпляр объекта User, так что это нормально – Florent2

+0

Угадайте, я не знаю, как шить достаточно, чтобы действительно помочь. Вам удалось заставить один и тот же сервер индексировать не вложенные документы или отдельные документы, связанные с атрибутом _parent? – Phil

ответ

0

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

редактировать: Просто увидел нить выше, при запросе для follower_ids, использовать фильтр вместо указания запроса терминов в логическом значении и посмотреть, как это работает