ElasticsearchHelper.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Elasticsearch.Net;
  6. using GxPress.Common.Page;
  7. using Nest;
  8. namespace GxPress.Common.Tools
  9. {
  10. public class ElasticSearchHelper
  11. {
  12. private static ElasticSearchHelper _elasticSearchHelper;
  13. // 默认索引
  14. public static string DefaultIndex = "tededata";
  15. private ElasticClient Client()
  16. {
  17. var nodes = new Uri[]
  18. {
  19. new Uri("http://127.0.0.1:9200")
  20. };
  21. var pool = new StaticConnectionPool(nodes);
  22. var settings = new ConnectionSettings(pool)
  23. .DefaultIndex(DefaultIndex)
  24. .PrettyJson();
  25. return new ElasticClient(settings);
  26. }
  27. public static ElasticClient GetInstance()
  28. {
  29. if (_elasticSearchHelper == null)
  30. {
  31. _elasticSearchHelper = new ElasticSearchHelper();
  32. }
  33. return _elasticSearchHelper.Client();
  34. }
  35. /// <summary>
  36. /// 根据关键字查询
  37. /// </summary>
  38. /// <param name="key"></param>
  39. /// <param name="userId"></param>
  40. /// <param name="typeId">文件夹类型 1 通知 2话题 3 收藏 4笔记 5 普通站内信 6匿名站内信 7小组 10聊天 100 通讯录 0全部</param>
  41. /// <returns></returns>
  42. public async Task<PagedList<TedeData>> SearchAsync(string key, int typeId, int userId, int page, int perPage)
  43. {
  44. var result = new PagedList<TedeData>();
  45. var client = GetInstance();
  46. var query = new Nest.SearchDescriptor<TedeData>();
  47. var listTedeData = new List<TedeData>();
  48. var total = 0;
  49. var queryResult = query;
  50. //全部
  51. if (typeId == 0)
  52. {
  53. query.Query(q =>
  54. q.Bool(b =>
  55. b.Must(m =>
  56. m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content).Field(obj => obj.Name)).Query(key))
  57. )
  58. )).PostFilter(n => n.Term(n => n.Field(f => f.UserId).Value(userId)));
  59. }
  60. else
  61. {
  62. //通讯录
  63. if (typeId == 100)
  64. {
  65. query.Query(q =>
  66. q.Bool(b =>
  67. b.Must(m =>
  68. m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content).Field(obj => obj.Name)).Query(key))
  69. )
  70. )).PostFilter(n => n.Term(n => n.Field(f => f.SearchType).Value(typeId)));
  71. }
  72. else
  73. {
  74. query.Query(q =>
  75. q.Bool(b =>
  76. b.Must(m =>
  77. m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content).Field(obj => obj.Name)).Query(key))
  78. )
  79. )).PostFilter(n => n.Term(z => z.Field(f => f.UserId).Value(userId)) && n.Term(k => k.Field(m => m.SearchType).Value(typeId)));
  80. }
  81. }
  82. //排序
  83. Func<SortDescriptor<TedeData>, IPromise<IList<ISort>>> sortDesc = sd =>
  84. {
  85. //根据分值排序
  86. sd.Descending(n => n.CreatedDate);
  87. return sd;
  88. };
  89. var resultData = client.Search<TedeData>(x => queryResult.From((page - 1) * perPage).Size(perPage).Sort(sortDesc));
  90. var list = resultData.Documents.ToList();
  91. total += Convert.ToInt32(resultData.Total);
  92. listTedeData.AddRange(list);
  93. foreach (var item in listTedeData)
  94. {
  95. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  96. }
  97. result.Items = listTedeData;
  98. result.Total = total;
  99. return result;
  100. }
  101. /// <summary>
  102. /// 根据ID查询
  103. /// </summary>
  104. /// <param name="id"></param>
  105. /// <returns></returns>
  106. public async Task<TedeData> Get(string id)
  107. {
  108. var client = GetInstance();
  109. var response = await client.GetAsync<TedeData>(id, idx => idx.Index(DefaultIndex));
  110. return response.Source;
  111. }
  112. /// <summary>
  113. /// 按 id 删除单条数据
  114. /// </summary>
  115. /// <param name="id"></param>
  116. /// <returns></returns>
  117. public async Task<Result> Delete(string id)
  118. {
  119. var client = GetInstance();
  120. var response = await client.DeleteAsync<TedeData>(id, idx => idx.Index(DefaultIndex));
  121. return response.Result;
  122. }
  123. /// <summary>
  124. /// 插入数据
  125. /// </summary>
  126. /// <returns></returns>
  127. public async Task<bool> InsetData(TedeData data)
  128. {
  129. var client = GetInstance();
  130. //成功
  131. var result = await client.IndexAsync(data, idx => idx.Index(DefaultIndex));
  132. if (result.ApiCall.Success)
  133. return true;
  134. return false;
  135. }
  136. }
  137. [ElasticsearchType(RelationName = "TedeData", IdProperty = "GuId")]
  138. public class TedeData
  139. {
  140. /// <summary>
  141. /// 存放guid
  142. /// </summary>
  143. [Keyword]
  144. public string GuId { get; set; }
  145. /// <summary>
  146. /// 存放guid
  147. /// </summary>
  148. [Keyword]
  149. public string Id { get; set; }
  150. /// <summary>
  151. /// 姓名 群名称 聊天对应用户名称
  152. /// </summary>
  153. [Keyword]
  154. public string Name { get; set; }
  155. /// <summary>
  156. /// 头像地址
  157. /// </summary>
  158. [Text]
  159. public string AvatarUrl { get; set; }
  160. /// <summary>
  161. /// 文件夹类型 1 通知 2话题 5 站内信 7小组 10 聊天 100通讯录
  162. /// </summary>
  163. [Text]
  164. public int SearchType { get; set; }
  165. /// <summary>
  166. /// 环信ID
  167. /// </summary>
  168. [Text]
  169. public string ImId { get; set; }
  170. /// <summary>
  171. /// 群聊用到对应哪个用户
  172. /// </summary>
  173. [Text]
  174. public int ToUserId { get; set; }
  175. /// <summary>
  176. /// 用户ID
  177. /// </summary>
  178. [Text]
  179. public int UserId { get; set; }
  180. /// <summary>
  181. /// 标题
  182. /// </summary>
  183. [Keyword]
  184. public string Title { get; set; }
  185. /// <summary>
  186. /// 内容
  187. /// </summary>
  188. [Text]
  189. public string Content { get; set; }
  190. /// <summary>
  191. /// 日期
  192. /// </summary>
  193. [Text]
  194. public DateTime? CreatedDate { get; set; }
  195. /// <summary>
  196. /// 1 单聊 2 群聊
  197. /// </summary>
  198. [Text]
  199. public int ChatType { get; set; }
  200. }
  201. }