.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
searx.search.Search Class Reference
+ Inheritance diagram for searx.search.Search:

Public Member Functions

 __init__ (self, SearchQuery search_query)
 
 search_external_bang (self)
 
 search_answerers (self)
 
 search_multiple_requests (self, requests)
 
 search_standard (self)
 
ResultContainer search (self)
 

Public Attributes

 search_query = search_query
 
 result_container = ResultContainer()
 
 start_time = None
 
 actual_timeout = None
 

Protected Member Functions

 _get_requests (self)
 

Static Private Attributes

str __slots__ = "search_query", "result_container", "start_time", "actual_timeout"
 

Detailed Description

Search information container

Definition at line 44 of file __init__.py.

Constructor & Destructor Documentation

◆ __init__()

searx.search.Search.__init__ ( self,
SearchQuery search_query )
Initialize the Search

Definition at line 49 of file __init__.py.

49 def __init__(self, search_query: SearchQuery):
50 """Initialize the Search"""
51 # init vars
52 super().__init__()
53 self.search_query = search_query
54 self.result_container = ResultContainer()
55 self.start_time = None
56 self.actual_timeout = None
57

Member Function Documentation

◆ _get_requests()

searx.search.Search._get_requests ( self)
protected

Definition at line 79 of file __init__.py.

79 def _get_requests(self):
80 # init vars
81 requests = []
82
83 # max of all selected engine timeout
84 default_timeout = 0
85
86 # start search-request for all selected engines
87 for engineref in self.search_query.engineref_list:
88 processor = PROCESSORS[engineref.name]
89
90 # stop the request now if the engine is suspend
91 if processor.extend_container_if_suspended(self.result_container):
92 continue
93
94 # set default request parameters
95 request_params = processor.get_params(self.search_query, engineref.category)
96 if request_params is None:
97 continue
98
99 counter_inc('engine', engineref.name, 'search', 'count', 'sent')
100
101 # append request to list
102 requests.append((engineref.name, self.search_query.query, request_params))
103
104 # update default_timeout
105 default_timeout = max(default_timeout, processor.engine.timeout)
106
107 # adjust timeout
108 max_request_timeout = settings['outgoing']['max_request_timeout']
109 actual_timeout = default_timeout
110 query_timeout = self.search_query.timeout_limit
111
112 if max_request_timeout is None and query_timeout is None:
113 # No max, no user query: default_timeout
114 pass
115 elif max_request_timeout is None and query_timeout is not None:
116 # No max, but user query: From user query except if above default
117 actual_timeout = min(default_timeout, query_timeout)
118 elif max_request_timeout is not None and query_timeout is None:
119 # Max, no user query: Default except if above max
120 actual_timeout = min(default_timeout, max_request_timeout)
121 elif max_request_timeout is not None and query_timeout is not None:
122 # Max & user query: From user query except if above max
123 actual_timeout = min(query_timeout, max_request_timeout)
124
125 logger.debug(
126 "actual_timeout={0} (default_timeout={1}, ?timeout_limit={2}, max_request_timeout={3})".format(
127 actual_timeout, default_timeout, query_timeout, max_request_timeout
128 )
129 )
130
131 return requests, actual_timeout
132

◆ search()

ResultContainer searx.search.Search.search ( self)

Reimplemented in searx.search.SearchWithPlugins.

Definition at line 171 of file __init__.py.

171 def search(self) -> ResultContainer:
172 self.start_time = default_timer()
173 if not self.search_external_bang():
174 if not self.search_answerers():
175 self.search_standard()
176 return self.result_container
177
178

◆ search_answerers()

searx.search.Search.search_answerers ( self)

Definition at line 72 of file __init__.py.

72 def search_answerers(self):
73
74 results = searx.answerers.STORAGE.ask(self.search_query.query)
75 self.result_container.extend(None, results)
76 return bool(results)
77

◆ search_external_bang()

searx.search.Search.search_external_bang ( self)
Check if there is a external bang.
If yes, update self.result_container and return True

Definition at line 58 of file __init__.py.

58 def search_external_bang(self):
59 """
60 Check if there is a external bang.
61 If yes, update self.result_container and return True
62 """
63 if self.search_query.external_bang:
64 self.result_container.redirect_url = get_bang_url(self.search_query)
65
66 # This means there was a valid bang and the
67 # rest of the search does not need to be continued
68 if isinstance(self.result_container.redirect_url, str):
69 return True
70 return False
71

◆ search_multiple_requests()

searx.search.Search.search_multiple_requests ( self,
requests )

Definition at line 133 of file __init__.py.

133 def search_multiple_requests(self, requests):
134 # pylint: disable=protected-access
135 search_id = str(uuid4())
136
137 for engine_name, query, request_params in requests:
138 _search = copy_current_request_context(PROCESSORS[engine_name].search)
139 th = threading.Thread( # pylint: disable=invalid-name
140 target=_search,
141 args=(query, request_params, self.result_container, self.start_time, self.actual_timeout),
142 name=search_id,
143 )
144 th._timeout = False
145 th._engine_name = engine_name
146 th.start()
147
148 for th in threading.enumerate(): # pylint: disable=invalid-name
149 if th.name == search_id:
150 remaining_time = max(0.0, self.actual_timeout - (default_timer() - self.start_time))
151 th.join(remaining_time)
152 if th.is_alive():
153 th._timeout = True
154 self.result_container.add_unresponsive_engine(th._engine_name, 'timeout')
155 PROCESSORS[th._engine_name].logger.error('engine timeout')
156

◆ search_standard()

searx.search.Search.search_standard ( self)
Update self.result_container, self.actual_timeout

Definition at line 157 of file __init__.py.

157 def search_standard(self):
158 """
159 Update self.result_container, self.actual_timeout
160 """
161 requests, self.actual_timeout = self._get_requests()
162
163 # send all search-request
164 if requests:
165 self.search_multiple_requests(requests)
166
167 # return results, suggestions, answers and infoboxes
168 return True
169

Member Data Documentation

◆ __slots__

str searx.search.Search.__slots__ = "search_query", "result_container", "start_time", "actual_timeout"
staticprivate

Definition at line 47 of file __init__.py.

◆ actual_timeout

searx.search.Search.actual_timeout = None

Definition at line 56 of file __init__.py.

◆ result_container

◆ search_query

searx.search.Search.search_query = search_query

◆ start_time

searx.search.Search.start_time = None

Definition at line 55 of file __init__.py.


The documentation for this class was generated from the following file: