diff --git a/wikipedia/challenges/default.json b/wikipedia/challenges/default.json index 87756947b..77c5f74bc 100644 --- a/wikipedia/challenges/default.json +++ b/wikipedia/challenges/default.json @@ -55,6 +55,80 @@ "time-period": {{ application_search_time_period | default(300) | int }}, "warmup-time-period": {{ application_search_warmup_time_period | default(10) | int }} }, + { + "name":"update-query-rules-settings", + "tags": ["setup"], + "operation": { + "operation-type": "raw-request", + "method": "PUT", + "path": "/_cluster/settings", + "body": { + "persistent": { + "xpack.applications.rules.max_rules_per_ruleset" : 1000 + } + }, + "include-in-reporting": false + } + }, + { + "name": "create-query-ruleset-1", + "operation": "create-query-ruleset-1", + "ruleset_id": "ruleset_1", + "ruleset_size": 1 + }, + { + "name": "create-query-ruleset-10", + "operation": "create-query-ruleset-10", + "ruleset_id": "ruleset_10", + "ruleset_size": 10 + }, + { + "name": "create-query-ruleset-100", + "operation": "create-query-ruleset-100", + "ruleset_id": "ruleset_100", + "ruleset_size": 100 + }, + { + "name": "create-query-ruleset-1000", + "operation": "create-query-ruleset-1000", + "ruleset_id": "ruleset_1000", + "ruleset_size": 1000 + }, + { + "name": "query-rules-search-1", + "operation": "query-rules-search-1", + "clients": {{ application_search_clients | default(20) | int }}, + "time-period": {{ application_search_time_period | default(300) | int }}, + "warmup-time-period": {{ application_search_warmup_time_period | default(10) | int }} + }, + { + "name": "query-rules-search-10", + "operation": "query-rules-search-10", + "clients": {{ application_search_clients | default(20) | int }}, + "time-period": {{ application_search_time_period | default(300) | int }}, + "warmup-time-period": {{ application_search_warmup_time_period | default(10) | int }} + }, + { + "name": "query-rules-search-100", + "operation": "query-rules-search-100", + "clients": {{ application_search_clients | default(20) | int }}, + "time-period": {{ application_search_time_period | default(300) | int }}, + "warmup-time-period": {{ application_search_warmup_time_period | default(10) | int }} + }, + { + "name": "query-rules-search-1000", + "operation": "query-rules-search-1000", + "clients": {{ application_search_clients | default(20) | int }}, + "time-period": {{ application_search_time_period | default(300) | int }}, + "warmup-time-period": {{ application_search_warmup_time_period | default(10) | int }} + }, + { + "name": "pinned-search", + "operation": "pinned-search", + "clients": {{ application_search_clients | default(20) | int }}, + "time-period": {{ application_search_time_period | default(300) | int }}, + "warmup-time-period": {{ application_search_warmup_time_period | default(10) | int }} + }, { "parallel": { "completed-by": "parallel-documents-indexing-query-string-search", diff --git a/wikipedia/operations/default.json b/wikipedia/operations/default.json index 1fe8cd223..2cf069a1f 100644 --- a/wikipedia/operations/default.json +++ b/wikipedia/operations/default.json @@ -69,6 +69,77 @@ "operation-type": "raw-request", "param-source": "search-application-search-param-source" }, +{ + "name": "create-query-ruleset-1", + "operation-type": "raw-request", + "param-source": "create-query-ruleset-param-source", + "include-in-reporting": false, + "ruleset_id": "ruleset_1", + "ruleset_size": 1 +}, +{ + "name": "create-query-ruleset-10", + "operation-type": "raw-request", + "param-source": "create-query-ruleset-param-source", + "include-in-reporting": false, + "ruleset_id": "ruleset_10", + "ruleset_size": 10 +}, +{ + "name": "create-query-ruleset-100", + "operation-type": "raw-request", + "param-source": "create-query-ruleset-param-source", + "include-in-reporting": false, + "ruleset_id": "ruleset_100", + "ruleset_size": 100 +}, +{ + "name": "create-query-ruleset-1000", + "operation-type": "raw-request", + "param-source": "create-query-ruleset-param-source", + "include-in-reporting": false, + "ruleset_id": "ruleset_1000", + "ruleset_size": 1000 +}, +{ + "name": "query-rules-search-1", + "operation-type": "raw-request", + "param-source": "query-rules-search-param-source", + "size" : {{ query_string_search_page_size | default(20) | int }}, + "search-fields" : "{{ query_string_search_fields | default("*") }}", + "ruleset_id": "ruleset_1" +}, +{ + "name": "query-rules-search-10", + "operation-type": "raw-request", + "param-source": "query-rules-search-param-source", + "size" : {{ query_string_search_page_size | default(20) | int }}, + "search-fields" : "{{ query_string_search_fields | default("*") }}", + "ruleset_id": "ruleset_10" +}, +{ + "name": "query-rules-search-100", + "operation-type": "raw-request", + "param-source": "query-rules-search-param-source", + "size" : {{ query_string_search_page_size | default(20) | int }}, + "search-fields" : "{{ query_string_search_fields | default("*") }}", + "ruleset_id": "ruleset_100" +}, +{ + "name": "query-rules-search-1000", + "operation-type": "raw-request", + "param-source": "query-rules-search-param-source", + "size" : {{ query_string_search_page_size | default(20) | int }}, + "search-fields" : "{{ query_string_search_fields | default("*") }}", + "ruleset_id": "ruleset_1000" +}, +{ + "name": "pinned-search", + "operation-type": "raw-request", + "param-source": "pinned-search-param-source", + "size" : {{ query_string_search_page_size | default(20) | int }}, + "search-fields" : "{{ query_string_search_fields | default("*") }}" +}, { "name": "query-string-search", "operation-type": "search", diff --git a/wikipedia/track.py b/wikipedia/track.py index ca5808c96..8fc99e96b 100644 --- a/wikipedia/track.py +++ b/wikipedia/track.py @@ -12,6 +12,7 @@ QUERIES_FILENAME: str = f"{QUERIES_DIRNAME}/queries.csv" SEARCH_APPLICATION_ROOT_ENDPOINT: str = "/_application/search_application" +QUERY_RULES_ENDPOINT: str = "/_query_rules" QUERY_CLEAN_REXEXP = regexp = re.compile("[^0-9a-zA-Z]+") @@ -51,6 +52,13 @@ def params(self): } +class QueryRulesetParams: + def __init__(self, track, params): + self.indices = params.get("indices", track.index_names()) + self.ruleset_id = params.get("ruleset_id") + self.ruleset_size = params.get("ruleset_size") + + class QueryIteratorParamSource(ParamSource): def __init__(self, track, params, **kwargs): super().__init__(track, params, **kwargs) @@ -113,7 +121,87 @@ def params(self): return self.params() +class CreateQueryRulesetParamSource(ParamSource): + def __init__(self, track, params, **kwargs): + super().__init__(track, params, **kwargs) + self.query_ruleset_params = QueryRulesetParams(track, params) + + def partition(self, partition_index, total_partitions): + return self + + def params(self): + rules = [] + for i in range(self.query_ruleset_params.ruleset_size): + # Note: `AccessibleComputing` is one of the _ids indexed in the dataset + rule = { + "rule_id": "rule_{{i}}", + "type": "pinned", + "criteria": [{"type": "exact", "metadata": "rule_key", "values": [random.choice(["match", "no-match"])]}], + "actions": {"ids": [random.choice(["AccessibleComputing", "pinned-miss"])]}, + } + rules.append(rule) + + return {"method": "PUT", "path": f"{QUERY_RULES_ENDPOINT}/{self.query_ruleset_params.ruleset_id}", "body": {"rules": rules}} + + +class QueryRulesSearchParamSource(QueryIteratorParamSource): + def __init__(self, track, params, **kwargs): + super().__init__(track, params, **kwargs) + self.query_ruleset_params = QueryRulesetParams(track, params) + + def params(self): + try: + query = next(self._queries_iterator) + # TODO Update this to use current syntax with 8.15.0+ + return { + "method": "POST", + "path": "/_search", + "body": { + "query": { + "rule": { + "match_criteria": {"rule_key": random.choice(["match", "no-match"])}, + "ruleset_ids": [self.query_ruleset_params.ruleset_id], + "organic": {"query_string": {"query": query, "default_field": self._params["search-fields"]}}, + } + }, + "size": self._params["size"], + }, + } + except StopIteration: + self._queries_iterator = iter(self._sample_queries) + return self.params() + + +class PinnedSearchParamSource(QueryIteratorParamSource): + def __init__(self, track, params, **kwargs): + super().__init__(track, params, **kwargs) + self.query_ruleset_params = QueryRulesetParams(track, params) + + def params(self): + try: + query = next(self._queries_iterator) + return { + "method": "POST", + "path": "/_search", + "body": { + "query": { + "pinned": { + "organic": {"query_string": {"query": query, "default_field": self._params["search-fields"]}}, + "ids": [random.choice(["AccessibleComputing", "pinned-miss"])], + } + }, + "size": self._params["size"], + }, + } + except StopIteration: + self._queries_iterator = iter(self._sample_queries) + return self.params() + + def register(registry): registry.register_param_source("query-string-search", QueryParamSource) registry.register_param_source("create-search-application-param-source", CreateSearchApplicationParamSource) registry.register_param_source("search-application-search-param-source", SearchApplicationSearchParamSource) + registry.register_param_source("create-query-ruleset-param-source", CreateQueryRulesetParamSource) + registry.register_param_source("query-rules-search-param-source", QueryRulesSearchParamSource) + registry.register_param_source("pinned-search-param-source", PinnedSearchParamSource)