You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

search.go 8.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. package routers
  2. import (
  3. "code.gitea.io/gitea/modules/context"
  4. "code.gitea.io/gitea/modules/log"
  5. "code.gitea.io/gitea/modules/setting"
  6. "github.com/olivere/elastic/v7"
  7. )
  8. type Table struct {
  9. TableName string
  10. SpecifyField string
  11. SortBy string
  12. Where string
  13. }
  14. type SearchOptions struct {
  15. Page int64
  16. PageSize int64
  17. Key string
  18. SearchObj []Table
  19. }
  20. var client *elastic.Client
  21. func InitESClient() {
  22. ESSearchUrl := setting.ESSearchURL
  23. var err error
  24. client, err = elastic.NewClient(elastic.SetSniff(false), elastic.SetURL(ESSearchUrl))
  25. if err != nil {
  26. panic(err)
  27. }
  28. }
  29. func Search(ctx *context.Context) {
  30. TableName := ctx.Query("TableName")
  31. Key := ctx.Query("Key")
  32. Page := ctx.QueryInt("Page")
  33. PageSize := ctx.QueryInt("PageSize")
  34. if Page <= 0 {
  35. Page = 1
  36. }
  37. if PageSize <= 0 {
  38. PageSize = setting.UI.IssuePagingNum
  39. }
  40. if TableName == "repository" {
  41. searchRepo(ctx, "repository-es-index", Key, Page, PageSize)
  42. return
  43. } else if TableName == "issue" {
  44. searchIssue(ctx, "issue-es-index", Key, Page, PageSize)
  45. return
  46. } else if TableName == "user" {
  47. searchUserOrOrg(ctx, "user-es-index", Key, Page, PageSize, true)
  48. return
  49. } else if TableName == "org" {
  50. searchUserOrOrg(ctx, "user-es-index", Key, Page, PageSize, false)
  51. return
  52. } else if TableName == "dataset" {
  53. searchDataSet(ctx, "dataset-es-index", Key, Page, PageSize)
  54. return
  55. } else if TableName == "pr" {
  56. searchPR(ctx, "issue-es-index", Key, Page, PageSize)
  57. return
  58. }
  59. // if Key != "" {
  60. // boolQ := elastic.NewBoolQuery()
  61. // nameQuery := elastic.NewMatchQuery("name", Key).Boost(2)
  62. // descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1)
  63. // //owner_idQuery := elastic.NewTermQuery("owner_id", 3)
  64. // boolQ.Should(nameQuery, descriptionQuery)
  65. // //boolQ.Must(owner_idQuery)
  66. // res, err := client.Search(TableName + "-es-index").Query(boolQ).Do(ctx.Req.Context())
  67. // if err == nil {
  68. // ctx.JSON(200, res)
  69. // } else {
  70. // log.Info("query es error," + err.Error())
  71. // }
  72. // } else {
  73. // log.Info("query all content.")
  74. // //搜索的属性要指定{"timestamp":{"unmapped_type":"date"}}
  75. // res, err := client.Search(TableName + "-es-index").Do(ctx.Req.Context())
  76. // if err == nil {
  77. // ctx.JSON(200, res)
  78. // } else {
  79. // log.Info("query es error," + err.Error())
  80. // }
  81. // }
  82. }
  83. func searchRepoByLabel(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
  84. /*
  85. 项目, ES名称: repository-es-index
  86. 搜索:
  87. name character varying(255) , 项目名称
  88. description text, 项目描述
  89. topics json, 标签
  90. 排序:
  91. updated_unix
  92. num_watches,
  93. num_stars,
  94. num_forks,
  95. */
  96. SortBy := ctx.Query("SortBy")
  97. if SortBy == "" {
  98. SortBy = "updated_unix.keyword"
  99. }
  100. ascending := ctx.QueryBool("Ascending")
  101. if Key != "" {
  102. boolQ := elastic.NewBoolQuery()
  103. topicsQuery := elastic.NewMatchQuery("topics", Key).Boost(1)
  104. boolQ.Should(topicsQuery)
  105. res, err := client.Search(TableName).Query(boolQ).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
  106. if err == nil {
  107. ctx.JSON(200, res)
  108. return
  109. } else {
  110. log.Info("query es error," + err.Error())
  111. }
  112. }
  113. ctx.JSON(200, "")
  114. }
  115. func searchRepo(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
  116. /*
  117. 项目, ES名称: repository-es-index
  118. 搜索:
  119. name character varying(255) , 项目名称
  120. description text, 项目描述
  121. topics json, 标签
  122. 排序:
  123. updated_unix
  124. num_watches,
  125. num_stars,
  126. num_forks,
  127. */
  128. SortBy := ctx.Query("SortBy")
  129. if SortBy == "" {
  130. SortBy = "updated_unix.keyword"
  131. }
  132. ascending := ctx.QueryBool("Ascending")
  133. if Key != "" {
  134. boolQ := elastic.NewBoolQuery()
  135. nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
  136. descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1.5).QueryName("desc_second")
  137. topicsQuery := elastic.NewMatchQuery("topics", Key).Boost(1).QueryName("topics_third")
  138. boolQ.Should(nameQuery, descriptionQuery, topicsQuery)
  139. res, err := client.Search(TableName).Query(boolQ).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
  140. if err == nil {
  141. ctx.JSON(200, res)
  142. } else {
  143. log.Info("query es error," + err.Error())
  144. ctx.JSON(200, "")
  145. }
  146. } else {
  147. log.Info("query all content.")
  148. //搜索的属性要指定{"timestamp":{"unmapped_type":"date"}}
  149. res, err := client.Search(TableName).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
  150. if err == nil {
  151. ctx.JSON(200, res)
  152. } else {
  153. log.Info("query es error," + err.Error())
  154. ctx.JSON(200, "")
  155. }
  156. }
  157. }
  158. func searchUserOrOrg(ctx *context.Context, TableName string, Key string, Page int, PageSize int, IsQueryUser bool) {
  159. /*
  160. 用户或者组织 ES名称: user-es-index
  161. 搜索:
  162. name , 名称
  163. full_name 全名
  164. description 描述或者简介
  165. 排序:
  166. created_unix
  167. 名称字母序
  168. */
  169. SortBy := ctx.Query("SortBy")
  170. if SortBy == "" {
  171. SortBy = "updated_unix.keyword"
  172. }
  173. ascending := ctx.QueryBool("Ascending")
  174. boolQ := elastic.NewBoolQuery()
  175. if Key != "" {
  176. nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
  177. full_nameQuery := elastic.NewMatchQuery("full_name", Key).Boost(1.5).QueryName("fullname_second")
  178. descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1).QueryName("desc_third")
  179. boolQ.Should(nameQuery, full_nameQuery, descriptionQuery)
  180. }
  181. typeValue := 1
  182. if IsQueryUser {
  183. typeValue = 0
  184. }
  185. UserOrOrgQuery := elastic.NewTermQuery("type", typeValue)
  186. boolQ.Must(UserOrOrgQuery)
  187. res, err := client.Search(TableName).Query(boolQ).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
  188. if err == nil {
  189. ctx.JSON(200, res)
  190. } else {
  191. log.Info("query es error," + err.Error())
  192. ctx.JSON(200, "")
  193. }
  194. }
  195. func searchDataSet(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
  196. /*
  197. 数据集,ES名称:dataset-es-index
  198. 搜索:
  199. title , 名称
  200. description 描述
  201. category 标签
  202. file_name 数据集文件名称
  203. 排序:
  204. download_times
  205. */
  206. }
  207. func searchIssue(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
  208. /*
  209. 任务,合并请求 ES名称:issue-es-index
  210. 搜索:
  211. name character varying(255) , 标题
  212. content text, 内容
  213. comment text, 评论
  214. 排序:
  215. updated_unix
  216. */
  217. boolQ := elastic.NewBoolQuery()
  218. if Key != "" {
  219. nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
  220. contentQuery := elastic.NewMatchQuery("content", Key).Boost(1.5).QueryName("content_second")
  221. commentQuery := elastic.NewMatchQuery("comment", Key).Boost(1).QueryName("comment_third")
  222. boolQ.Should(nameQuery, contentQuery, commentQuery)
  223. }
  224. isIssueQuery := elastic.NewTermQuery("is_pull", false)
  225. boolQ.Must(isIssueQuery)
  226. res, err := client.Search(TableName).Query(boolQ).Sort("updated_unix.keyword", false).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
  227. if err == nil {
  228. ctx.JSON(200, res)
  229. } else {
  230. log.Info("query es error," + err.Error())
  231. }
  232. }
  233. func searchPR(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
  234. /*
  235. 任务,合并请求 ES名称:issue-es-index
  236. 搜索:
  237. name character varying(255) , 标题
  238. content text, 内容
  239. comment text, 评论
  240. 排序:
  241. updated_unix
  242. */
  243. boolQ := elastic.NewBoolQuery()
  244. if Key != "" {
  245. nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
  246. contentQuery := elastic.NewMatchQuery("content", Key).Boost(1.5).QueryName("content_second")
  247. commentQuery := elastic.NewMatchQuery("comment", Key).Boost(1).QueryName("comment_third")
  248. boolQ.Should(nameQuery, contentQuery, commentQuery)
  249. }
  250. isIssueQuery := elastic.NewTermQuery("is_pull", true)
  251. boolQ.Must(isIssueQuery)
  252. res, err := client.Search(TableName).Query(boolQ).Sort("updated_unix.keyword", false).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
  253. if err == nil {
  254. ctx.JSON(200, res)
  255. } else {
  256. log.Info("query es error," + err.Error())
  257. }
  258. }