mirror of https://github.com/searx/searx
Add search operators plugin (#3311)
## What does this PR do? This PR adds search operator plugin to searx. By default it is disabled because it removes results from your result set. Thus, you might end up with an empty result page with the additional filtering. ## Why is this change important? With all of its shortcomings, still is a nifty plugin. ## How to test this PR locally? ``` batman -site:imdb.com ``` Co-authored-by: DiamondDemon669 <62653580+DiamondDemon669@users.noreply.github.com>
This commit is contained in:
parent
3e0c39eafa
commit
a825690804
|
@ -34,6 +34,7 @@ from searx.plugins import (oa_doi_rewrite,
|
|||
self_info,
|
||||
hostname_replace,
|
||||
search_on_category_select,
|
||||
search_operators,
|
||||
tracker_url_remover,
|
||||
vim_hotkeys)
|
||||
|
||||
|
@ -171,8 +172,10 @@ plugins.register(infinite_scroll)
|
|||
plugins.register(self_info)
|
||||
plugins.register(hostname_replace)
|
||||
plugins.register(search_on_category_select)
|
||||
plugins.register(search_operators)
|
||||
plugins.register(tracker_url_remover)
|
||||
plugins.register(vim_hotkeys)
|
||||
|
||||
# load external plugins
|
||||
if 'plugins' in settings:
|
||||
plugins.register(*settings['plugins'], external=True)
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
import shlex
|
||||
import string
|
||||
|
||||
from flask_babel import gettext
|
||||
|
||||
name = gettext("Search operators")
|
||||
description = gettext("""Filter results using hyphen, site: and -site:.
|
||||
Please note that you might get less results with the additional filtering.""")
|
||||
default_on = False
|
||||
|
||||
|
||||
def on_result(request, search, result):
|
||||
q = search.search_query.query
|
||||
qs = shlex.split(q)
|
||||
spitems = [x.lower() for x in qs if ' ' in x]
|
||||
mitems = [x.lower() for x in qs if x.startswith('-')]
|
||||
siteitems = [x.lower() for x in qs if x.startswith('site:')]
|
||||
msiteitems = [x.lower() for x in qs if x.startswith('-site:')]
|
||||
url, title, content = (
|
||||
result["url"].lower(),
|
||||
result["title"].lower(),
|
||||
(result.get("content").lower() if result.get("content") else '')
|
||||
)
|
||||
if all((x not in title or x not in content) for x in spitems):
|
||||
return False
|
||||
if all((x in title or x in content) for x in mitems):
|
||||
return False
|
||||
if all(x not in url for x in siteitems):
|
||||
return False
|
||||
if all(x in url for x in msiteitems):
|
||||
return False
|
||||
return True
|
Loading…
Reference in New Issue