Compare commits

...

8 Commits

Author SHA1 Message Date
Alexandre Flament 691c0ed6b9
Merge pull request #1743 from dalf/update_about_metrics
Update about the metrics
2022-09-04 11:29:28 +02:00
Markus Heiser 0d1af21f9a
Merge pull request #1714 from return42/mod-archive
[mod] option 'server: archive_url:' to configure internet archive
2022-09-04 09:49:06 +02:00
Markus Heiser ad8ffd222c [mod] option 'ui: cache_url:' to configure internet cache or archive
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2022-09-04 09:42:20 +02:00
Markus Heiser 9ab8438132
Merge pull request #1681 from return42/fix-woxikon
[fix] engine woxikon.de - don't raise exception on empty result list
2022-09-04 09:14:34 +02:00
Alexandre FLAMENT dd0887be18 xpath engine: change raise_for_httperror to no_result_for_http_status
no_result_for_http_status contains a list of HTTP status.
These HTTP status are seen an empty result list.
In other cases an exception is thrown as usual.

Previously raise_for_httperror were ignoring all HTTP error,
which make defective engines invisible in the stats.
2022-09-04 09:07:28 +02:00
Markus Heiser a15dfa5ee1 [fix] engine woxikon.de - don't raise exception on empty result list
Woxikon expects a word in German, so with query "foo" the site finds nothing and
respons a 404:

    httpx.HTTPStatusError: Client error '404 Not Found' \
      for url 'https://synonyme.woxikon.de/synonyme/foo.php'

[1] https://github.com/searxng/searxng/issues/1543#issuecomment-1193317054

Closes: https://github.com/searxng/searxng/issues/1543
Suggested-by: @allendema [1]
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2022-09-04 09:07:28 +02:00
Alexandre FLAMENT 66f72a006f template: when enable_metrics are disabled, hide the empty stats
when metrics are disabled:
* hide the link to /stats at the bottom of the pages
* in /preferences, hide the columns "Response time" and "Reliability"
2022-09-02 08:52:23 +00:00
Alexandre FLAMENT 94a28ebe53 Stats: display only the score per result, no anymore the score 2022-09-02 08:30:38 +00:00
9 changed files with 43 additions and 14 deletions

View File

@ -240,6 +240,7 @@ Global Settings
query_in_title: false query_in_title: false
infinite_scroll: false infinite_scroll: false
center_alignment: false center_alignment: false
cache_url: https://web.archive.org/web/
default_theme: simple default_theme: simple
theme_args: theme_args:
simple_style: auto simple_style: auto
@ -267,6 +268,15 @@ Global Settings
side of the screen. This setting only affects the *desktop layout* side of the screen. This setting only affects the *desktop layout*
(:origin:`min-width: @tablet <searx/static/themes/simple/src/less/definitions.less>`) (:origin:`min-width: @tablet <searx/static/themes/simple/src/less/definitions.less>`)
.. cache_url:
``cache_url`` : ``https://web.archive.org/web/``
URL prefix of the internet archive or cache, don't forgett trailing slash (if
needed). The default is https://web.archive.org/web/ alternatives are:
- https://webcache.googleusercontent.com/search?q=cache:
- https://archive.today/
``default_theme`` : ``default_theme`` :
Name of the theme you want to use by default on your SearXNG instance. Name of the theme you want to use by default on your SearXNG instance.

View File

@ -22,6 +22,7 @@ from urllib.parse import urlencode
from lxml import html from lxml import html
from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list
from searx.network import raise_for_httperror
search_url = None search_url = None
""" """
@ -61,6 +62,14 @@ lang_all = 'en'
selected. selected.
''' '''
no_result_for_http_status = []
'''Return empty result for these HTTP status codes instead of throwing an error.
.. code:: yaml
no_result_for_http_status: []
'''
soft_max_redirects = 0 soft_max_redirects = 0
'''Maximum redirects, soft limit. Record an error but don't stop the engine''' '''Maximum redirects, soft limit. Record an error but don't stop the engine'''
@ -177,11 +186,18 @@ def request(query, params):
params['url'] = search_url.format(**fargs) params['url'] = search_url.format(**fargs)
params['soft_max_redirects'] = soft_max_redirects params['soft_max_redirects'] = soft_max_redirects
params['raise_for_httperror'] = False
return params return params
def response(resp): def response(resp): # pylint: disable=too-many-branches
'''Scrap *results* from the response (see :ref:`engine results`).''' '''Scrap *results* from the response (see :ref:`engine results`).'''
if no_result_for_http_status and resp.status_code in no_result_for_http_status:
return []
raise_for_httperror(resp)
results = [] results = []
dom = html.fromstring(resp.text) dom = html.fromstring(resp.text)
is_onion = 'onions' in categories is_onion = 'onions' in categories

