Эластичный поиск вложен

Я использую эластичный поиск через шинный камень.

Учитывая эту структуру для индексации моей модели ресурсов

mapping do
  indexes :_id
  indexes :version,             analyzer: 'snowball', boost: 100 
  indexes :resource_files do
    indexes :_id
    indexes :name,                analyzer: 'snowball', boost: 100
    indexes :resource_file_category do
      indexes :_id
      indexes :name,                analyzer: 'snowball', boost: 100
    end
  end
end

Как я могу получить все ресурсы, у которых есть resource_files с заданным идентификатором resource_file_category?

я просмотрел документы эластичного поиска и думаю, что мог бы использовать дочерний фильтр http://www.elasticsearch.org/guide/reference/query-dsl/has-child-filter.html

я пробовал так

filter :has_child, :type => 'resource_files', :query => {:filter => {:has_child => {:type => 'resource_file_category', :query => {:filter => {:term => {'_id' => params[:resource_file_category_id]}}}}}}

но я не уверен, возможно ли/действительно ли сделать «вложенный фильтр has_child» или есть ли лучший/более простой способ сделать это... любые советы приветствуются;)


person brayancastrop    schedule 16.07.2012    source источник
comment
Я бы посоветовал держаться подальше от родителя/потомка и просто денормализовать категории в записи, как массив идентификаторов/имен/и т.д. Как только вы это заработаете, вы можете приступить к использованию вложенных или родительских/дочерних функций.   -  person karmi    schedule 25.07.2012


Ответы (2)


Боюсь, я не знаю, что означает ваше определение отображения. Было бы легче читать, если бы вы просто опубликовали вывод:

curl -XGET 'http://127.0.0.1:9200/YOUR_INDEX/_mapping?pretty=1' 

Но вы, вероятно, хотите что-то вроде этого:

curl -XGET 'http://127.0.0.1:9200/YOUR_INDEX/YOUR_TYPE/_search?pretty=1'  -d '
{
   "query" : {
      "term" : {
         "resource_files.resource_file_catagory._id" : "YOUR VALUE"
      }
   }
}
'

Примечание. Поля _id, вероятно, следует отображать как {"index": "not_analyzed"}, чтобы они не анализировались, а вместо этого сохраняли точное значение. В противном случае, если вы выполните term запрос для 'FOO BAR', документ не будет найден, потому что фактически сохраненные термины: ['foo','bar']

Примечание. Запрос has_child используется для поиска родительских документов, у которых есть дочерние документы (т. е. документы, в которых указан тип и идентификатор родительского документа), соответствующие определенным критериям поиска.

person DrTech    schedule 16.07.2012

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

Вы можете попробовать что-то вроде этого:

curl -XGET 'http://loclahost:port/INDEX/TYPE/_search?pretty=1'  -d 
'{
   "query": {
     "match": {
        "resource_files.resource_file_catagory.name": "VALUE"
      }
   }
 }'

Если resource_file_category не анализируется, значение не токенизируется и сохраняется как одно значение, что дает вам точное совпадение.

Вы также можете использовать плагин elasticsearch-head для проверки данных, а также справочник по построению запросов.

https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-plugins.html или https://mobz.github.io/elasticsearch-head/

person Parul Sharma    schedule 24.02.2016