Запрос вложенных полей с помощью elasticsearch в Grails

Я новичок в elasticseach, и у меня возникли проблемы с добавлением фильтров к моим запросам.

Мои доменные классы такие:

Class A {
    String name
    A_Status status

    static searchable =  {
        status component: true
    }
}

Class AImpl extends A {

}

Class A_Status {
    String name
    static searchable = { 
        root : false
        only = 'name'
    }
}

На моем контроллере я делаю запрос:

def res = elasticSearchService.search()
{
    bool {
        must {
            term("status.name": "ACTIVE")
        }
    }
 }

Я попытался изменить поле searchable на AImpl или поставить "searchable = true", но получил те же результаты, запрос всегда пуст и должен получить 4 результата.

Еще одна странная вещь, которую я обнаружил, заключается в том, что поиск по uri дает ожидаемый результат, а запрос тела — нет.

curl -XGET 'http://localhost:9200/com.sisconline.entities/_search?q=status.name=ACTIVE'

Это 4 удара.

curl -XPOST 'http://localhost:9200/com.sisconline.entities/_search' -d '{
"query" : {
      "term":{ "status.name":"ACTIVE"}
      }
}'

Это получает 0 хитов.

Я использую Grails 2.3.4 и elasticsearch plugin 0.0.3.5.

С уважением.


person santi2332    schedule 01.11.2014    source источник


Ответы (1)


Наконец-то мне удалось решить проблему, выполнив:

must { 
  nested { 
     path = "status" 
     query { 
         bool { 
            must { 
               term("status.name": "active") } 
            } 
         } 
     } 
} 

Надеюсь, это поможет другим.

person santi2332    schedule 02.11.2014
comment
Вы пытались искать, используя ваши домены? У меня есть аналогичные сопоставления (даже практически такие же) и столкнулся с проблемой, что когда я пытаюсь выполнить поиск по AImpl, f.e AImpl.search("${query}") возникает исключение в tomcat ERROR unmarshall.DomainClassUnmarshaller - Error unmarshalling Class AImpl with id ... Message: Property AImpl.status is not mapped as [component], but broken search hit found. Также, если я пытаюсь выполнить поиск по суперклассу, например A.search("${query}"), я не получаю результаты, кажется, что ничего не было проиндексировано для A. - person July Antonicheva; 07.11.2014
comment
@JulyAntonicheva Из того, что я видел до сих пор, фреймворк индексирует дочерние классы, а не родительские, поэтому, если вы попытаетесь выполнить поиск по родительскому классу, вы не получите никаких результатов. На самом деле мне пришлось написать доступное для поиска замыкание во всех моих дочерних классах, возможно, есть параметр конфигурации, которого я не видел. Я не запрашивал, используя свой домен, потому что хотел получить все возможные результаты. - person santi2332; 09.11.2014
comment
@JulyAntonicheva Что касается ошибки, которую вы получаете, возможно, вы не указали свой атрибут в качестве компонента, в моем примере это был компонент состояния: true, или вы изменили свои сопоставления и не очистили свой индекс, чтобы перестроить его. - person santi2332; 09.11.2014