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:
Noémi Ványi 2022-07-31 17:37:48 +02:00 committed by GitHub
parent 3e0c39eafa
commit a825690804
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 0 deletions

View File

@ -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)

View File

@ -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