Add time_range filter to Research Bridge API and optimize SearXNG config for news
This commit is contained in:
@@ -18,28 +18,81 @@ search:
|
|||||||
- json
|
- json
|
||||||
|
|
||||||
engines:
|
engines:
|
||||||
|
# === General Search ===
|
||||||
- name: google
|
- name: google
|
||||||
engine: google
|
engine: google
|
||||||
shortcut: go
|
shortcut: go
|
||||||
disabled: false
|
disabled: false
|
||||||
|
weight: 1.0
|
||||||
|
|
||||||
- name: bing
|
- name: bing
|
||||||
engine: bing
|
engine: bing
|
||||||
shortcut: bi
|
shortcut: bi
|
||||||
disabled: false
|
disabled: false
|
||||||
|
weight: 1.0
|
||||||
|
|
||||||
- name: duckduckgo
|
- name: duckduckgo
|
||||||
engine: duckduckgo
|
engine: duckduckgo
|
||||||
shortcut: ddg
|
shortcut: ddg
|
||||||
disabled: false
|
disabled: false
|
||||||
|
weight: 0.8
|
||||||
|
|
||||||
|
# === News Engines ===
|
||||||
- name: google news
|
- name: google news
|
||||||
engine: google_news
|
engine: google_news
|
||||||
shortcut: gon
|
shortcut: gon
|
||||||
disabled: false
|
disabled: false
|
||||||
|
weight: 2.0
|
||||||
|
|
||||||
|
- name: bing news
|
||||||
|
engine: bing_news
|
||||||
|
shortcut: bin
|
||||||
|
disabled: false
|
||||||
|
weight: 2.0
|
||||||
|
|
||||||
|
- name: hackernews
|
||||||
|
engine: hackernews
|
||||||
|
shortcut: hn
|
||||||
|
disabled: false
|
||||||
|
weight: 1.5
|
||||||
|
|
||||||
|
# === Tech News ===
|
||||||
|
- name: arstechnica
|
||||||
|
engine: arstechnica
|
||||||
|
shortcut: ars
|
||||||
|
disabled: false
|
||||||
|
weight: 1.5
|
||||||
|
|
||||||
|
- name: wired
|
||||||
|
engine: wired
|
||||||
|
shortcut: wir
|
||||||
|
disabled: false
|
||||||
|
weight: 1.5
|
||||||
|
|
||||||
|
# === Q&A / Discussion ===
|
||||||
|
- name: reddit
|
||||||
|
engine: reddit
|
||||||
|
shortcut: re
|
||||||
|
disabled: false
|
||||||
|
weight: 1.2
|
||||||
|
|
||||||
|
# Block unwanted sites (dictionaries, etc.)
|
||||||
|
engines:
|
||||||
|
- name: google
|
||||||
|
engine: google
|
||||||
|
disabled: false
|
||||||
|
url_xpath: //
|
||||||
|
|
||||||
|
# Blocklist für unerwünschte Domains
|
||||||
|
# Auskommentiert da SearXNG keine native Blocklist hat
|
||||||
|
# Workaround: Zeit-Parameter in Queries nutzen
|
||||||
|
|
||||||
ui:
|
ui:
|
||||||
static_path: ""
|
static_static_path: ""
|
||||||
templates_path: ""
|
templates_path: ""
|
||||||
default_theme: simple
|
default_theme: simple
|
||||||
query_in_title: true
|
query_in_title: true
|
||||||
|
|
||||||
|
# Time range preference (for news queries)
|
||||||
|
# Note: Used by engines that support it (google, bing, etc.)
|
||||||
|
# Valid values: day, week, month, year
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ async def search(
|
|||||||
default=["google", "bing", "duckduckgo"],
|
default=["google", "bing", "duckduckgo"],
|
||||||
description="Search engines to use"
|
description="Search engines to use"
|
||||||
),
|
),
|
||||||
page: int = Query(default=1, ge=1, description="Page number")
|
page: int = Query(default=1, ge=1, description="Page number"),
|
||||||
|
time_range: str | None = Query(default=None, pattern="^(day|week|month|year)$", description="Time filter (day, week, month, year)")
|
||||||
) -> SearchResponse:
|
) -> SearchResponse:
|
||||||
"""Search via SearXNG (passthrough).
|
"""Search via SearXNG (passthrough).
|
||||||
|
|
||||||
@@ -61,6 +62,7 @@ async def search(
|
|||||||
q: Search query string
|
q: Search query string
|
||||||
engines: List of search engines
|
engines: List of search engines
|
||||||
page: Page number
|
page: Page number
|
||||||
|
time_range: Optional time filter
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
SearchResponse with results
|
SearchResponse with results
|
||||||
@@ -69,7 +71,7 @@ async def search(
|
|||||||
|
|
||||||
async with SearXNGClient(base_url=SEARXNG_URL) as client:
|
async with SearXNGClient(base_url=SEARXNG_URL) as client:
|
||||||
try:
|
try:
|
||||||
return await client.search(request)
|
return await client.search(request, time_range=time_range)
|
||||||
except SearXNGError as e:
|
except SearXNGError as e:
|
||||||
raise HTTPException(status_code=502, detail=str(e))
|
raise HTTPException(status_code=502, detail=str(e))
|
||||||
|
|
||||||
@@ -120,10 +122,10 @@ async def research(request: ResearchRequest) -> ResearchResponse:
|
|||||||
page=1
|
page=1
|
||||||
)
|
)
|
||||||
|
|
||||||
# Execute search
|
# Execute search with time_range if specified
|
||||||
async with SearXNGClient(base_url=SEARXNG_URL) as client:
|
async with SearXNGClient(base_url=SEARXNG_URL) as client:
|
||||||
try:
|
try:
|
||||||
search_response = await client.search(search_request)
|
search_response = await client.search(search_request, time_range=request.time_range)
|
||||||
except SearXNGError as e:
|
except SearXNGError as e:
|
||||||
raise HTTPException(status_code=502, detail=str(e))
|
raise HTTPException(status_code=502, detail=str(e))
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class ResearchRequest(BaseModel):
|
|||||||
sources: list[str] = Field(default=["web"])
|
sources: list[str] = Field(default=["web"])
|
||||||
language: str = Field(default="en", pattern="^[a-z]{2}$")
|
language: str = Field(default="en", pattern="^[a-z]{2}$")
|
||||||
omit_raw: bool = Field(default=False)
|
omit_raw: bool = Field(default=False)
|
||||||
|
time_range: str | None = Field(default=None, pattern="^(day|week|month|year)$", description="Time filter for search results")
|
||||||
|
|
||||||
|
|
||||||
class Source(BaseModel):
|
class Source(BaseModel):
|
||||||
|
|||||||
@@ -59,11 +59,12 @@ class SearXNGClient:
|
|||||||
query_string = "&".join(query_parts)
|
query_string = "&".join(query_parts)
|
||||||
return f"{self.base_url}/search?{query_string}"
|
return f"{self.base_url}/search?{query_string}"
|
||||||
|
|
||||||
async def search(self, request: SearchRequest) -> SearchResponse:
|
async def search(self, request: SearchRequest, time_range: str | None = None) -> SearchResponse:
|
||||||
"""Execute search query against SearXNG.
|
"""Execute search query against SearXNG.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
request: SearchRequest with query, engines, page
|
request: SearchRequest with query, engines, page
|
||||||
|
time_range: Optional time filter (day, week, month, year)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
SearchResponse with results
|
SearchResponse with results
|
||||||
@@ -77,6 +78,10 @@ class SearXNGClient:
|
|||||||
"engines": ",".join(request.engines),
|
"engines": ",".join(request.engines),
|
||||||
"pageno": request.page,
|
"pageno": request.page,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Add time_range if specified (SearXNG supports: day, week, month, year)
|
||||||
|
if time_range:
|
||||||
|
params["time_range"] = time_range
|
||||||
|
|
||||||
url = self._build_url(params)
|
url = self._build_url(params)
|
||||||
client = self._get_client()
|
client = self._get_client()
|
||||||
|
|||||||
Reference in New Issue
Block a user