public async Task<ActionResult> Index(string q = null, int p = 1)
        {
            ViewBag.Query = q;
            ViewBag.Title = string.Format("「{0}」の検索結果", q);

            var model = new SearchResultModel {Query = q};

            var condition = new SearchCondition(q);

            try
            {
                var skip = MaxItemsOnPage * (p - 1);
                var ids = await _searchService.SearchItemIdAsync(condition);
                var count = ids.Count();
                
                ViewBag.CurrentPage = p;
                ViewBag.HasPreviousPage = (p > 1);
                ViewBag.HasNextPage = (count > MaxItemsOnPage * p);

                var items = await _itemDbCommand.GetByIdsAsync(ids, skip, MaxItemsOnPage);
                model.Items = Mapper.Map<IEnumerable<ItemIndexModel>>(items);
            }
            catch (Exception exception)
            {
                _logger.Error(exception);
                model.HasSearchServiceError = true;
            }

            return View(model);
        }
        public async Task<string[]> SearchItemIdAsync(SearchCondition condition, CancellationToken cancellationToken)
        {
            var node = new Uri(_config.ElasticsearchNode);
            dynamic query = new ExpandoObject();
            query.fields = new string[]{};
            query.query = new
            {
                simple_query_string = new
                {
                    fields = new[] {"title", "body"},
                    query = string.Join(" ", condition.KeyWords),
                    default_operator = "and"
                }
            };
            if (!condition.IncluidePrivate)
            {
                query.filter = new
                {
                    term = new
                    {
                        isPublic = true
                    }
                };
            }

            using (var content = new StringContent(JsonConvert.SerializeObject(query)))
            using (var client = new HttpClient {BaseAddress = node})
            using (var responce = await client.PostAsync(string.Format("{0}/_search", _config.ElasticsearchIndex), content, cancellationToken).ConfigureAwait(false))
            {
                responce.EnsureSuccessStatusCode();

                var resJson = await responce.Content.ReadAsStringAsync().ConfigureAwait(false);
                var res = JObject.Parse(resJson);
                var hits = res["hits"]["hits"];
                var ids = hits.Select(x => (string)x["_id"]);

                return ids.ToArray();
            }
        }
 public Task<string[]> SearchItemIdAsync(SearchCondition condition)
 {
     return SearchItemIdAsync(condition, CancellationToken.None);
 }