Skip to content

Commit 92c160d

Browse files
Add meilisearch support (#23136)
Add meilisearch support Fixes #20665
1 parent 265675a commit 92c160d

File tree

8 files changed

+261
-8
lines changed

8 files changed

+261
-8
lines changed

assets/go-licenses.json

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

custom/conf/app.example.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -1357,13 +1357,13 @@ ROUTER = console
13571357
;; Issue Indexer settings
13581358
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13591359
;;
1360-
;; Issue indexer type, currently support: bleve, db or elasticsearch, default is bleve
1360+
;; Issue indexer type, currently support: bleve, db, elasticsearch or meilisearch default is bleve
13611361
;ISSUE_INDEXER_TYPE = bleve
13621362
;;
13631363
;; Issue indexer storage path, available when ISSUE_INDEXER_TYPE is bleve
13641364
;ISSUE_INDEXER_PATH = indexers/issues.bleve ; Relative paths will be made absolute against _`AppWorkPath`_.
13651365
;;
1366-
;; Issue indexer connection string, available when ISSUE_INDEXER_TYPE is elasticsearch
1366+
;; Issue indexer connection string, available when ISSUE_INDEXER_TYPE is elasticsearch or meilisearch
13671367
;ISSUE_INDEXER_CONN_STR = http://elastic:changeme@localhost:9200
13681368
;;
13691369
;; Issue indexer name, available when ISSUE_INDEXER_TYPE is elasticsearch

docs/content/doc/administration/config-cheat-sheet.en-us.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,8 @@ relation to port exhaustion.
456456

457457
## Indexer (`indexer`)
458458

459-
- `ISSUE_INDEXER_TYPE`: **bleve**: Issue indexer type, currently supported: `bleve`, `db` or `elasticsearch`.
460-
- `ISSUE_INDEXER_CONN_STR`: ****: Issue indexer connection string, available when ISSUE_INDEXER_TYPE is elasticsearch. i.e. http://elastic:changeme@localhost:9200
459+
- `ISSUE_INDEXER_TYPE`: **bleve**: Issue indexer type, currently supported: `bleve`, `db`, `elasticsearch` or `meilisearch`.
460+
- `ISSUE_INDEXER_CONN_STR`: ****: Issue indexer connection string, available when ISSUE_INDEXER_TYPE is elasticsearch, or meilisearch. i.e. http://elastic:changeme@localhost:9200
461461
- `ISSUE_INDEXER_NAME`: **gitea_issues**: Issue indexer name, available when ISSUE_INDEXER_TYPE is elasticsearch
462462
- `ISSUE_INDEXER_PATH`: **indexers/issues.bleve**: Index file used for issue search; available when ISSUE_INDEXER_TYPE is bleve and elasticsearch. Relative paths will be made absolute against _`AppWorkPath`_.
463463
- The next 4 configuration values are deprecated and should be set in `queue.issue_indexer` however are kept for backwards compatibility:

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ require (
7373
github.com/markbates/goth v1.76.0
7474
github.com/mattn/go-isatty v0.0.17
7575
github.com/mattn/go-sqlite3 v1.14.16
76+
github.com/meilisearch/meilisearch-go v0.23.0
7677
github.com/mholt/archiver/v3 v3.5.1
7778
github.com/microcosm-cc/bluemonday v1.0.22
7879
github.com/minio/minio-go/v7 v7.0.49
@@ -218,7 +219,7 @@ require (
218219
github.com/mattn/go-colorable v0.1.13 // indirect
219220
github.com/mattn/go-runewidth v0.0.14 // indirect
220221
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
221-
github.com/mholt/acmez v1.1.0 // indirect
222+
github.com/mholt/acmez v1.0.4 // indirect
222223
github.com/miekg/dns v1.1.50 // indirect
223224
github.com/minio/md5-simd v1.1.2 // indirect
224225
github.com/mitchellh/copystructure v1.2.0 // indirect
@@ -259,6 +260,8 @@ require (
259260
github.com/toqueteos/webbrowser v1.2.0 // indirect
260261
github.com/ulikunitz/xz v0.5.11 // indirect
261262
github.com/unknwon/com v1.0.1 // indirect
263+
github.com/valyala/bytebufferpool v1.0.0 // indirect
264+
github.com/valyala/fasthttp v1.44.0 // indirect
262265
github.com/valyala/fastjson v1.6.4 // indirect
263266
github.com/x448/float16 v0.8.4 // indirect
264267
github.com/xanzy/ssh-agent v0.3.3 // indirect

go.sum

+24-2
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
127127
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
128128
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
129129
github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
130+
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
130131
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
131132
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
132133
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
@@ -151,6 +152,7 @@ github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZw
151152
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
152153
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
153154
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
155+
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
154156
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
155157
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
156158
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -496,6 +498,7 @@ github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14/go.mod h1:jPoNZLWDAqA5N3
496498
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JPCjlxoJd6K8ALZqSDDhk2ymieAZOVaDg0=
497499
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU=
498500
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
501+
github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
499502
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
500503
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
501504
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
@@ -771,6 +774,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
771774
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
772775
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
773776
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
777+
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
778+
github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
779+
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
774780
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
775781
github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
776782
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
@@ -862,8 +868,10 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwp
862868
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
863869
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
864870
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
865-
github.com/mholt/acmez v1.1.0 h1:IQ9CGHKOHokorxnffsqDvmmE30mDenO1lptYZ1AYkHY=
866-
github.com/mholt/acmez v1.1.0/go.mod h1:zwo5+fbLLTowAX8o8ETfQzbDtwGEXnPhkmGdKIP+bgs=
871+
github.com/meilisearch/meilisearch-go v0.23.0 h1:CuqB+/NyEJKXF2SovTetAZW7lX+nSH+QTqbgSH6bv+Q=
872+
github.com/meilisearch/meilisearch-go v0.23.0/go.mod h1:sAPJgywANHUCFUo/spCQ8SoP6sJhmfIKFWIXu7Dd5GQ=
873+
github.com/mholt/acmez v1.0.4 h1:N3cE4Pek+dSolbsofIkAYz6H1d3pE+2G0os7QHslf80=
874+
github.com/mholt/acmez v1.0.4/go.mod h1:qFGLZ4u+ehWINeJZjzPlsnjJBCPAADWTcIqE/7DAYQY=
867875
github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo=
868876
github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
869877
github.com/microcosm-cc/bluemonday v1.0.22 h1:p2tT7RNzRdCi0qmwxG+HbqD6ILkmwter1ZwVZn1oTxA=
@@ -1181,9 +1189,15 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
11811189
github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8=
11821190
github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8=
11831191
github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
1192+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
1193+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
1194+
github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I=
1195+
github.com/valyala/fasthttp v1.44.0 h1:R+gLUhldIsfg1HokMuQjdQ5bh9nuXHPIfvkYUu9eR5Q=
1196+
github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY=
11841197
github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
11851198
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
11861199
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
1200+
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
11871201
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
11881202
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
11891203
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
@@ -1249,18 +1263,22 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
12491263
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
12501264
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
12511265
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
1266+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
12521267
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
12531268
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
12541269
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
1270+
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
12551271
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
12561272
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
12571273
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
1274+
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
12581275
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
12591276
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
12601277
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
12611278
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
12621279
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
12631280
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
1281+
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
12641282
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
12651283
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
12661284
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1383,8 +1401,10 @@ golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qx
13831401
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
13841402
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
13851403
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
1404+
golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
13861405
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
13871406
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
1407+
golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
13881408
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
13891409
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
13901410
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
@@ -1492,6 +1512,7 @@ golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBc
14921512
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
14931513
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
14941514
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1515+
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
14951516
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
14961517
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
14971518
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1591,6 +1612,7 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f
15911612
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
15921613
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
15931614
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
1615+
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
15941616
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
15951617
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
15961618
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=

modules/indexer/issues/indexer.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func InitIssueIndexer(syncReindex bool) {
107107

108108
// Create the Queue
109109
switch setting.Indexer.IssueType {
110-
case "bleve", "elasticsearch":
110+
case "bleve", "elasticsearch", "meilisearch":
111111
handler := func(data ...queue.Data) []queue.Data {
112112
indexer := holder.get()
113113
if indexer == nil {
@@ -220,6 +220,21 @@ func InitIssueIndexer(syncReindex bool) {
220220
issueIndexer := &DBIndexer{}
221221
holder.set(issueIndexer)
222222
graceful.GetManager().RunAtTerminate(finished)
223+
case "meilisearch":
224+
graceful.GetManager().RunWithShutdownFns(func(_, atTerminate func(func())) {
225+
pprof.SetGoroutineLabels(ctx)
226+
issueIndexer, err := NewMeilisearchIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueConnAuth, setting.Indexer.IssueIndexerName)
227+
if err != nil {
228+
log.Fatal("Unable to initialize Meilisearch Issue Indexer at connection: %s Error: %v", setting.Indexer.IssueConnStr, err)
229+
}
230+
exist, err := issueIndexer.Init()
231+
if err != nil {
232+
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err)
233+
}
234+
populate = !exist
235+
holder.set(issueIndexer)
236+
atTerminate(finished)
237+
})
223238
default:
224239
holder.cancel()
225240
log.Fatal("Unknown issue indexer type: %s", setting.Indexer.IssueType)

modules/indexer/issues/meilisearch.go

+183
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package issues
5+
6+
import (
7+
"context"
8+
"strconv"
9+
"sync"
10+
"time"
11+
12+
"github.com/meilisearch/meilisearch-go"
13+
)
14+
15+
var _ Indexer = &MeilisearchIndexer{}
16+
17+
// MeilisearchIndexer implements Indexer interface
18+
type MeilisearchIndexer struct {
19+
client *meilisearch.Client
20+
indexerName string
21+
available bool
22+
availabilityCallback func(bool)
23+
stopTimer chan struct{}
24+
lock sync.RWMutex
25+
}
26+
27+
// MeilisearchIndexer creates a new meilisearch indexer
28+
func NewMeilisearchIndexer(url, apiKey, indexerName string) (*MeilisearchIndexer, error) {
29+
client := meilisearch.NewClient(meilisearch.ClientConfig{
30+
Host: url,
31+
APIKey: apiKey,
32+
})
33+
34+
indexer := &MeilisearchIndexer{
35+
client: client,
36+
indexerName: indexerName,
37+
available: true,
38+
stopTimer: make(chan struct{}),
39+
}
40+
41+
ticker := time.NewTicker(10 * time.Second)
42+
go func() {
43+
for {
44+
select {
45+
case <-ticker.C:
46+
indexer.checkAvailability()
47+
case <-indexer.stopTimer:
48+
ticker.Stop()
49+
return
50+
}
51+
}
52+
}()
53+
54+
return indexer, nil
55+
}
56+
57+
// Init will initialize the indexer
58+
func (b *MeilisearchIndexer) Init() (bool, error) {
59+
_, err := b.client.GetIndex(b.indexerName)
60+
if err == nil {
61+
return true, nil
62+
}
63+
_, err = b.client.CreateIndex(&meilisearch.IndexConfig{
64+
Uid: b.indexerName,
65+
PrimaryKey: "id",
66+
})
67+
if err != nil {
68+
return false, b.checkError(err)
69+
}
70+
71+
_, err = b.client.Index(b.indexerName).UpdateFilterableAttributes(&[]string{"repo_id"})
72+
return false, b.checkError(err)
73+
}
74+
75+
// SetAvailabilityChangeCallback sets callback that will be triggered when availability changes
76+
func (b *MeilisearchIndexer) SetAvailabilityChangeCallback(callback func(bool)) {
77+
b.lock.Lock()
78+
defer b.lock.Unlock()
79+
b.availabilityCallback = callback
80+
}
81+
82+
// Ping checks if meilisearch is available
83+
func (b *MeilisearchIndexer) Ping() bool {
84+
b.lock.RLock()
85+
defer b.lock.RUnlock()
86+
return b.available
87+
}
88+
89+
// Index will save the index data
90+
func (b *MeilisearchIndexer) Index(issues []*IndexerData) error {
91+
if len(issues) == 0 {
92+
return nil
93+
}
94+
for _, issue := range issues {
95+
_, err := b.client.Index(b.indexerName).AddDocuments(issue)
96+
if err != nil {
97+
return b.checkError(err)
98+
}
99+
}
100+
// TODO: bulk send index data
101+
return nil
102+
}
103+
104+
// Delete deletes indexes by ids
105+
func (b *MeilisearchIndexer) Delete(ids ...int64) error {
106+
if len(ids) == 0 {
107+
return nil
108+
}
109+
110+
for _, id := range ids {
111+
_, err := b.client.Index(b.indexerName).DeleteDocument(strconv.FormatInt(id, 10))
112+
if err != nil {
113+
return b.checkError(err)
114+
}
115+
}
116+
// TODO: bulk send deletes
117+
return nil
118+
}
119+
120+
// Search searches for issues by given conditions.
121+
// Returns the matching issue IDs
122+
func (b *MeilisearchIndexer) Search(ctx context.Context, keyword string, repoIDs []int64, limit, start int) (*SearchResult, error) {
123+
filter := make([][]string, 0, len(repoIDs))
124+
for _, repoID := range repoIDs {
125+
filter = append(filter, []string{"repo_id = " + strconv.FormatInt(repoID, 10)})
126+
}
127+
searchRes, err := b.client.Index(b.indexerName).Search(keyword, &meilisearch.SearchRequest{
128+
Filter: filter,
129+
Limit: int64(limit),
130+
Offset: int64(start),
131+
})
132+
if err != nil {
133+
return nil, b.checkError(err)
134+
}
135+
136+
hits := make([]Match, 0, len(searchRes.Hits))
137+
for _, hit := range searchRes.Hits {
138+
hits = append(hits, Match{
139+
ID: int64(hit.(map[string]interface{})["id"].(float64)),
140+
})
141+
}
142+
return &SearchResult{
143+
Total: searchRes.TotalHits,
144+
Hits: hits,
145+
}, nil
146+
}
147+
148+
// Close implements indexer
149+
func (b *MeilisearchIndexer) Close() {
150+
select {
151+
case <-b.stopTimer:
152+
default:
153+
close(b.stopTimer)
154+
}
155+
}
156+
157+
func (b *MeilisearchIndexer) checkError(err error) error {
158+
return err
159+
}
160+
161+
func (b *MeilisearchIndexer) checkAvailability() {
162+
_, err := b.client.Health()
163+
if err != nil {
164+
b.setAvailability(false)
165+
return
166+
}
167+
b.setAvailability(true)
168+
}
169+
170+
func (b *MeilisearchIndexer) setAvailability(available bool) {
171+
b.lock.Lock()
172+
defer b.lock.Unlock()
173+
174+
if b.available == available {
175+
return
176+
}
177+
178+
b.available = available
179+
if b.availabilityCallback != nil {
180+
// Call the callback from within the lock to ensure that the ordering remains correct
181+
b.availabilityCallback(b.available)
182+
}
183+
}

0 commit comments

Comments
 (0)