2014-10-30 4 views
2

Я использую жемчужину модели elasticsearch для модели с отношением has_many. Чтобы соответствовать документации, предположим, что модель равна Article, а отношение равно has_many categories. Поэтому я написал сериализатор клиента следующим образом (непосредственно из документации):rails elasticsearch ищет вложенное поле json

def as_indexed_json(options={}) 
    self.as_json(
    include: { categories: { only: :title}, 
      }) 
end 

Сериализация, похоже, сработает. Результат примера. В статье as_indexed_json содержится блок "categories" => {"title"=> "one", "title"=> "two", "title"=> "three"}.

То, с чем я борюсь, и не смог найти в документации, - это поиск этого вложенного поля.

Вот что я пробовал:

От elasticsearch documentation on nested query я полагал, что это должно выглядеть следующим образом:

r = Article.search query: { 
    nested: { 
     path: "categories", 
     query: {match: {title: "one"}} 
    } 
} 

но когда я r.results.first я получаю сообщение об ошибке: nested object under path [categories] is not of nested type] ...

Я попытался добавить одну строчку в сериализаторе: include: { categories: { type: "nested", only: :title}, но это ничего не меняет, он все еще говорит, что категории не имеют вложенного типа.

Конечно, я пытался просто запрашивая поле без вложенности тоже так:

r = Article.search query: {match: {categories: 'one'}} 

Но это просто не возвращает никаких результатов.

полнотекстового поиска, как это:

r = Article.search query: {match: {_all: 'one'}} 

Возвращает результаты, но, конечно, я только хочу, чтобы искать «один» в поле категорий.

Любая помощь была бы высоко оценена!

ответ

0

Rails не создавать вложенности отображение в elasticsearch , Elasticsearch делает категории как объект, а не вложенным дочерним, используя динамическое сопоставление («Когда Elasticsearch встречает ранее неизвестное поле в документе, он использует динамическое сопоставление для определения типа данных для этого поля и автоматически добавляет новое поле к сопоставлению типов как объект без их вложения "). Для создания вложенного объекта вам нужно снова создать сопоставление в elasticsearch с категориями как вложенный тип, тип уведомления вложенным из категории.

PUT /my_index 
{ 
    "mappings": { 
    "article": { 
     "properties": { 
     "categories": { 
      "type": "nested", 
      "properties": { 
      "name": { "type": "string" }, 
      "comment": { "type": "string" }, 
      "age":  { "type": "short" }, 
      "stars": { "type": "short" }, 
      "date": { "type": "date" } 
      } 
     } 
     } 
    } 
    } 
} 

После этого вы можете либо переиндексации данные клиента или если вы хотите с нулевым временем простоя чтения here.

P.S: Вы должны удалить старое сопоставление для определенного индекса перед созданием нового.

0

Хорошо, так что это выглядит следующим образом: r = Article.search query: {match: {"categories.title" => 'one'}} работает, но я оставлю этот вопрос открытым в случае, если кто-то может объяснить, что происходит с вложенной вещь ...

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