Фильтрация по пустой строке с помощью ElasticSearch/Nest

Это может быть глупый вопрос, но как мне отфильтровать пустую строку в ElasticSearch с помощью Nest. В частности, как воссоздать следующий результат:

curl http://localhost:9200/test/event/_search
{
    "filter" : { "term" : { "target" : "" }}
}

Я пробовал:

(f => f
    .Term("target", "")
);

который согласно фильтрация ElasticSearch и Nest не работает, рассматривается как безусловный запрос и возвращает все, а добавление .Strict() вызывает DslException:

(f => f
    .Strict().Term("target", "")
);

Я также пробовал .Missing() и .Exists() безрезультатно.

Соответствующий раздел моего _mapping для справки:

{
    "event": {
        "dynamic": "false",
        "properties": {
            target": {
                "type": "string",
                "index": "not_analyzed",
                "store": true,
                "omit_norms": true,
                "index_options": "docs"
            }
        }
    }
}

Любые указатели будут очень признательны.


person user1664295    schedule 04.12.2013    source источник
comment
Не знаю, почему src всегда выдает DslException, если Strict = true, но вы можете отправить запрос "filter" : { "term" : { "target" : "" }} напрямую, используя QueryRaw/FilterRaw   -  person Duc.Duong    schedule 04.12.2013
comment
Спасибо, я пытаюсь избежать этого, так как с моей стороны потребуется значительный рефакторинг. Я надеялся, что мне не хватает какой-то магии.   -  person user1664295    schedule 05.12.2013
comment
Я думаю, вы можете опубликовать сообщение об ошибке в NEST, чтобы получить помощь. Может быть, автор может предложить какие-то лучшие альтернативы.   -  person Duc.Duong    schedule 06.12.2013
comment
Это не вариант использования, который я себе представлял, но он действительно действителен. Я работаю над добавлением .Verbatim() в качестве ответной части к .Strict(), которая не будет выдавать или удалять запрос, если он безусловный, но оставит его как определено. Я опубликую ответ, когда он появится на github.   -  person Martijn Laarman    schedule 06.12.2013


Ответы (2)


Как упоминается в документации по NEST и написанию запросов, вы можете переключать режим Strict() для запуска исключений, если часть вашего запроса превращается быть conditionless, но если это то, чего вы действительно хотели, то вы застряли, как вы узнали.

Я только что зафиксировал конструкцию .Verbatim(), которая работает точно так же, как .Strict(), но вместо того, чтобы генерировать исключение, она примет запрос как есть и отобразит его, как указано.

(f => f
    .Verbatim()
    .Term("target", "")
);

Таким образом, следует отключить перезапись запроса conditionless и вставить запрос буквально, как указано.

Это произойдет в следующей версии NEST (после текущей версии 0.12.0.0).

person Martijn Laarman    schedule 11.12.2013

Я просто отмечу, что вы должны использовать Verbatim() в каждом запросе, а не только один раз в начале.

var searchResults = this.Client.Search<Project>(s => s
    .Query(q => q
        //.Verbatim() // no, here won't work
        .Bool(b => b
            .Should(
                bs => bs.Match(p => p.Query("hello").Field("name").Verbatim()),
                bs => bs.Match(p => p.Query("world").Field("name").Verbatim())
            )
        )
    )
);
person andrew.fox    schedule 16.11.2016