2015-03-09 2 views
0

Я использую плагин Grails для работы с ElasticSearch через MySQL. У меня есть столбец домена отображается в моем классе домена следующим образом:Как использовать must_not с пустым атрибутом JSON с ElasticSearch + Grails?

String updateHistoryJSON 
(...) 
static mapping = { 
    updateHistoryJSON type: 'text', column: 'update_history' 
} 

В MySQL это в основном отображает в колонку TEXT, целью которой является для хранения контента в формате JSON.

Итак, в обоих индексах DB и ElasticSearch у меня есть 2 экземпляра: - экземпляр 1 имеет updateHistoryJSON = '{"zip": null, "street": null, "name": null, "categories": [ ], "город": нулевая}» - пример 2 имеет updateHistoryJSON = '{}'

Теперь, что мне нужно, это запрос ElasticSearch, который возвращает только экземпляр 2.

Я делал замыкание например, с использованием Groovy DSL:

{ 
    bool { 
     must_not = term(updateHistoryJSON: "{}") 
     minimum_should_match = 1 
    } 
} 

И ElasticSearch кажется, игнорирует его, он продолжает возвращать оба экземпляра.

С другой стороны, если я использую фильтр типа "missing": {"field": "updateHistoryJSON"}, он не возвращает никаких документов. То же самое касается «существует»: {«field»: «updateHistoryJSON»}.

Любое представление о том, что я делаю неправильно здесь?

ответ

0

Я все еще не уверен, в чем была проблема, но по крайней мере я нашел обходное решение.

Поскольку поиск по содержимому updateHistoryJSON не работал, я решил использовать скрипт для поиска на основе содержимого содержимого updateHistoryJSON, то есть вместо поиска документов, содержащих непустой JSON, я просто ищу документы, которые updateHistoryJSON size больше 2 ({} == размер 2).

Замыкание я, как это:

{script = { 
    script = "doc['updateHistoryJSON'].size() > 2" 
} 
Смежные вопросы