Упругие поисковые запросы без гнезда - PullRequest
0 голосов
/ 15 мая 2018

Я устал пытаться выяснить, как запрашивать мои данные так, как я хотел, используя Nest - кажется, всегда выводится неправильный URL для отправки запроса на поиск?

В любом случае - я собрал вместеэтот уродливый код, который, кажется, работает:

using (var client = new HttpClient())
            {
                client.BaseAddress = node;
                var content = new StringContent("{\"size\": 0,\"query\": {\"bool\": {\"must\": [{\"wildcard\": {\"FlogDetail.AdditionalInfo.QueryString-filter[slug]\": \"*" + slug +  "*\"}},{\"range\": {\"@timestamp\": {\"gte\": \"now-1d/d\",\"lt\": \"now\"}}}]}},\"aggs\": {\"results\": {\"date_histogram\": {\"field\": \"@timestamp\",\"interval\": \"hour\"}}}}", Encoding.UTF8, "application/json");
                var result = await client.PostAsync(@"usage*/_search", content);
                string resultContent = await result.Content.ReadAsStringAsync();

                JObject o = JObject.Parse(resultContent);

                return o;
            }

Теперь, прежде чем я сделаю его более разумным и красивым, есть ли какие-либо проблемы с запросом ES как этот?

Моя проблема, связанная с использованием Nest, заключалась в том, что я не смог найти способ запроса индекса с подстановочными знаками, который, как вы видите, я могу сделать с простым старым C #

Если кто-то знает ответ наэтот последний кусочек я буду благодарен!

1 Ответ

0 голосов
/ 16 мая 2018

Нет ничего плохого в том, чтобы запрашивать Elasticsearch так, как вы предлагаете.NEST поддерживает запросы к групповым символам, отдельным индексам, нескольким индексам, например,

var searchResponse = client.Search<MyDocument>(s => s
    .Index("usage*")
    .AllTypes()
    .Query(q => q
        .MatchAll()
    )
);

отправляет следующий запрос

POST http://localhost:9200/usage*/_search
{
  "query": {
    "match_all": {}
  }
}

Соглашение NEST - сопоставить POCO с типом в индексе, и выможет установить соглашение для данного POCO с помощью DefaultMappingFor<T>(...) на ConnectionSettings

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

var settings = new ConnectionSettings(pool)
    .DefaultMappingFor<MyDocument>(m => m
        .IndexName("usage*")
    );

var client = new ElasticClient(settings);

var searchResponse = client.Search<MyDocument>(s => s
    .AllTypes()
    .Query(q => q
        .MatchAll()
    )
);

Однако не существует соглашения для указания, что имя типа должно быть опущено для данного POCO, поэтому вызов .AllTypes() все еще требуется в поисковом запросе для поиска по всем типам в индексах, соответствующих usage*.

...