Crissium / SilverDict

Web-Based Alternative to GoldenDict
https://silverdict.lecoteauverdoyant.co.uk
GNU General Public License v3.0
143 stars 19 forks source link

将 suggestions_mode 从 right-side 改为 both-sides 时出现 sqlite3.OperationalError #6

Closed czqhurricnae closed 10 months ago

czqhurricnae commented 10 months ago

背景

我使用 GoldenDict-ng 软件查询 nuisance 时 从 SIO双向双解词典v3.3.mdx 获得的 suggestions 比 SiverDict 本地来的全。

➜ curl http://127.0.0.1:2628/api/suggestions/Default%20Group/%nuisance%
{"suggestions":["nuisance","nuisance analysis","nuisance area","nuisance call","nuisanceless","nuisanceless technology","nuisance order","nuisance organism","nuisance or pyblic nuisance","nuisance parameters","nuisance raid","nuisances","nuisance tax","nuisance taxs","nuisancethreshold","nuisance value","nuisancevalue","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"timestamp":1699155984046.5842}

获取的结果只有十七条。(我已经设置 num_suggestions: 100

image

而使用 GoldenDict-ng 软件获取的结果如图,明显是比 SilverDict 多。

复现

我尝试将 preferences.yaml 中的 suggestions_mode: right-side # instantaneous 改为 both-side。 再次运行 curl http://127.0.0.1:2628/api/suggestions/Default%20Group/%nuisance% 结果出现错误:

INFO:app.dictionaries:Dictionaries loaded.
INFO:waitress:Serving on http://127.0.0.1:2628
ERROR:app:Exception on /api/suggestions/Default Group/%nuisance% [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1455, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 869, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.10/site-packages/flask_cors/extension.py", line 176, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 867, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 852, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/Users/c/Downloads/SilverDict/server/app/api/lookup.py", line 14, in suggestions
    suggestions = dicts.suggestions(group_name, key)
  File "/Users/c/Downloads/SilverDict/server/app/dictionaries.py", line 130, in suggestions
    keys_expanded.extend(db_manager.expand_key(key_simplified))
  File "/Users/c/Downloads/SilverDict/server/app/db_manager.py", line 178, in expand_key
    rows = cursor.execute(statement, ngrams)
sqlite3.OperationalError: no such table: ngrams
Crissium commented 10 months ago

首先,因为某些原因,通配符 * (>= 0 个字符)是 ^.

然后,为了使用双向扩展,需要手动创建 ngram 索引,参见 https://github.com/Crissium/SilverDict/wiki/general-notes#both-sides-suggestion-matching

直接 curl http://localhost:2628/api/management/create_ngram_table 也行,这个会自动修改 preferences.yaml, 内存中的设置也会改成 both-sides. 手动修改后需要重启。

另外还有一点,开启 both-sides 之后,输入 key 会自动匹配 %key%, 不需要手动在两边补上通配符,通配符是用来进行 w*rd*le 这样的查询的。

czqhurricnae commented 10 months ago

谢谢解答,顺利解决。