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); }