ckanext-search-tweaks 0.6.1.post1__py3-none-any.whl → 0.6.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ckanext/search_tweaks/config_declaration.yaml +24 -0
- ckanext/search_tweaks/field_relevance/plugin.py +1 -6
- ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html +1 -1
- ckanext/search_tweaks/field_relevance/views.py +15 -11
- ckanext/search_tweaks/query_popularity/config_declaration.yaml +29 -0
- ckanext/search_tweaks/query_relevance/cli.py +21 -1
- ckanext/search_tweaks/query_relevance/plugin.py +2 -12
- {ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/METADATA +3 -3
- {ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/RECORD +13 -11
- {ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/WHEEL +1 -1
- {ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/LICENSE +0 -0
- {ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/entry_points.txt +0 -0
- {ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
version: 1
|
2
|
+
groups:
|
3
|
+
- annotation: "ckanext-search-tweaks: common"
|
4
|
+
options:
|
5
|
+
- key: ckanext.search_tweaks.common.qf
|
6
|
+
placeholder: "name^4 title^4 tags^2 groups^2 text"
|
7
|
+
|
8
|
+
- key: ckanext.search_tweaks.common.mm
|
9
|
+
default: "1"
|
10
|
+
|
11
|
+
- key: ckanext.search_tweaks.common.fuzzy_search.enabled
|
12
|
+
type: bool
|
13
|
+
|
14
|
+
- key: ckanext.search_tweaks.common.fuzzy_search.distance
|
15
|
+
type: int
|
16
|
+
default: 1
|
17
|
+
|
18
|
+
- key: ckanext.search_tweaks.common.fuzzy_search.keep_original
|
19
|
+
type: bool
|
20
|
+
default: true
|
21
|
+
|
22
|
+
- key: ckanext.search_tweaks.common.prefer_boost
|
23
|
+
type: bool
|
24
|
+
default: true
|
@@ -15,10 +15,10 @@ CONFIG_BOOST_FN = "ckanext.search_tweaks.field_relevance.boost_function"
|
|
15
15
|
DEFAULT_BOOST_FN = None
|
16
16
|
|
17
17
|
|
18
|
+
@tk.blanket.blueprints
|
18
19
|
class FieldRelevancePlugin(p.SingletonPlugin):
|
19
20
|
p.implements(ISearchTweaks, inherit=True)
|
20
21
|
p.implements(p.IAuthFunctions)
|
21
|
-
p.implements(p.IBlueprint)
|
22
22
|
p.implements(p.IConfigurer, inherit=True)
|
23
23
|
|
24
24
|
# ISearchTweaks
|
@@ -28,11 +28,6 @@ class FieldRelevancePlugin(p.SingletonPlugin):
|
|
28
28
|
|
29
29
|
return tk.config.get(CONFIG_BOOST_FN, DEFAULT_BOOST_FN)
|
30
30
|
|
31
|
-
# IBlueprint
|
32
|
-
|
33
|
-
def get_blueprint(self):
|
34
|
-
return views.get_blueprints()
|
35
|
-
|
36
31
|
# IConfigurer
|
37
32
|
|
38
33
|
def update_config(self, config):
|
@@ -17,7 +17,7 @@
|
|
17
17
|
<form id="dataset-edit" class="dataset-form" method="post" action="{{ action }}" data-module="basic-form" novalidate>
|
18
18
|
|
19
19
|
{% call form.input_block(field_name, _("Promotion level"), errors[field_name], classes=["search-tweaks-label-with-value"]) %}
|
20
|
-
<input data-module="search-tweaks-reflect-range-in-label" data-module-format=" (%d)" id="{{ field_name }}" type="range" name="{{ field_name }}" value="{{ data[field_name] }}" max="{{ max_promotion }}" />
|
20
|
+
<input data-module="search-tweaks-reflect-range-in-label" data-module-format=" (%d)" id="{{ field_name }}" type="range" name="{{ field_name }}" value="{{ data[field_name] }}" min="{{ min_promotion }}" max="{{ max_promotion }}" />
|
21
21
|
{% endcall %}
|
22
22
|
|
23
23
|
{% block form_actions %}
|
@@ -12,6 +12,9 @@ CONFIG_ENABLE_PROMOTION_ROUTE = (
|
|
12
12
|
"ckanext.search_tweaks.field_relevance.blueprint.promotion.enabled"
|
13
13
|
)
|
14
14
|
CONFIG_PROMOTION_PATH = "ckanext.search_tweaks.field_relevance.blueprint.promotion.path"
|
15
|
+
CONFIG_MIN_PROMOTION = (
|
16
|
+
"ckanext.search_tweaks.field_relevance.blueprint.promotion.min_value"
|
17
|
+
)
|
15
18
|
CONFIG_MAX_PROMOTION = (
|
16
19
|
"ckanext.search_tweaks.field_relevance.blueprint.promotion.max_value"
|
17
20
|
)
|
@@ -21,22 +24,13 @@ CONFIG_PROMOTION_FIELD = (
|
|
21
24
|
|
22
25
|
DEFAULT_ENABLE_PROMOTION_ROUTE = False
|
23
26
|
DEFAULT_PROMOTION_PATH = "/dataset/promote/<id>"
|
27
|
+
DEFAULT_MIN_PROMOTION = 0
|
24
28
|
DEFAULT_MAX_PROMOTION = 100
|
25
29
|
DEFAULT_PROMOTION_FIELD = "promotion_level"
|
26
30
|
|
27
31
|
field_relevance = Blueprint("search_tweaks_field_relevance", __name__)
|
28
32
|
|
29
33
|
|
30
|
-
def get_blueprints():
|
31
|
-
if tk.asbool(
|
32
|
-
tk.config.get(CONFIG_ENABLE_PROMOTION_ROUTE, DEFAULT_ENABLE_PROMOTION_ROUTE),
|
33
|
-
):
|
34
|
-
path = tk.config.get(CONFIG_PROMOTION_PATH, DEFAULT_PROMOTION_PATH)
|
35
|
-
field_relevance.add_url_rule(path, view_func=PromoteView.as_view("promote"))
|
36
|
-
|
37
|
-
return [field_relevance]
|
38
|
-
|
39
|
-
|
40
34
|
class PromoteView(MethodView):
|
41
35
|
def _check_access(self, id: str) -> None:
|
42
36
|
try:
|
@@ -50,7 +44,7 @@ class PromoteView(MethodView):
|
|
50
44
|
schema = {
|
51
45
|
field: [
|
52
46
|
tk.get_validator("convert_int"),
|
53
|
-
tk.get_validator("
|
47
|
+
tk.get_validator("int_validator"),
|
54
48
|
tk.get_validator("limit_to_configured_maximum")(
|
55
49
|
CONFIG_MAX_PROMOTION, DEFAULT_MAX_PROMOTION,
|
56
50
|
),
|
@@ -89,6 +83,10 @@ class PromoteView(MethodView):
|
|
89
83
|
"pkg_dict": pkg_dict,
|
90
84
|
"errors": errors or {},
|
91
85
|
"data": data or pkg_dict,
|
86
|
+
"min_promotion": tk.asint(
|
87
|
+
tk.config.get(CONFIG_MIN_PROMOTION, DEFAULT_MIN_PROMOTION),
|
88
|
+
),
|
89
|
+
|
92
90
|
"max_promotion": tk.asint(
|
93
91
|
tk.config.get(CONFIG_MAX_PROMOTION, DEFAULT_MAX_PROMOTION),
|
94
92
|
),
|
@@ -96,3 +94,9 @@ class PromoteView(MethodView):
|
|
96
94
|
}
|
97
95
|
|
98
96
|
return tk.render("search_tweaks/field_relevance/promote.html", extra_vars)
|
97
|
+
|
98
|
+
|
99
|
+
if tk.asbool(
|
100
|
+
tk.config.get(CONFIG_ENABLE_PROMOTION_ROUTE, DEFAULT_ENABLE_PROMOTION_ROUTE),
|
101
|
+
):
|
102
|
+
field_relevance.add_url_rule("/dataset/promote/<id>", view_func=PromoteView.as_view("promote"))
|
@@ -0,0 +1,29 @@
|
|
1
|
+
version: 1
|
2
|
+
groups:
|
3
|
+
- annotation: "ckanext-search-tweaks: query popularity"
|
4
|
+
options:
|
5
|
+
- key: ckanext.search_tweaks.query_popularity.skip_irrefutable_search
|
6
|
+
type: bool
|
7
|
+
default: true
|
8
|
+
|
9
|
+
- key: ckanext.search_tweaks.query_popularity.ignored_symbols
|
10
|
+
default: ":"
|
11
|
+
|
12
|
+
- key: ckanext.search_tweaks.query_popularity.ignored_terms
|
13
|
+
type: list
|
14
|
+
|
15
|
+
- key: ckanext.search_tweaks.query_popularity.tracked_endpoints
|
16
|
+
type: list
|
17
|
+
default: dataset.search
|
18
|
+
|
19
|
+
- key: ckanext.search_tweaks.query_popularity.query_throttle
|
20
|
+
type: int
|
21
|
+
default: 86_400 # 24 hours
|
22
|
+
|
23
|
+
- key: ckanext.search_tweaks.query_popularity.max_age
|
24
|
+
type: int
|
25
|
+
default: 2_592_000 # 30 days
|
26
|
+
|
27
|
+
- key: ckanext.search_tweaks.query_popularity.obsoletion_period
|
28
|
+
type: int
|
29
|
+
default: 86_400 # 24 hours
|
@@ -1,16 +1,21 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import csv
|
2
4
|
import datetime
|
3
|
-
|
5
|
+
import logging
|
4
6
|
import click
|
5
7
|
import freezegun
|
6
8
|
|
7
9
|
import ckan.model as model
|
8
10
|
from ckan.lib.redis import connect_to_redis
|
11
|
+
from ckan.lib.search import rebuild
|
9
12
|
|
10
13
|
from . import QueryScore
|
11
14
|
|
12
15
|
_search_csv_headers = ["package_id", "search_query", "count_of_hits"]
|
13
16
|
|
17
|
+
log = logging.getLogger(__name__)
|
18
|
+
|
14
19
|
|
15
20
|
@click.group(short_help="Manage search relevance")
|
16
21
|
def query():
|
@@ -86,3 +91,18 @@ def safe_export(ctx, days, file):
|
|
86
91
|
fg="red",
|
87
92
|
)
|
88
93
|
ctx.invoke(import_source, source=click.File()(file))
|
94
|
+
|
95
|
+
|
96
|
+
@query.command()
|
97
|
+
def index():
|
98
|
+
"""Re-index datasets that have query relevance scores.
|
99
|
+
"""
|
100
|
+
|
101
|
+
storage = QueryScore.default_storage_class()
|
102
|
+
ids = {id for id, _, _ in storage.scan()}
|
103
|
+
with click.progressbar(ids) as bar:
|
104
|
+
for id in bar:
|
105
|
+
try:
|
106
|
+
rebuild(id)
|
107
|
+
except Exception:
|
108
|
+
log.exception("Cannot index %s", id)
|
@@ -49,24 +49,14 @@ class QueryRelevancePlugin(plugins.SingletonPlugin):
|
|
49
49
|
# ISearchTweaks
|
50
50
|
|
51
51
|
def get_search_boost_fn(self, search_params: dict[str, Any]) -> str | None:
|
52
|
-
if feature_disabled("query_boost", search_params):
|
53
|
-
return None
|
54
|
-
|
55
|
-
prefix = tk.config.get(CONFIG_RELEVANCE_PREFIX, DEFAULT_RELEVANCE_PREFIX)
|
56
|
-
disabled = tk.asbool(
|
57
|
-
search_params.get("extras", {}).get(
|
58
|
-
"ext_search_tweaks_disable_relevance",
|
59
|
-
False,
|
60
|
-
),
|
61
|
-
)
|
62
|
-
|
63
|
-
if not search_params.get("q") or disabled:
|
52
|
+
if feature_disabled("query_boost", search_params) or not search_params.get("q"):
|
64
53
|
return None
|
65
54
|
|
66
55
|
normalized = normalize_query(search_params["q"]).replace(" ", "_")
|
67
56
|
if not normalized:
|
68
57
|
return None
|
69
58
|
|
59
|
+
prefix = tk.config.get(CONFIG_RELEVANCE_PREFIX, DEFAULT_RELEVANCE_PREFIX)
|
70
60
|
field = prefix + normalized
|
71
61
|
boost_string = Template(
|
72
62
|
tk.config.get(CONFIG_BOOST_STRING, DEFAULT_BOOST_STRING),
|
{ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ckanext-search-tweaks
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.3
|
4
4
|
Author-email: DataShades <datashades@linkdigital.com.au>, Sergey Motornyuk <sergey.motornyuk@linkdigital.com.au>
|
5
5
|
Maintainer-email: DataShades <datashades@linkdigital.com.au>
|
6
6
|
License: AGPL
|
@@ -14,8 +14,8 @@ Classifier: Programming Language :: Python :: 3.10
|
|
14
14
|
Description-Content-Type: text/markdown
|
15
15
|
License-File: LICENSE
|
16
16
|
Requires-Dist: freezegun
|
17
|
-
Requires-Dist:
|
18
|
-
Requires-Dist: ckanext-toolbelt
|
17
|
+
Requires-Dist: typing_extensions>=4.0.0
|
18
|
+
Requires-Dist: ckanext-toolbelt>=0.4.11
|
19
19
|
Provides-Extra: advanced-search
|
20
20
|
|
21
21
|
[](https://github.com/DataShades/ckanext-search-tweaks/actions)
|
{ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/RECORD
RENAMED
@@ -2,6 +2,7 @@ ckanext/__init__.py,sha256=xsigU4VzvLfcHEa08OUsv-05ZXU-qwjs3Y3f6PWA7fY,203
|
|
2
2
|
ckanext/search_tweaks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
ckanext/search_tweaks/cli.py,sha256=Pex34fMESkVycy6kOfODtNmHh8nPMvzFKTeZD0txLvc,308
|
4
4
|
ckanext/search_tweaks/config.py,sha256=NX7rsslGJyxQ8xTZidy9fI-SDkJ4lX4oLTX54lVLGI0,941
|
5
|
+
ckanext/search_tweaks/config_declaration.yaml,sha256=XrlvWGhlnVPGTJfbRj4Fxf0o8Q9UiS1bYKolnAoY8bg,644
|
5
6
|
ckanext/search_tweaks/interfaces.py,sha256=pOu2PyMVxu7XDyGCvP42upm5N4Ws1KR0qzyW8wE2CGY,869
|
6
7
|
ckanext/search_tweaks/plugin.py,sha256=Bk1ejlTsKxUcIjckuzQBj_nwUbIz7H5t-AwqtmCvaIw,3330
|
7
8
|
ckanext/search_tweaks/shared.py,sha256=9aWN_OXB5-h99lecnZVoZpLY6F8hbIRNX6WUQaoOoYI,325
|
@@ -12,13 +13,14 @@ ckanext/search_tweaks/advanced_search/assets/advanced-search.js,sha256=rkgprbv9f
|
|
12
13
|
ckanext/search_tweaks/advanced_search/assets/webassets.yml,sha256=g0NMsLyHzslxtkIXRFj_Vf-SU6b8MYlBiuHc50SQiAo,439
|
13
14
|
ckanext/search_tweaks/advanced_search/templates/advanced_search/search_form.html,sha256=QlKCxEUDGP1g4oZEOKAGSuopjrJsbcgK2cs28k3X4Vc,4266
|
14
15
|
ckanext/search_tweaks/field_relevance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
ckanext/search_tweaks/field_relevance/plugin.py,sha256=
|
16
|
-
ckanext/search_tweaks/field_relevance/views.py,sha256=
|
16
|
+
ckanext/search_tweaks/field_relevance/plugin.py,sha256=f5VQcu5PfBncXM6WVLsMDze9fQe20LmNvot51mui3Jg,1338
|
17
|
+
ckanext/search_tweaks/field_relevance/views.py,sha256=yAkoZrxtEKiSRMYmXHeq_bS3nGi6QtiC6zEOSu0kn5g,3336
|
17
18
|
ckanext/search_tweaks/field_relevance/assets/search-tweaks-reflect-range-in-label.js,sha256=WFAzPBvzf6SWaEAQJTxiEGhZm-65o676MN6KttCpvbo,490
|
18
19
|
ckanext/search_tweaks/field_relevance/assets/webassets.yml,sha256=PGr_EC4jOTABCRc3JCIAqYCzCMNgGG1KYE6Ua0S0vfk,184
|
19
|
-
ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html,sha256=
|
20
|
+
ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html,sha256=yMoVwcpiSl7XM-EaoznDe5MiRY3G1zcBywAI1IZhKj4,1144
|
20
21
|
ckanext/search_tweaks/query_popularity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
22
|
ckanext/search_tweaks/query_popularity/config.py,sha256=O-YptWOeDQ6tyVLZ10D3dVs5tGhjOoOtFY3Xw_InmjA,858
|
23
|
+
ckanext/search_tweaks/query_popularity/config_declaration.yaml,sha256=asztZ5jFcfOQoS0Wq-pC41scC3w2ahNEP2AhIMMO2PM,866
|
22
24
|
ckanext/search_tweaks/query_popularity/plugin.py,sha256=ih9c7CrI-A1ilfe9I1Hb_3BdMOnzNsTyMfJA7c0Qs8A,1391
|
23
25
|
ckanext/search_tweaks/query_popularity/score.py,sha256=JfOiR7yj22euNrIX3T_VYjzB7ilGpDmr4hmXFHfsSAc,1052
|
24
26
|
ckanext/search_tweaks/query_popularity/logic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -26,8 +28,8 @@ ckanext/search_tweaks/query_popularity/logic/action.py,sha256=uG6IdAX2b8YztmcxiA
|
|
26
28
|
ckanext/search_tweaks/query_popularity/logic/auth.py,sha256=6jddjTxo9NX_a-_jQz_8Mj7273zfkfZz1_BOW6JzHm0,670
|
27
29
|
ckanext/search_tweaks/query_popularity/logic/schema.py,sha256=rgjmRyGb7zlBOLZo284XcH9F6VepmIv5yvoxTGxLByA,301
|
28
30
|
ckanext/search_tweaks/query_relevance/__init__.py,sha256=mGpZuwY8UwPMuxjNLhGVYoaXPfLx5UPMixpldIjZuSY,1467
|
29
|
-
ckanext/search_tweaks/query_relevance/cli.py,sha256=
|
30
|
-
ckanext/search_tweaks/query_relevance/plugin.py,sha256=
|
31
|
+
ckanext/search_tweaks/query_relevance/cli.py,sha256=34bgBphi28vOu08H3TBrm7ssKj9_6gXiQU1SNzAs7bM,3083
|
32
|
+
ckanext/search_tweaks/query_relevance/plugin.py,sha256=49lJXKeahwyFAMEh063YGF7SGNBcqpcojNA2TUSlkQ8,2219
|
31
33
|
ckanext/search_tweaks/query_relevance/score.py,sha256=hfrfgNP5OUf7YBBDuFFBZb66ixpiAlnM-KAXzUVexXc,1811
|
32
34
|
ckanext/search_tweaks/query_relevance/storage.py,sha256=7SP1arTjTvbHrWDZhzu9E0pWxk4ygz3NcpDk7P4YODk,4852
|
33
35
|
ckanext/search_tweaks/spellcheck/__init__.py,sha256=Af3LHk9L82QtAh4q7C3srzCwJiF6WCtxe4CFTPKhFMQ,1401
|
@@ -44,9 +46,9 @@ ckanext/search_tweaks/tests/query_relevance/test_score.py,sha256=RwG_o8QyW3BZBx3
|
|
44
46
|
ckanext/search_tweaks/tests/query_relevance/test_storage.py,sha256=xBHB69zHE301mHlUB2hz0RXJaqFrhRMesAz2LNYNFE0,2825
|
45
47
|
ckanext/search_tweaks/tests/spellcheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
48
|
ckanext/search_tweaks/tests/spellcheck/test_plugin.py,sha256=4pocLV8uzea2ua8LUTC3IXlyYc3oKbhApODA1uWHNFU,2517
|
47
|
-
ckanext_search_tweaks-0.6.
|
48
|
-
ckanext_search_tweaks-0.6.
|
49
|
-
ckanext_search_tweaks-0.6.
|
50
|
-
ckanext_search_tweaks-0.6.
|
51
|
-
ckanext_search_tweaks-0.6.
|
52
|
-
ckanext_search_tweaks-0.6.
|
49
|
+
ckanext_search_tweaks-0.6.3.dist-info/LICENSE,sha256=2lWcRAHjsQhqavGNnR30Ymxq3GJ9BaYL_dnfGO_-WFA,34500
|
50
|
+
ckanext_search_tweaks-0.6.3.dist-info/METADATA,sha256=7u9irDZzibOQ5AJmjYFiLBdXz-1ecdR--DLPMaVn6Xk,12247
|
51
|
+
ckanext_search_tweaks-0.6.3.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
|
52
|
+
ckanext_search_tweaks-0.6.3.dist-info/entry_points.txt,sha256=0hvD0BILJCAPZBOTH28bAMN8XCbPrltTZ6Q8-mUZGyE,615
|
53
|
+
ckanext_search_tweaks-0.6.3.dist-info/top_level.txt,sha256=5yjNwq-s42weaiMMUuA5lZ45g99ANsfcRBCvac1JMS4,8
|
54
|
+
ckanext_search_tweaks-0.6.3.dist-info/RECORD,,
|
{ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|
{ckanext_search_tweaks-0.6.1.post1.dist-info → ckanext_search_tweaks-0.6.3.dist-info}/top_level.txt
RENAMED
File without changes
|