View File

@ -95,6 +95,8 @@ ui:
default_theme: simple default_theme: simple
# center the results ? # center the results ?
center_alignment: false center_alignment: false
# URL prefix of the internet archive, don't forgett trailing slash (if needed).
# cache_url: "https://webcache.googleusercontent.com/search?q=cache:"
# Default interface locale - leave blank to detect from browser information or # Default interface locale - leave blank to detect from browser information or
# use codes from the 'locales' config section # use codes from the 'locales' config section
default_locale: "" default_locale: ""
@ -1808,6 +1810,7 @@ engines:
url_xpath: //div[@class="upper-synonyms"]/a/@href url_xpath: //div[@class="upper-synonyms"]/a/@href
content_xpath: //div[@class="synonyms-list-group"] content_xpath: //div[@class="synonyms-list-group"]
title_xpath: //div[@class="upper-synonyms"]/a title_xpath: //div[@class="upper-synonyms"]/a
no_result_for_http_status: [404]
about: about:
website: https://www.woxikon.de/ website: https://www.woxikon.de/
wikidata_id: # No Wikidata ID wikidata_id: # No Wikidata ID

View File

@ -190,6 +190,7 @@ SCHEMA = {
'advanced_search': SettingsValue(bool, False), 'advanced_search': SettingsValue(bool, False),
'query_in_title': SettingsValue(bool, False), 'query_in_title': SettingsValue(bool, False),
'infinite_scroll': SettingsValue(bool, False), 'infinite_scroll': SettingsValue(bool, False),
'cache_url': SettingsValue(str, 'https://web.archive.org/web/'),
}, },
'preferences': { 'preferences': {
'lock': SettingsValue(list, []), 'lock': SettingsValue(list, []),

View File

@ -62,9 +62,9 @@
<footer> <footer>
<p> <p>
{{ _('Powered by') }} <a href="{{ url_for('info', pagename='about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, hackable metasearch engine') }}<br/> {{ _('Powered by') }} <a href="{{ url_for('info', pagename='about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, hackable metasearch engine') }}<br/>
<a href="{{ searx_git_url }}">{{ _('Source code') }}</a> | <a href="{{ searx_git_url }}">{{ _('Source code') }}</a>
<a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> | | <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a>
<a href="{{ url_for('stats') }}">{{ _('Engine stats') }}</a> {% if enable_metrics %}| <a href="{{ url_for('stats') }}">{{ _('Engine stats') }}</a>{% endif %}
{% if get_setting('brand.public_instances') %} {% if get_setting('brand.public_instances') %}
| <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a> | <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>
{% endif %} {% endif %}

View File

@ -42,7 +42,7 @@
{%- macro result_sub_footer(result, proxify) -%} {%- macro result_sub_footer(result, proxify) -%}
<div class="engines"> <div class="engines">
{% for engine in result.engines %}<span>{{ engine }}</span>{% endfor %} {% for engine in result.engines %}<span>{{ engine }}</span>{% endfor %}
{{ result_link("https://web.archive.org/web/" + result.url, icon_small('ellipsis-vertical-outline') + _('cached'), "cache_link") }}&lrm; {% if proxify and proxify_results %} {{ result_link(proxify(result.url), icon('link') + _('proxied'), "proxyfied_link") }} {% endif %} {{ result_link(cache_url + result.url, icon_small('ellipsis-vertical-outline') + _('cached'), "cache_link") }}&lrm; {% if proxify and proxify_results %} {{ result_link(proxify(result.url), icon('link') + _('proxied'), "proxyfied_link") }} {% endif %}
</div>{{- '' -}} </div>{{- '' -}}
<div class="break"></div>{{- '' -}} <div class="break"></div>{{- '' -}}
{%- endmacro -%} {%- endmacro -%}

View File

@ -310,9 +310,9 @@
<th>{{ _("Supports selected language") }}</th>{{- "" -}} <th>{{ _("Supports selected language") }}</th>{{- "" -}}
<th>{{ _("SafeSearch") }}</th>{{- "" -}} <th>{{ _("SafeSearch") }}</th>{{- "" -}}
<th>{{ _("Time range") }}</th>{{- "" -}} <th>{{ _("Time range") }}</th>{{- "" -}}
<th>{{ _("Response time") }}</th>{{- "" -}} {%- if enable_metrics %}<th>{{ _("Response time") }}</th>{% endif -%}
<th>{{ _("Max time") }}</th>{{- "" -}} <th>{{ _("Max time") }}</th>{{- "" -}}
<th>{{ _("Reliability") }}</th>{{- "" -}} {%- if enable_metrics %}<th>{{ _("Reliability") }}</th>{% endif -%}
</tr> </tr>
{% for group, engines in engines_by_category[categ] | group_engines_in_tab %} {% for group, engines in engines_by_category[categ] | group_engines_in_tab %}
{% if loop.length > 1 %} {% if loop.length > 1 %}
@ -336,9 +336,9 @@
<td>{{ checkbox(None, supports[search_engine.name]['supports_selected_language'], true) }}</td>{{- "" -}} <td>{{ checkbox(None, supports[search_engine.name]['supports_selected_language'], true) }}</td>{{- "" -}}
<td>{{ checkbox(None, supports[search_engine.name]['safesearch'], true) }}</td>{{- "" -}} <td>{{ checkbox(None, supports[search_engine.name]['safesearch'], true) }}</td>{{- "" -}}
<td>{{ checkbox(None, supports[search_engine.name]['time_range_support'], true) }}</td>{{- "" -}} <td>{{ checkbox(None, supports[search_engine.name]['time_range_support'], true) }}</td>{{- "" -}}
{{- engine_time(search_engine.name) -}} {%- if enable_metrics %}{{- engine_time(search_engine.name) -}}{% endif -%}
<td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>{{- "" -}} <td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>{{- "" -}}
{{ engine_reliability(search_engine.name) -}} {%- if enable_metrics %}{{ engine_reliability(search_engine.name) -}}{% endif -%}
</tr> </tr>
{% endif %} {% endif %}
{% endfor %} {% endfor %}

View File

@ -33,10 +33,7 @@
<td class="engine-name"><a href="{{ url_for('stats', engine=engine_stat.name|e) }}">{{ engine_stat.name }}</a></td> <td class="engine-name"><a href="{{ url_for('stats', engine=engine_stat.name|e) }}">{{ engine_stat.name }}</a></td>
<td class="engine-score"> <td class="engine-score">
{% if engine_stat.score %} {% if engine_stat.score %}
<span aria-labelledby="{{engine_stat.name}}_score" >{{ engine_stat.score|round(1) }}</span> <span>{{ engine_stat.score_per_result|round(1) }}</span>
<div class="engine-tooltip" role="tooltip" id="{{engine_stat.name}}_score">{{- "" -}}
<p>{{ _('Scores per result') }}: {{ engine_stat.score_per_result | round(3) }}</p>
</div>
{% endif %} {% endif %}
</td> </td>
<td class="engine-result-count"> <td class="engine-result-count">

View File

@ -145,7 +145,7 @@ result_templates = get_result_templates(templates_path)
STATS_SORT_PARAMETERS = { STATS_SORT_PARAMETERS = {
'name': (False, 'name', ''), 'name': (False, 'name', ''),
'score': (True, 'score', 0), 'score': (True, 'score_per_result', 0),
'result_count': (True, 'result_count', 0), 'result_count': (True, 'result_count', 0),
'time': (False, 'total', 0), 'time': (False, 'total', 0),
'reliability': (False, 'reliability', 100), 'reliability': (False, 'reliability', 100),
@ -450,6 +450,7 @@ def render(template_name: str, **kwargs):
kwargs['instance_name'] = get_setting('general.instance_name') kwargs['instance_name'] = get_setting('general.instance_name')
kwargs['searx_version'] = VERSION_STRING kwargs['searx_version'] = VERSION_STRING
kwargs['searx_git_url'] = GIT_URL kwargs['searx_git_url'] = GIT_URL
kwargs['enable_metrics'] = get_setting('general.enable_metrics')
kwargs['get_setting'] = get_setting kwargs['get_setting'] = get_setting
kwargs['get_pretty_url'] = get_pretty_url kwargs['get_pretty_url'] = get_pretty_url
@ -464,6 +465,7 @@ def render(template_name: str, **kwargs):
kwargs['image_proxify'] = image_proxify kwargs['image_proxify'] = image_proxify
kwargs['proxify'] = morty_proxify if settings['result_proxy']['url'] is not None else None kwargs['proxify'] = morty_proxify if settings['result_proxy']['url'] is not None else None
kwargs['proxify_results'] = settings['result_proxy']['proxify_results'] kwargs['proxify_results'] = settings['result_proxy']['proxify_results']
kwargs['cache_url'] = settings['ui']['cache_url']
kwargs['get_result_template'] = get_result_template kwargs['get_result_template'] = get_result_template
kwargs['opensearch_url'] = ( kwargs['opensearch_url'] = (
url_for('opensearch') url_for('opensearch')