|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- package routers
-
- import (
- "code.gitea.io/gitea/modules/context"
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/setting"
- "github.com/olivere/elastic/v7"
- )
-
- type Table struct {
- TableName string
- SpecifyField string
- SortBy string
- Where string
- }
-
- type SearchOptions struct {
- Page int64
- PageSize int64
- Key string
- SearchObj []Table
- }
-
- var client *elastic.Client
-
- func InitESClient() {
- ESSearchUrl := setting.ESSearchURL
- var err error
- client, err = elastic.NewClient(elastic.SetSniff(false), elastic.SetURL(ESSearchUrl))
- if err != nil {
- panic(err)
- }
- }
-
- func Search(ctx *context.Context) {
- TableName := ctx.Query("TableName")
- Key := ctx.Query("Key")
- Page := ctx.QueryInt("Page")
- PageSize := ctx.QueryInt("PageSize")
- if Page <= 0 {
- Page = 1
- }
- if PageSize <= 0 {
- PageSize = setting.UI.IssuePagingNum
- }
- if TableName == "repository" {
- searchRepo(ctx, "repository-es-index", Key, Page, PageSize)
- return
- } else if TableName == "issue" {
- searchIssue(ctx, "issue-es-index", Key, Page, PageSize)
- return
- } else if TableName == "user" {
- searchUserOrOrg(ctx, "user-es-index", Key, Page, PageSize, true)
- return
- } else if TableName == "org" {
- searchUserOrOrg(ctx, "user-es-index", Key, Page, PageSize, false)
- return
- } else if TableName == "dataset" {
- searchDataSet(ctx, "dataset-es-index", Key, Page, PageSize)
- return
- } else if TableName == "pr" {
- searchPR(ctx, "issue-es-index", Key, Page, PageSize)
- return
- }
-
- // if Key != "" {
- // boolQ := elastic.NewBoolQuery()
- // nameQuery := elastic.NewMatchQuery("name", Key).Boost(2)
- // descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1)
- // //owner_idQuery := elastic.NewTermQuery("owner_id", 3)
- // boolQ.Should(nameQuery, descriptionQuery)
- // //boolQ.Must(owner_idQuery)
- // res, err := client.Search(TableName + "-es-index").Query(boolQ).Do(ctx.Req.Context())
- // if err == nil {
- // ctx.JSON(200, res)
- // } else {
- // log.Info("query es error," + err.Error())
- // }
- // } else {
- // log.Info("query all content.")
- // //搜索的属性要指定{"timestamp":{"unmapped_type":"date"}}
- // res, err := client.Search(TableName + "-es-index").Do(ctx.Req.Context())
- // if err == nil {
- // ctx.JSON(200, res)
- // } else {
- // log.Info("query es error," + err.Error())
- // }
- // }
- }
-
- func searchRepoByLabel(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
-
- /*
- 项目, ES名称: repository-es-index
- 搜索:
- name character varying(255) , 项目名称
- description text, 项目描述
- topics json, 标签
- 排序:
- updated_unix
- num_watches,
- num_stars,
- num_forks,
- */
-
- SortBy := ctx.Query("SortBy")
- if SortBy == "" {
- SortBy = "updated_unix.keyword"
- }
- ascending := ctx.QueryBool("Ascending")
- if Key != "" {
- boolQ := elastic.NewBoolQuery()
- topicsQuery := elastic.NewMatchQuery("topics", Key).Boost(1)
- boolQ.Should(topicsQuery)
- res, err := client.Search(TableName).Query(boolQ).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
- if err == nil {
- ctx.JSON(200, res)
- return
- } else {
- log.Info("query es error," + err.Error())
- }
- }
- ctx.JSON(200, "")
- }
-
- func searchRepo(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
- /*
- 项目, ES名称: repository-es-index
- 搜索:
- name character varying(255) , 项目名称
- description text, 项目描述
- topics json, 标签
- 排序:
- updated_unix
- num_watches,
- num_stars,
- num_forks,
- */
-
- SortBy := ctx.Query("SortBy")
- if SortBy == "" {
- SortBy = "updated_unix.keyword"
- }
- ascending := ctx.QueryBool("Ascending")
-
- if Key != "" {
- boolQ := elastic.NewBoolQuery()
- nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
- descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1.5).QueryName("desc_second")
- topicsQuery := elastic.NewMatchQuery("topics", Key).Boost(1).QueryName("topics_third")
- boolQ.Should(nameQuery, descriptionQuery, topicsQuery)
- res, err := client.Search(TableName).Query(boolQ).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
- if err == nil {
- ctx.JSON(200, res)
- } else {
- log.Info("query es error," + err.Error())
- ctx.JSON(200, "")
- }
- } else {
- log.Info("query all content.")
- //搜索的属性要指定{"timestamp":{"unmapped_type":"date"}}
- res, err := client.Search(TableName).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
- if err == nil {
- ctx.JSON(200, res)
- } else {
- log.Info("query es error," + err.Error())
- ctx.JSON(200, "")
- }
- }
- }
-
- func searchUserOrOrg(ctx *context.Context, TableName string, Key string, Page int, PageSize int, IsQueryUser bool) {
- /*
- 用户或者组织 ES名称: user-es-index
- 搜索:
- name , 名称
- full_name 全名
- description 描述或者简介
- 排序:
- created_unix
- 名称字母序
- */
- SortBy := ctx.Query("SortBy")
- if SortBy == "" {
- SortBy = "updated_unix.keyword"
- }
- ascending := ctx.QueryBool("Ascending")
- boolQ := elastic.NewBoolQuery()
- if Key != "" {
- nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
- full_nameQuery := elastic.NewMatchQuery("full_name", Key).Boost(1.5).QueryName("fullname_second")
- descriptionQuery := elastic.NewMatchQuery("description", Key).Boost(1).QueryName("desc_third")
- boolQ.Should(nameQuery, full_nameQuery, descriptionQuery)
- }
- typeValue := 1
- if IsQueryUser {
- typeValue = 0
- }
- UserOrOrgQuery := elastic.NewTermQuery("type", typeValue)
- boolQ.Must(UserOrOrgQuery)
-
- res, err := client.Search(TableName).Query(boolQ).Sort(SortBy, ascending).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
- if err == nil {
- ctx.JSON(200, res)
- } else {
- log.Info("query es error," + err.Error())
- ctx.JSON(200, "")
- }
- }
-
- func searchDataSet(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
- /*
- 数据集,ES名称:dataset-es-index
- 搜索:
- title , 名称
- description 描述
- category 标签
- file_name 数据集文件名称
- 排序:
- download_times
-
- */
- }
-
- func searchIssue(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
-
- /*
- 任务,合并请求 ES名称:issue-es-index
- 搜索:
- name character varying(255) , 标题
- content text, 内容
- comment text, 评论
- 排序:
- updated_unix
- */
-
- boolQ := elastic.NewBoolQuery()
- if Key != "" {
- nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
- contentQuery := elastic.NewMatchQuery("content", Key).Boost(1.5).QueryName("content_second")
- commentQuery := elastic.NewMatchQuery("comment", Key).Boost(1).QueryName("comment_third")
- boolQ.Should(nameQuery, contentQuery, commentQuery)
- }
- isIssueQuery := elastic.NewTermQuery("is_pull", false)
- boolQ.Must(isIssueQuery)
- res, err := client.Search(TableName).Query(boolQ).Sort("updated_unix.keyword", false).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
- if err == nil {
- ctx.JSON(200, res)
- } else {
- log.Info("query es error," + err.Error())
- }
-
- }
-
- func searchPR(ctx *context.Context, TableName string, Key string, Page int, PageSize int) {
-
- /*
- 任务,合并请求 ES名称:issue-es-index
- 搜索:
- name character varying(255) , 标题
- content text, 内容
- comment text, 评论
- 排序:
- updated_unix
- */
-
- boolQ := elastic.NewBoolQuery()
- if Key != "" {
- nameQuery := elastic.NewMatchQuery("name", Key).Boost(2).QueryName("name_first")
- contentQuery := elastic.NewMatchQuery("content", Key).Boost(1.5).QueryName("content_second")
- commentQuery := elastic.NewMatchQuery("comment", Key).Boost(1).QueryName("comment_third")
- boolQ.Should(nameQuery, contentQuery, commentQuery)
- }
- isIssueQuery := elastic.NewTermQuery("is_pull", true)
- boolQ.Must(isIssueQuery)
- res, err := client.Search(TableName).Query(boolQ).Sort("updated_unix.keyword", false).From((Page - 1) * PageSize).Size(PageSize).Do(ctx.Req.Context())
- if err == nil {
- ctx.JSON(200, res)
- } else {
- log.Info("query es error," + err.Error())
- }
-
- }
|