From fbe4fec6562ebba85d3235d0db8fc9fcb4143373 Mon Sep 17 00:00:00 2001 From: MrTango Date: Wed, 8 Nov 2023 13:14:04 +0100 Subject: [PATCH 1/3] [ADD] connector_typesense --- connector_typesense/README.rst | 252 ++++++++ connector_typesense/__init__.py | 2 + connector_typesense/__manifest__.py | 20 + connector_typesense/models/__init__.py | 1 + connector_typesense/models/se_backend.py | 48 ++ connector_typesense/models/se_index.py | 10 + connector_typesense/readme/CHANGES.rst | 37 ++ connector_typesense/readme/CONTRIBUTORS.rst | 5 + connector_typesense/readme/DESCRIPTION.rst | 4 + connector_typesense/readme/HISTORY.rst | 36 ++ connector_typesense/readme/INSTALL.rst | 13 + connector_typesense/readme/ROADMAP.rst | 4 + connector_typesense/readme/TYPESENSE.rst | 57 ++ connector_typesense/readme/USAGE.rst | 102 +++ .../readme/newsfragments/.gitignore | 0 .../static/description/index.html | 603 ++++++++++++++++++ connector_typesense/tools/__init__.py | 1 + connector_typesense/tools/adapter.py | 257 ++++++++ connector_typesense/views/se_backend.xml | 36 ++ requirements.txt | 1 + setup/_metapackage/setup.py | 20 +- setup/connector_elasticsearch/setup.py | 2 +- setup/connector_search_engine/setup.py | 2 +- .../setup.py | 2 +- .../odoo/addons/connector_typesense | 1 + setup/connector_typesense/setup.py | 6 + setup/search_engine_image_thumbnail/setup.py | 2 +- .../setup.py | 2 +- 28 files changed, 1511 insertions(+), 15 deletions(-) create mode 100644 connector_typesense/README.rst create mode 100644 connector_typesense/__init__.py create mode 100644 connector_typesense/__manifest__.py create mode 100644 connector_typesense/models/__init__.py create mode 100644 connector_typesense/models/se_backend.py create mode 100644 connector_typesense/models/se_index.py create mode 100644 connector_typesense/readme/CHANGES.rst create mode 100644 connector_typesense/readme/CONTRIBUTORS.rst create mode 100644 connector_typesense/readme/DESCRIPTION.rst create mode 100644 connector_typesense/readme/HISTORY.rst create mode 100644 connector_typesense/readme/INSTALL.rst create mode 100644 connector_typesense/readme/ROADMAP.rst create mode 100644 connector_typesense/readme/TYPESENSE.rst create mode 100644 connector_typesense/readme/USAGE.rst create mode 100644 connector_typesense/readme/newsfragments/.gitignore create mode 100644 connector_typesense/static/description/index.html create mode 100644 connector_typesense/tools/__init__.py create mode 100644 connector_typesense/tools/adapter.py create mode 100644 connector_typesense/views/se_backend.xml create mode 120000 setup/connector_typesense/odoo/addons/connector_typesense create mode 100644 setup/connector_typesense/setup.py diff --git a/connector_typesense/README.rst b/connector_typesense/README.rst new file mode 100644 index 00000000..0e6dda87 --- /dev/null +++ b/connector_typesense/README.rst @@ -0,0 +1,252 @@ +=================== +connector_typesense +=================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f09633c3af59b153f0eba3f876a9835676c430a6f39dd0dfa3545a924c80bc11 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsearch--engine-lightgray.png?logo=github + :target: https://github.com/OCA/search-engine/tree/16.0/connector_typesense + :alt: OCA/search-engine +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/search-engine-16-0/search-engine-16-0-connector_typesense + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/search-engine&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Base module for connecting Odoo with external search engines. This addon is +intended to be used as a base for other addons that implement specific search +engines. It's designed to be easily extensible and modular. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +This addon uses the native json python package provided by python. When +a json for a record is recomputed, the new value is compared to the original +one to see if an export to the search engine index is needed. This is +done by comparing the md5 of the two json strings. This process when done on +a large number of records can be slow when the json is large and complex. To speed +up this process you can install the orjson package. + +.. code-block:: bash + + pip install orjson + +This package requires a typesense search engine running. +Please read this for a [quick docker based setup](https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting). + +Usage +===== + +Overview +~~~~~~~~ + +A search engine is a system designed to store information in a way that makes +it easy to find through search and analytics queries. The main difference +between a search engine and a database is that a search engine is optimized +for search and analytics queries, while a database is optimized for +transactional and relational queries. + +This addons is designed around 4 main concepts: + +* **The search engine backend** is used to define into Odoo the kind + of search engine that will be used to index the data. It's main responsibility + is to provide an instance of `odoo.addons.search_engine.tools.adapter.SearchEngineAdapter` + that will be used to communicate with the search engine. + +* **The search engine index** is used to define into Odoo the index where + the data will be indexed. An index is always linked to a search engine backend. + The index provides methods to use to manage the lifecycle of the data put into + the index for the records of a given model. To do so, it uses: + + * **The SearchEngineAdapter** provided by the backend to communicate with the + search engine. + * **A ModelSerializer** that is used to transform an odoo record into + a dictionary that can be indexed into the search engine. + * **A JsonValidator** that is used to validate the data that is to be + indexed into the search engine. + + The RecordSerializer and IndexDataValidator are defined on the index itself. + The current addon provides a default implementation only for the IndexDataValidator. + You can find into the github repository `search-engine `_ An implementation of the RecordSerializer based + on the jsonifier addon `connector_search_engine_jsonifier`. + +* **The search engine indexable record** is a mixin that is used to define + the records that can be indexed into a search engine index. The mixin + provides methods: + + * To add a record to an index. + * To remove a record from an index. + * To mark the record into an index (*the search engine bindings*) as to be + recomputed (This method should be called when modifications are made on + the record that could impact the data that are indexed into the search + engine. It will instruct the index that the record must be recomputed and + re-indexed). + + It also ensures that when the record is unlinked, it is removed from the indexes + it was indexed into. + +* **The search engine binding** is a model that represents the link between + an index and an indexable odoo record. It give you access to the data + that are indexed into the search engine for the record. It's also used to + manage the lifecycle of the data into the search engine. When a binding is + created, it's marked as to be computed. Once the data are computed, the + binding is marked as to be indexed. Once the data are indexed, the binding + is marked as indexed. If the linked record is unlinked, the binding is + marked as to be removed. Once the data are removed from the search engine, + the binding is deleted. + +Indexing lifecycle +~~~~~~~~~~~~~~~~~~ + +The indexing lifecycle is based on the following steps: + +* When a record is added to an index, a binding is created and marked as to be + computed. +* A cron job scheduled every 5 minutes will look for bindings that are to be + computed and for each of them will schedule a job to re compute the json data. +* When the json data is computed, the binding is marked as to be exported if the + json is valid and is different from the one that has been computed last time. +* A cron job scheduled every 5 minutes will ensure the syncing with the search + engine. It will: + + * look for bindings that are to be exported and for each of them will schedule + a job to export the json data into the search engine. Once exported, the + binding is marked as 'done'. + * look for bindings that are to be removed and for each of them will schedule + a job to remove the data from the search engine. Once removed, the binding + is deleted. + +To keep in sync the data from your model instance and the data that are indexed +into the search engine, you should call the method `_se_mark_to_update` on the +mode instance when you make modifications that could impact the data that are +indexed into the search engine. + +* When the method `_se_mark_to_update` is called, the binding is marked as to be + computed. +* From there, the same process as described above will be used to recompute the + data and reindex them into the search engine. + +When a model instance is unlinked, the binding is marked as to be removed. From +there if will be processed by the job syncing the data with the search engine. + +.. note:: + + In previous versions of this addon, there was no method to mark a record as + to be recomputed. As a consequence, all the records were re-computed every day + to ensure that the data in the search engine were up to date. This was a + performance issue and consumed a lot of resources. If despite this, you want + to recompute all the records every day, you can activate the cron jon + `Search engine: recompute all index` and deactivate the one named + `earch engine: Generate job for recompute binding to recompute per index`. + +Known issues / Roadmap +====================== + +* Implement generic trigger for binding + based on ir.export linked to the index + (the aim is to set the binding to be updated + if we modify a field configured in the exporter) + +Changelog +========= + +16.0.0.1.1 (2023-10-13) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Bugfixes** + +- Fixes cache issue with the *se_binding_ids* field on the *s.indexable.record* + model. When a binding is created or updated or deleted, the cache for the + *se_binding_ids* field for referenced records is now invalidated. That way, + the next time the field is accessed after such an operation, the value is + recomputed to reflect the change. (`#163 `_) + + +16.0.0.1.0 (2023-10-13) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Features** + +- A new action **Update state** is now available on *Search Engine Record* objects. + This action allows you to update the state of selected records on the tree view. + + Add a smart button to quickly access to the bound records from the + *Search Engine Backend* and *Search Engine Record* views. (`#162 `__) + + +**Bugfixes** + +- Fix Search Engine Binding form view. The fields data and error are now + properly displayed and fit the width of the form. + + Makes the Odoo's admin user a member of the *Search Engine Connector Manager* group. (`#162 `__) + + +12.0.x.y.z (YYYY-MM-DD) +~~~~~~~~~~~~~~~~~~~~~~~ + +TODO + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Derico + +Contributors +~~~~~~~~~~~~ + +* Sébastien BEAU +* Laurent Mignon +* Simone Orsi +* Raphaël Reverdy + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/search-engine `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/connector_typesense/__init__.py b/connector_typesense/__init__.py new file mode 100644 index 00000000..738a2eec --- /dev/null +++ b/connector_typesense/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import tools diff --git a/connector_typesense/__manifest__.py b/connector_typesense/__manifest__.py new file mode 100644 index 00000000..778ec3b0 --- /dev/null +++ b/connector_typesense/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Derico +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "connector_typesense", + "category": "Connector", + "summary": "Connector For Typesense Search Engine", + "version": "16.0.0.0.2", + "license": "AGPL-3", + "author": "Derico, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/search-engine", + "depends": ["connector_search_engine"], + "data": [ + "views/se_backend.xml", + ], + # "demo": ["demo/backend_demo.xml"], + # TODO: Get latest improvements from elasticsearch library + "external_dependencies": {"python": ["typesense", "requests"]}, + "installable": True, +} diff --git a/connector_typesense/models/__init__.py b/connector_typesense/models/__init__.py new file mode 100644 index 00000000..b4cddc58 --- /dev/null +++ b/connector_typesense/models/__init__.py @@ -0,0 +1 @@ +from . import se_backend, se_index diff --git a/connector_typesense/models/se_backend.py b/connector_typesense/models/se_backend.py new file mode 100644 index 00000000..c6ec0e6f --- /dev/null +++ b/connector_typesense/models/se_backend.py @@ -0,0 +1,48 @@ +# Copyright 2024 Derico +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +from ..tools.adapter import TypesenseAdapter + + +class SeBackend(models.Model): + _inherit = "se.backend" + + backend_type = fields.Selection( + selection_add=[("typesense", "Typesense")], + ondelete={"typesense": "cascade"}, + string="Type", + required=True, + ) + ts_server_host = fields.Char( + string="Typesense host", + groups="connector_search_engine.group_connector_search_engine_manager", + ) + ts_server_port = fields.Char( + string="Typesense port", + groups="connector_search_engine.group_connector_search_engine_manager", + ) + ts_server_protocol = fields.Char( + string="Typesense protocol", + groups="connector_search_engine.group_connector_search_engine_manager", + ) + ts_server_timeout = fields.Integer( + string="Typesense server timeout", + groups="connector_search_engine.group_connector_search_engine_manager", + ) + api_key_id = fields.Char( + help="Typesense Api Key ID", + string="Api Key ID", + groups="connector_search_engine.group_connector_search_engine_manager", + ) + api_key = fields.Char( + help="Typesense Api Key", + groups="connector_search_engine.group_connector_search_engine_manager", + ) + + def _get_adapter_class(self): + if self.backend_type == "typesense": + return TypesenseAdapter + else: + return super()._get_adapter_class() diff --git a/connector_typesense/models/se_index.py b/connector_typesense/models/se_index.py new file mode 100644 index 00000000..f5a398a1 --- /dev/null +++ b/connector_typesense/models/se_index.py @@ -0,0 +1,10 @@ +# Copyright 2024 Derico +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class SeIndex(models.Model): + + _inherit = "se.index" diff --git a/connector_typesense/readme/CHANGES.rst b/connector_typesense/readme/CHANGES.rst new file mode 100644 index 00000000..ec3fd05c --- /dev/null +++ b/connector_typesense/readme/CHANGES.rst @@ -0,0 +1,37 @@ +Changelog +--------- + +Future (?) +~~~~~~~~~~ + + +14.0.2.0.0 +~~~~~~~~~~~~ + +**Breaking change** + + +For historical reason (first implementation with algolia) +- the id of the binding was added in the index +- and for elastic/algolia the objectID (= the id of the record bound) was also added + +This lead to a uncomprehensible situation where the frontend dev have an "id" and an "objectID" with different value and have no idea of which one should be used for filtering + +Magic injection of the "id" have been removed (as we already define a export.line in shopinvader) and explicit is better then implicit. + +Note: in shopinvader we push in the key "id" the id of the record bound (we do not care of the id of the binding). + +Elastic Connector do not use any more the "objectID" key +Algolia Connector still use the "objectID" (required) but the value is the same as the id + +See issue shopivader issue `#1000 `_ + + +12.0.2.0.0 +~~~~~~~~~~ + +- index field name is now a computed field based on the backend name, the model exported and the lang +- remove dependency on keychain +- Improve UI on search engine backend (domain on model and exporter...) +- improve test coverage +- use black for auto code style diff --git a/connector_typesense/readme/CONTRIBUTORS.rst b/connector_typesense/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..0af58a41 --- /dev/null +++ b/connector_typesense/readme/CONTRIBUTORS.rst @@ -0,0 +1,5 @@ +* Sébastien BEAU +* Laurent Mignon +* Simone Orsi +* Raphaël Reverdy +* Maik Derstappen diff --git a/connector_typesense/readme/DESCRIPTION.rst b/connector_typesense/readme/DESCRIPTION.rst new file mode 100644 index 00000000..985e0128 --- /dev/null +++ b/connector_typesense/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This addon provides the bases to implement addons to export information to +Typesense_ indexes. + +.. _Typesense: https://typesense.org diff --git a/connector_typesense/readme/HISTORY.rst b/connector_typesense/readme/HISTORY.rst new file mode 100644 index 00000000..60234453 --- /dev/null +++ b/connector_typesense/readme/HISTORY.rst @@ -0,0 +1,36 @@ +16.0.0.1.1 (2023-10-13) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Bugfixes** + +- Fixes cache issue with the *se_binding_ids* field on the *s.indexable.record* + model. When a binding is created or updated or deleted, the cache for the + *se_binding_ids* field for referenced records is now invalidated. That way, + the next time the field is accessed after such an operation, the value is + recomputed to reflect the change. (`#163 `_) + + +16.0.0.1.0 (2023-10-13) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Features** + +- A new action **Update state** is now available on *Search Engine Record* objects. + This action allows you to update the state of selected records on the tree view. + + Add a smart button to quickly access to the bound records from the + *Search Engine Backend* and *Search Engine Record* views. (`#162 `__) + + +**Bugfixes** + +- Fix Search Engine Binding form view. The fields data and error are now + properly displayed and fit the width of the form. + + Makes the Odoo's admin user a member of the *Search Engine Connector Manager* group. (`#162 `__) + + +12.0.x.y.z (YYYY-MM-DD) +~~~~~~~~~~~~~~~~~~~~~~~ + +TODO diff --git a/connector_typesense/readme/INSTALL.rst b/connector_typesense/readme/INSTALL.rst new file mode 100644 index 00000000..543187da --- /dev/null +++ b/connector_typesense/readme/INSTALL.rst @@ -0,0 +1,13 @@ +This addon uses the native json python package provided by python. When +a json for a record is recomputed, the new value is compared to the original +one to see if an export to the search engine index is needed. This is +done by comparing the md5 of the two json strings. This process when done on +a large number of records can be slow when the json is large and complex. To speed +up this process you can install the orjson package. + +.. code-block:: bash + + pip install orjson + +This package requires a typesense search engine running. +Please read this for a [quick docker based setup](https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting). diff --git a/connector_typesense/readme/ROADMAP.rst b/connector_typesense/readme/ROADMAP.rst new file mode 100644 index 00000000..94648904 --- /dev/null +++ b/connector_typesense/readme/ROADMAP.rst @@ -0,0 +1,4 @@ +* Implement generic trigger for binding + based on ir.export linked to the index + (the aim is to set the binding to be updated + if we modify a field configured in the exporter) diff --git a/connector_typesense/readme/TYPESENSE.rst b/connector_typesense/readme/TYPESENSE.rst new file mode 100644 index 00000000..a9f4237d --- /dev/null +++ b/connector_typesense/readme/TYPESENSE.rst @@ -0,0 +1,57 @@ +typesense +~~~~~~~~~ + +requirements: to pretty print json, install jq on your system; + + +in terminal export the API key + +.. code-block:: + + export TYPESENSE_API_KEY='xyz' + export TYPESENSE_HOST='http://localhost:8108' + +list all collections (indexes): + +.. code-block:: + + curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ + "http://localhost:8108/collections" | jq + + +retrieve collection details of the products collection (index): + +.. code-block:: + + curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ + -X GET "http://localhost:8108/collections/typesense_backend_1_product_variant_en_us" | jq + + +list aliases: + +.. code-block:: + curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ + "http://localhost:8108/aliases" | jq + + + +get alias info: + +.. code-block:: + curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ + "http://localhost:8108/aliases/typesense_backend_1_product_variant_en_us" | jq + + + + +search for all products: + +curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ +"http://localhost:8108/collections/typesense_backend_1_product_variant_en_us/documents/search?q=*" | jq + + +Typesense GUI +------------- + +a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases + diff --git a/connector_typesense/readme/USAGE.rst b/connector_typesense/readme/USAGE.rst new file mode 100644 index 00000000..cbb5f407 --- /dev/null +++ b/connector_typesense/readme/USAGE.rst @@ -0,0 +1,102 @@ +Overview +~~~~~~~~ + +A search engine is a system designed to store information in a way that makes +it easy to find through search and analytics queries. The main difference +between a search engine and a database is that a search engine is optimized +for search and analytics queries, while a database is optimized for +transactional and relational queries. + +This addons is designed around 4 main concepts: + +* **The search engine backend** is used to define into Odoo the kind + of search engine that will be used to index the data. It's main responsibility + is to provide an instance of `odoo.addons.search_engine.tools.adapter.SearchEngineAdapter` + that will be used to communicate with the search engine. + +* **The search engine index** is used to define into Odoo the index where + the data will be indexed. An index is always linked to a search engine backend. + The index provides methods to use to manage the lifecycle of the data put into + the index for the records of a given model. To do so, it uses: + + * **The SearchEngineAdapter** provided by the backend to communicate with the + search engine. + * **A ModelSerializer** that is used to transform an odoo record into + a dictionary that can be indexed into the search engine. + * **A JsonValidator** that is used to validate the data that is to be + indexed into the search engine. + + The RecordSerializer and IndexDataValidator are defined on the index itself. + The current addon provides a default implementation only for the IndexDataValidator. + You can find into the github repository `search-engine `_ An implementation of the RecordSerializer based + on the jsonifier addon `connector_search_engine_jsonifier`. + +* **The search engine indexable record** is a mixin that is used to define + the records that can be indexed into a search engine index. The mixin + provides methods: + + * To add a record to an index. + * To remove a record from an index. + * To mark the record into an index (*the search engine bindings*) as to be + recomputed (This method should be called when modifications are made on + the record that could impact the data that are indexed into the search + engine. It will instruct the index that the record must be recomputed and + re-indexed). + + It also ensures that when the record is unlinked, it is removed from the indexes + it was indexed into. + +* **The search engine binding** is a model that represents the link between + an index and an indexable odoo record. It give you access to the data + that are indexed into the search engine for the record. It's also used to + manage the lifecycle of the data into the search engine. When a binding is + created, it's marked as to be computed. Once the data are computed, the + binding is marked as to be indexed. Once the data are indexed, the binding + is marked as indexed. If the linked record is unlinked, the binding is + marked as to be removed. Once the data are removed from the search engine, + the binding is deleted. + +Indexing lifecycle +~~~~~~~~~~~~~~~~~~ + +The indexing lifecycle is based on the following steps: + +* When a record is added to an index, a binding is created and marked as to be + computed. +* A cron job scheduled every 5 minutes will look for bindings that are to be + computed and for each of them will schedule a job to re compute the json data. +* When the json data is computed, the binding is marked as to be exported if the + json is valid and is different from the one that has been computed last time. +* A cron job scheduled every 5 minutes will ensure the syncing with the search + engine. It will: + + * look for bindings that are to be exported and for each of them will schedule + a job to export the json data into the search engine. Once exported, the + binding is marked as 'done'. + * look for bindings that are to be removed and for each of them will schedule + a job to remove the data from the search engine. Once removed, the binding + is deleted. + +To keep in sync the data from your model instance and the data that are indexed +into the search engine, you should call the method `_se_mark_to_update` on the +mode instance when you make modifications that could impact the data that are +indexed into the search engine. + +* When the method `_se_mark_to_update` is called, the binding is marked as to be + computed. +* From there, the same process as described above will be used to recompute the + data and reindex them into the search engine. + +When a model instance is unlinked, the binding is marked as to be removed. From +there if will be processed by the job syncing the data with the search engine. + +.. note:: + + In previous versions of this addon, there was no method to mark a record as + to be recomputed. As a consequence, all the records were re-computed every day + to ensure that the data in the search engine were up to date. This was a + performance issue and consumed a lot of resources. If despite this, you want + to recompute all the records every day, you can activate the cron jon + `Search engine: recompute all index` and deactivate the one named + `earch engine: Generate job for recompute binding to recompute per index`. diff --git a/connector_typesense/readme/newsfragments/.gitignore b/connector_typesense/readme/newsfragments/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/connector_typesense/static/description/index.html b/connector_typesense/static/description/index.html new file mode 100644 index 00000000..2185e470 --- /dev/null +++ b/connector_typesense/static/description/index.html @@ -0,0 +1,603 @@ + + + + + + +connector_typesense + + + +
+

connector_typesense

+ + +

Beta License: AGPL-3 OCA/search-engine Translate me on Weblate Try me on Runboat

+

Base module for connecting Odoo with external search engines. This addon is +intended to be used as a base for other addons that implement specific search +engines. It’s designed to be easily extensible and modular.

+

Table of contents

+ +
+

Installation

+

This addon uses the native json python package provided by python. When +a json for a record is recomputed, the new value is compared to the original +one to see if an export to the search engine index is needed. This is +done by comparing the md5 of the two json strings. This process when done on +a large number of records can be slow when the json is large and complex. To speed +up this process you can install the orjson package.

+
+pip install orjson
+
+

This package requires a typesense search engine running. +Please read this for a [quick docker based setup](https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting).

+
+
+

Usage

+
+

Overview

+

A search engine is a system designed to store information in a way that makes +it easy to find through search and analytics queries. The main difference +between a search engine and a database is that a search engine is optimized +for search and analytics queries, while a database is optimized for +transactional and relational queries.

+

This addons is designed around 4 main concepts:

+
    +
  • The search engine backend is used to define into Odoo the kind +of search engine that will be used to index the data. It’s main responsibility +is to provide an instance of odoo.addons.search_engine.tools.adapter.SearchEngineAdapter +that will be used to communicate with the search engine.

    +
  • +
  • The search engine index is used to define into Odoo the index where +the data will be indexed. An index is always linked to a search engine backend. +The index provides methods to use to manage the lifecycle of the data put into +the index for the records of a given model. To do so, it uses:

    +
      +
    • The SearchEngineAdapter provided by the backend to communicate with the +search engine.
    • +
    • A ModelSerializer that is used to transform an odoo record into +a dictionary that can be indexed into the search engine.
    • +
    • A JsonValidator that is used to validate the data that is to be +indexed into the search engine.
    • +
    +

    The RecordSerializer and IndexDataValidator are defined on the index itself. +The current addon provides a default implementation only for the IndexDataValidator. +You can find into the github repository search-engine An implementation of the RecordSerializer based +on the jsonifier addon connector_search_engine_jsonifier.

    +
  • +
  • The search engine indexable record is a mixin that is used to define +the records that can be indexed into a search engine index. The mixin +provides methods:

    +
      +
    • To add a record to an index.
    • +
    • To remove a record from an index.
    • +
    • To mark the record into an index (the search engine bindings) as to be +recomputed (This method should be called when modifications are made on +the record that could impact the data that are indexed into the search +engine. It will instruct the index that the record must be recomputed and +re-indexed).
    • +
    +

    It also ensures that when the record is unlinked, it is removed from the indexes +it was indexed into.

    +
  • +
  • The search engine binding is a model that represents the link between +an index and an indexable odoo record. It give you access to the data +that are indexed into the search engine for the record. It’s also used to +manage the lifecycle of the data into the search engine. When a binding is +created, it’s marked as to be computed. Once the data are computed, the +binding is marked as to be indexed. Once the data are indexed, the binding +is marked as indexed. If the linked record is unlinked, the binding is +marked as to be removed. Once the data are removed from the search engine, +the binding is deleted.

    +
  • +
+
+
+

Indexing lifecycle

+

The indexing lifecycle is based on the following steps:

+
    +
  • When a record is added to an index, a binding is created and marked as to be +computed.
  • +
  • A cron job scheduled every 5 minutes will look for bindings that are to be +computed and for each of them will schedule a job to re compute the json data.
  • +
  • When the json data is computed, the binding is marked as to be exported if the +json is valid and is different from the one that has been computed last time.
  • +
  • A cron job scheduled every 5 minutes will ensure the syncing with the search +engine. It will:
      +
    • look for bindings that are to be exported and for each of them will schedule +a job to export the json data into the search engine. Once exported, the +binding is marked as ‘done’.
    • +
    • look for bindings that are to be removed and for each of them will schedule +a job to remove the data from the search engine. Once removed, the binding +is deleted.
    • +
    +
  • +
+

To keep in sync the data from your model instance and the data that are indexed +into the search engine, you should call the method _se_mark_to_update on the +mode instance when you make modifications that could impact the data that are +indexed into the search engine.

+
    +
  • When the method _se_mark_to_update is called, the binding is marked as to be +computed.
  • +
  • From there, the same process as described above will be used to recompute the +data and reindex them into the search engine.
  • +
+

When a model instance is unlinked, the binding is marked as to be removed. From +there if will be processed by the job syncing the data with the search engine.

+
+

Note

+

In previous versions of this addon, there was no method to mark a record as +to be recomputed. As a consequence, all the records were re-computed every day +to ensure that the data in the search engine were up to date. This was a +performance issue and consumed a lot of resources. If despite this, you want +to recompute all the records every day, you can activate the cron jon +Search engine: recompute all index and deactivate the one named +earch engine: Generate job for recompute binding to recompute per index.

+
+
+
+
+

Known issues / Roadmap

+
    +
  • Implement generic trigger for binding +based on ir.export linked to the index +(the aim is to set the binding to be updated +if we modify a field configured in the exporter)
  • +
+
+
+

Changelog

+
+

16.0.0.1.1 (2023-10-13)

+

Bugfixes

+
    +
  • Fixes cache issue with the se_binding_ids field on the s.indexable.record +model. When a binding is created or updated or deleted, the cache for the +se_binding_ids field for referenced records is now invalidated. That way, +the next time the field is accessed after such an operation, the value is +recomputed to reflect the change. (#163)
  • +
+
+
+

16.0.0.1.0 (2023-10-13)

+

Features

+
    +
  • A new action Update state is now available on Search Engine Record objects. +This action allows you to update the state of selected records on the tree view.

    +

    Add a smart button to quickly access to the bound records from the +Search Engine Backend and Search Engine Record views. (#162)

    +
  • +
+

Bugfixes

+
    +
  • Fix Search Engine Binding form view. The fields data and error are now +properly displayed and fit the width of the form.

    +

    Makes the Odoo’s admin user a member of the Search Engine Connector Manager group. (#162)

    +
  • +
+
+ +
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Derico
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/search-engine project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/connector_typesense/tools/__init__.py b/connector_typesense/tools/__init__.py new file mode 100644 index 00000000..f502287f --- /dev/null +++ b/connector_typesense/tools/__init__.py @@ -0,0 +1 @@ +from . import adapter diff --git a/connector_typesense/tools/adapter.py b/connector_typesense/tools/adapter.py new file mode 100644 index 00000000..0f0019ae --- /dev/null +++ b/connector_typesense/tools/adapter.py @@ -0,0 +1,257 @@ +# Copyright 2024 Derico +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import json +import logging +from typing import Any, Iterator + +from odoo import _ +from odoo.exceptions import UserError + +from odoo.addons.connector_search_engine.tools.adapter import SearchEngineAdapter + +_logger = logging.getLogger(__name__) + + +try: + import typesense +except ImportError: + _logger.debug("Can not import typesense") + + +# def _is_delete_nonexistent_documents(elastic_exception): +# """True iff all errors in this exception are deleting a nonexisting document.""" +# b = lambda d: "delete" in d and d["delete"]["status"] == 404 # noqa +# return all(b(error) for error in elastic_exception.errors) + + +class TypesenseAdapter(SearchEngineAdapter): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.__ts_client = None + + @property + def _index_name(self): + return self.index_record.name.lower() + + # @property + # def _es_connection_class(self): + # return elasticsearch.RequestsHttpConnection + + @property + def _ts_client(self): + if not self.__ts_client: + self.__ts_client = self._get_ts_client() + return self.__ts_client + + @property + def _index_config(self): + return self.index_record.config_id.body + + def _get_ts_client(self): + backend = self.backend_record + return typesense.Client( + { + "nodes": [ + { + "host": backend.ts_server_host, + "port": backend.ts_server_port, + "protocol": backend.ts_server_protocol, + } + ], + "api_key": backend.api_key, + "connection_timeout_seconds": int(backend.ts_server_timeout) or 300, + } + ) + + def test_connection(self): + ts = self._ts_client + try: + ts.collections.retrieve() + except typesense.exceptions.ObjectNotFound as exc: + raise UserError( + _("Not Found - The requested resource is not found.") + ) from exc + except typesense.RequestUnauthorized as exc: + raise UserError(_("Unauthorized - Your API key is wrong.")) from exc + except typesense.TypesenseClientError as exc: + raise UserError(_("Unable to connect :") + "\n\n" + repr(exc)) from exc + + def index(self, records) -> None: + """ """ + print(">>>>>> run TS index method") + ts = self._ts_client + records_for_bulk = "" + for record in records: + print(f">>> record: {record}") + if "id" in record: + record["id"] = str(record["id"]) + records_for_bulk += f"{json.dumps(record)}\n" + + _logger.info(f"Bulk import records into {self._index_name}'...") + res = ts.collections[self._index_name].documents.import_( + records_for_bulk, {"action": "emplace"} + ) + res = res.split("\n") + # checks if number of indexed object and object in records are equal + if not len(res) == len(records): + raise SystemError( + _( + "Unable to index all records. (indexed: %(indexed)s, " + "total: %(total)s)\n%(result)s", + indexed=len(res), + total=len(records), + result=res, + ) + ) + + def delete(self, binding_ids) -> None: + """ """ + ts = self._ts_client + _logger.info( + f"Delete binding_ids: {', '.join(binding_ids)} from collection " + f"'{self.index_name}'." + ) + ts.collections[self._index_name].documents.delete({"filter_by=id": binding_ids}) + + def clear(self) -> None: + """ """ + ts = self._ts_client + index_name = self._get_current_aliased_index_name() or self._index_name + _logger.info(f"Clear current_aliased_index_name '{index_name}'.") + ts.collections[index_name].delete() + self.settings() + + def each(self) -> Iterator[dict[str, Any]]: + """ """ + ts = self._ts_client + res = ts.collections[self._index_name].documents.search( + { + "q": "*", + } + ) + if not res: + # eg: empty index + return + hits = res["hits"]["documents"] + for hit in hits: + yield hit + + def settings(self) -> None: + ts = self._ts_client + try: + ts.collections[self._index_name].retrieve() + except typesense.exceptions.ObjectNotFound: + client = self._ts_client + # To allow rolling updates, we work with index aliases + aliased_index_name = self._get_next_aliased_index_name() + # index_name / collection_name is part of the schema defined in + # self._index_config + index_config = self._index_config + index_config.update( + { + "name": aliased_index_name, + } + ) + _logger.info(f"Create aliased_index_name '{aliased_index_name}'...") + client.collections.create(index_config) + _logger.info( + f"Set collection alias '{self._index_name}' >> aliased_index_name " + f"'{aliased_index_name}'." + ) + client.aliases.upsert( + self._index_name, {"collection_name": aliased_index_name} + ) + + def _get_current_aliased_index_name(self) -> str: + """Get the current aliased index name if any""" + current_aliased_index_name = None + alias = self._ts_client.aliases[self._index_name].retrieve() + if "collection_name" in alias: + current_aliased_index_name = alias["collection_name"] + return current_aliased_index_name + + def _get_next_aliased_index_name( + self, aliased_index_name: str | None = None + ) -> str: + """Get the next aliased index name + + The next aliased index name is based on the current aliased index name. + It's the current aliased index name incremented by 1. + + :param aliased_index_name: the current aliased index name + :return: the next aliased index name + """ + next_version = 1 + if aliased_index_name: + next_version = int(aliased_index_name.split("-")[-1]) + 1 + return f"{self._index_name}-{next_version}" + + def reindex(self) -> None: + """Reindex records according to the current config + This method is useful to allows a rolling update of index + configuration. + This process is based on the following steps: + 1. export data from current aliased index + 2. create a new index (collection) with the current config + 3. import data into new aliased index (collection) + 4. Update the index alias to point to the new aliased index (collection) + 5. Drop the old index. + """ + client = self._ts_client + current_aliased_index_name = self._get_current_aliased_index_name() + data = client.collections[current_aliased_index_name].documents.export() + next_aliased_index_name = self._get_next_aliased_index_name( + current_aliased_index_name + ) + try: + client.collections[next_aliased_index_name].retrieve() + except typesense.exceptions.ObjectNotFound: + # To allow rolling updates, we work with index aliases + # index_name / collection_name is part of the schema defined + # in self._index_config + _logger.info( + f"Create new_aliased_index_name '{next_aliased_index_name}'..." + ) + index_config = self._index_config + index_config.update( + { + "name": next_aliased_index_name, + } + ) + client.collections.create(index_config) + _logger.info( + f"Import existing data into new_aliased_index_name " + f"'{next_aliased_index_name}'..." + ) + client.collections[next_aliased_index_name].documents.import_( + data.encode("utf-8"), {"action": "create"} + ) + + try: + client.collections[next_aliased_index_name].retrieve() + except typesense.exceptions.ObjectNotFound as e: + _logger.warn( + f"New aliased_index_name not found, skip updating alias and " + f"not removing old index (collection)!\n\n{e}" + ) + else: + _logger.info( + f"Set collection alias '{self._index_name}' >> " + f"new_aliased_index_name '{next_aliased_index_name}'." + ) + client.aliases.upsert( + self._index_name, {"collection_name": next_aliased_index_name} + ) + _logger.info( + f"Remove old aliased index (collection) " + f"'{current_aliased_index_name}'." + ) + client.collections[current_aliased_index_name].delete() + + else: + _logger.warning( + f"next_aliased_index_name '{next_aliased_index_name}' " + f"already exists, skip!", + self._index_name, + ) diff --git a/connector_typesense/views/se_backend.xml b/connector_typesense/views/se_backend.xml new file mode 100644 index 00000000..426ec139 --- /dev/null +++ b/connector_typesense/views/se_backend.xml @@ -0,0 +1,36 @@ + + + + se.backend + + + + + + + + + + + + + + diff --git a/requirements.txt b/requirements.txt index 4ac43d30..88e80a07 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ elasticsearch>=7.0.0,<=7.13.4 pydantic requests typing-extensions +typesense unidecode diff --git a/setup/_metapackage/setup.py b/setup/_metapackage/setup.py index 987fe1aa..0ced9abf 100644 --- a/setup/_metapackage/setup.py +++ b/setup/_metapackage/setup.py @@ -1,6 +1,6 @@ import setuptools -with open('VERSION.txt', 'r') as f: +with open("VERSION.txt", "r") as f: version = f.read().strip() setuptools.setup( @@ -8,15 +8,15 @@ description="Meta package for oca-search-engine Odoo addons", version=version, install_requires=[ - 'odoo-addon-connector_elasticsearch>=16.0dev,<16.1dev', - 'odoo-addon-connector_search_engine>=16.0dev,<16.1dev', - 'odoo-addon-connector_search_engine_serializer_ir_export>=16.0dev,<16.1dev', - 'odoo-addon-search_engine_image_thumbnail>=16.0dev,<16.1dev', - 'odoo-addon-search_engine_serializer_pydantic>=16.0dev,<16.1dev', + "odoo-addon-connector_elasticsearch>=16.0dev,<16.1dev", + "odoo-addon-connector_search_engine>=16.0dev,<16.1dev", + "odoo-addon-connector_search_engine_serializer_ir_export>=16.0dev,<16.1dev", + "odoo-addon-search_engine_image_thumbnail>=16.0dev,<16.1dev", + "odoo-addon-search_engine_serializer_pydantic>=16.0dev,<16.1dev", ], classifiers=[ - 'Programming Language :: Python', - 'Framework :: Odoo', - 'Framework :: Odoo :: 16.0', - ] + "Programming Language :: Python", + "Framework :: Odoo", + "Framework :: Odoo :: 16.0", + ], ) diff --git a/setup/connector_elasticsearch/setup.py b/setup/connector_elasticsearch/setup.py index 28c57bb6..00a90304 100644 --- a/setup/connector_elasticsearch/setup.py +++ b/setup/connector_elasticsearch/setup.py @@ -1,6 +1,6 @@ import setuptools setuptools.setup( - setup_requires=['setuptools-odoo'], + setup_requires=["setuptools-odoo"], odoo_addon=True, ) diff --git a/setup/connector_search_engine/setup.py b/setup/connector_search_engine/setup.py index 28c57bb6..00a90304 100644 --- a/setup/connector_search_engine/setup.py +++ b/setup/connector_search_engine/setup.py @@ -1,6 +1,6 @@ import setuptools setuptools.setup( - setup_requires=['setuptools-odoo'], + setup_requires=["setuptools-odoo"], odoo_addon=True, ) diff --git a/setup/connector_search_engine_serializer_ir_export/setup.py b/setup/connector_search_engine_serializer_ir_export/setup.py index 28c57bb6..00a90304 100644 --- a/setup/connector_search_engine_serializer_ir_export/setup.py +++ b/setup/connector_search_engine_serializer_ir_export/setup.py @@ -1,6 +1,6 @@ import setuptools setuptools.setup( - setup_requires=['setuptools-odoo'], + setup_requires=["setuptools-odoo"], odoo_addon=True, ) diff --git a/setup/connector_typesense/odoo/addons/connector_typesense b/setup/connector_typesense/odoo/addons/connector_typesense new file mode 120000 index 00000000..1ffbdd91 --- /dev/null +++ b/setup/connector_typesense/odoo/addons/connector_typesense @@ -0,0 +1 @@ +../../../../connector_typesense \ No newline at end of file diff --git a/setup/connector_typesense/setup.py b/setup/connector_typesense/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/connector_typesense/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/setup/search_engine_image_thumbnail/setup.py b/setup/search_engine_image_thumbnail/setup.py index 28c57bb6..00a90304 100644 --- a/setup/search_engine_image_thumbnail/setup.py +++ b/setup/search_engine_image_thumbnail/setup.py @@ -1,6 +1,6 @@ import setuptools setuptools.setup( - setup_requires=['setuptools-odoo'], + setup_requires=["setuptools-odoo"], odoo_addon=True, ) diff --git a/setup/search_engine_serializer_pydantic/setup.py b/setup/search_engine_serializer_pydantic/setup.py index 28c57bb6..00a90304 100644 --- a/setup/search_engine_serializer_pydantic/setup.py +++ b/setup/search_engine_serializer_pydantic/setup.py @@ -1,6 +1,6 @@ import setuptools setuptools.setup( - setup_requires=['setuptools-odoo'], + setup_requires=["setuptools-odoo"], odoo_addon=True, ) From 5075edcbb85077329c16f48ae7faaf850d5a414f Mon Sep 17 00:00:00 2001 From: kobros-tech Date: Wed, 4 Jun 2025 10:01:16 +0200 Subject: [PATCH 2/3] connector_typesense: Add test, improve code, clean readme --- connector_typesense/README.rst | 180 ++------------ connector_typesense/__manifest__.py | 12 +- connector_typesense/demo/backend_demo.xml | 14 ++ connector_typesense/models/se_backend.py | 7 +- connector_typesense/models/se_index.py | 3 +- connector_typesense/readme/CHANGES.rst | 37 --- connector_typesense/readme/CONFIGURE.rst | 3 + connector_typesense/readme/CONTRIBUTORS.rst | 5 +- connector_typesense/readme/HISTORY.rst | 36 --- connector_typesense/readme/INSTALL.rst | 11 - connector_typesense/readme/ROADMAP.rst | 4 - connector_typesense/readme/TYPESENSE.rst | 57 ----- connector_typesense/readme/USAGE.rst | 102 +------- .../readme/newsfragments/.gitignore | 0 .../static/description/icon.png | Bin 0 -> 12321 bytes .../static/description/index.html | 222 +++--------------- .../docker-compose.typesense.example.yml | 13 + connector_typesense/tools/adapter.py | 29 +-- .../views/{se_backend.xml => ts_backend.xml} | 10 +- requirements.txt | 2 +- 20 files changed, 104 insertions(+), 643 deletions(-) create mode 100644 connector_typesense/demo/backend_demo.xml delete mode 100644 connector_typesense/readme/CHANGES.rst create mode 100644 connector_typesense/readme/CONFIGURE.rst delete mode 100644 connector_typesense/readme/HISTORY.rst delete mode 100644 connector_typesense/readme/ROADMAP.rst delete mode 100644 connector_typesense/readme/TYPESENSE.rst delete mode 100644 connector_typesense/readme/newsfragments/.gitignore create mode 100644 connector_typesense/static/description/icon.png create mode 100644 connector_typesense/tests/docker-compose.typesense.example.yml rename connector_typesense/views/{se_backend.xml => ts_backend.xml} (80%) diff --git a/connector_typesense/README.rst b/connector_typesense/README.rst index 0e6dda87..9c16407a 100644 --- a/connector_typesense/README.rst +++ b/connector_typesense/README.rst @@ -28,9 +28,10 @@ connector_typesense |badge1| |badge2| |badge3| |badge4| |badge5| -Base module for connecting Odoo with external search engines. This addon is -intended to be used as a base for other addons that implement specific search -engines. It's designed to be easily extensible and modular. +This addon provides the bases to implement addons to export information to +Typesense_ indexes. + +.. _Typesense: https://typesense.org **Table of contents** @@ -40,173 +41,21 @@ engines. It's designed to be easily extensible and modular. Installation ============ -This addon uses the native json python package provided by python. When -a json for a record is recomputed, the new value is compared to the original -one to see if an export to the search engine index is needed. This is -done by comparing the md5 of the two json strings. This process when done on -a large number of records can be slow when the json is large and complex. To speed -up this process you can install the orjson package. - -.. code-block:: bash - - pip install orjson - This package requires a typesense search engine running. Please read this for a [quick docker based setup](https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting). -Usage -===== - -Overview -~~~~~~~~ - -A search engine is a system designed to store information in a way that makes -it easy to find through search and analytics queries. The main difference -between a search engine and a database is that a search engine is optimized -for search and analytics queries, while a database is optimized for -transactional and relational queries. - -This addons is designed around 4 main concepts: - -* **The search engine backend** is used to define into Odoo the kind - of search engine that will be used to index the data. It's main responsibility - is to provide an instance of `odoo.addons.search_engine.tools.adapter.SearchEngineAdapter` - that will be used to communicate with the search engine. - -* **The search engine index** is used to define into Odoo the index where - the data will be indexed. An index is always linked to a search engine backend. - The index provides methods to use to manage the lifecycle of the data put into - the index for the records of a given model. To do so, it uses: - - * **The SearchEngineAdapter** provided by the backend to communicate with the - search engine. - * **A ModelSerializer** that is used to transform an odoo record into - a dictionary that can be indexed into the search engine. - * **A JsonValidator** that is used to validate the data that is to be - indexed into the search engine. - - The RecordSerializer and IndexDataValidator are defined on the index itself. - The current addon provides a default implementation only for the IndexDataValidator. - You can find into the github repository `search-engine `_ An implementation of the RecordSerializer based - on the jsonifier addon `connector_search_engine_jsonifier`. - -* **The search engine indexable record** is a mixin that is used to define - the records that can be indexed into a search engine index. The mixin - provides methods: - - * To add a record to an index. - * To remove a record from an index. - * To mark the record into an index (*the search engine bindings*) as to be - recomputed (This method should be called when modifications are made on - the record that could impact the data that are indexed into the search - engine. It will instruct the index that the record must be recomputed and - re-indexed). - - It also ensures that when the record is unlinked, it is removed from the indexes - it was indexed into. - -* **The search engine binding** is a model that represents the link between - an index and an indexable odoo record. It give you access to the data - that are indexed into the search engine for the record. It's also used to - manage the lifecycle of the data into the search engine. When a binding is - created, it's marked as to be computed. Once the data are computed, the - binding is marked as to be indexed. Once the data are indexed, the binding - is marked as indexed. If the linked record is unlinked, the binding is - marked as to be removed. Once the data are removed from the search engine, - the binding is deleted. - -Indexing lifecycle -~~~~~~~~~~~~~~~~~~ - -The indexing lifecycle is based on the following steps: - -* When a record is added to an index, a binding is created and marked as to be - computed. -* A cron job scheduled every 5 minutes will look for bindings that are to be - computed and for each of them will schedule a job to re compute the json data. -* When the json data is computed, the binding is marked as to be exported if the - json is valid and is different from the one that has been computed last time. -* A cron job scheduled every 5 minutes will ensure the syncing with the search - engine. It will: - - * look for bindings that are to be exported and for each of them will schedule - a job to export the json data into the search engine. Once exported, the - binding is marked as 'done'. - * look for bindings that are to be removed and for each of them will schedule - a job to remove the data from the search engine. Once removed, the binding - is deleted. - -To keep in sync the data from your model instance and the data that are indexed -into the search engine, you should call the method `_se_mark_to_update` on the -mode instance when you make modifications that could impact the data that are -indexed into the search engine. - -* When the method `_se_mark_to_update` is called, the binding is marked as to be - computed. -* From there, the same process as described above will be used to recompute the - data and reindex them into the search engine. - -When a model instance is unlinked, the binding is marked as to be removed. From -there if will be processed by the job syncing the data with the search engine. - -.. note:: +Configuration +============= - In previous versions of this addon, there was no method to mark a record as - to be recomputed. As a consequence, all the records were re-computed every day - to ensure that the data in the search engine were up to date. This was a - performance issue and consumed a lot of resources. If despite this, you want - to recompute all the records every day, you can activate the cron jon - `Search engine: recompute all index` and deactivate the one named - `earch engine: Generate job for recompute binding to recompute per index`. +You have to configure (Host, Port, Protocol, Typesense API Key) in a new backend form view: -Known issues / Roadmap -====================== - -* Implement generic trigger for binding - based on ir.export linked to the index - (the aim is to set the binding to be updated - if we modify a field configured in the exporter) - -Changelog -========= - -16.0.0.1.1 (2023-10-13) -~~~~~~~~~~~~~~~~~~~~~~~ - -**Bugfixes** - -- Fixes cache issue with the *se_binding_ids* field on the *s.indexable.record* - model. When a binding is created or updated or deleted, the cache for the - *se_binding_ids* field for referenced records is now invalidated. That way, - the next time the field is accessed after such an operation, the value is - recomputed to reflect the change. (`#163 `_) - - -16.0.0.1.0 (2023-10-13) -~~~~~~~~~~~~~~~~~~~~~~~ - -**Features** - -- A new action **Update state** is now available on *Search Engine Record* objects. - This action allows you to update the state of selected records on the tree view. - - Add a smart button to quickly access to the bound records from the - *Search Engine Backend* and *Search Engine Record* views. (`#162 `__) - - -**Bugfixes** - -- Fix Search Engine Binding form view. The fields data and error are now - properly displayed and fit the width of the form. - - Makes the Odoo's admin user a member of the *Search Engine Connector Manager* group. (`#162 `__) +Search Engine > Configuration > Backends +Usage +===== -12.0.x.y.z (YYYY-MM-DD) -~~~~~~~~~~~~~~~~~~~~~~~ +a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases -TODO Bug Tracker =========== @@ -225,14 +74,13 @@ Authors ~~~~~~~ * Derico +* Kencove Contributors ~~~~~~~~~~~~ -* Sébastien BEAU -* Laurent Mignon -* Simone Orsi -* Raphaël Reverdy +* Maik Derstappen +* Mohamed Alkobrosli Maintainers ~~~~~~~~~~~ diff --git a/connector_typesense/__manifest__.py b/connector_typesense/__manifest__.py index 778ec3b0..451af9bd 100644 --- a/connector_typesense/__manifest__.py +++ b/connector_typesense/__manifest__.py @@ -5,16 +5,16 @@ "name": "connector_typesense", "category": "Connector", "summary": "Connector For Typesense Search Engine", - "version": "16.0.0.0.2", + "version": "16.0.1.0.0", "license": "AGPL-3", - "author": "Derico, Odoo Community Association (OCA)", + "author": "Derico, Kencove, Odoo Community Association (OCA)", "website": "https://github.com/OCA/search-engine", + "maintainers": [], "depends": ["connector_search_engine"], "data": [ - "views/se_backend.xml", + "views/ts_backend.xml", ], - # "demo": ["demo/backend_demo.xml"], - # TODO: Get latest improvements from elasticsearch library - "external_dependencies": {"python": ["typesense", "requests"]}, + "demo": ["demo/se_index_config_demo.xml", "demo/backend_demo.xml"], + "external_dependencies": {"python": ["typesense==1.0.3", "requests"]}, "installable": True, } diff --git a/connector_typesense/demo/backend_demo.xml b/connector_typesense/demo/backend_demo.xml new file mode 100644 index 00000000..1cd56f01 --- /dev/null +++ b/connector_typesense/demo/backend_demo.xml @@ -0,0 +1,14 @@ + + + + + Demo Sale Channel Typesense + demo_sale_channel_typesense + typesense + localhost + 8108 + http + xyz + + diff --git a/connector_typesense/models/se_backend.py b/connector_typesense/models/se_backend.py index c6ec0e6f..6fc263ae 100644 --- a/connector_typesense/models/se_backend.py +++ b/connector_typesense/models/se_backend.py @@ -31,12 +31,7 @@ class SeBackend(models.Model): string="Typesense server timeout", groups="connector_search_engine.group_connector_search_engine_manager", ) - api_key_id = fields.Char( - help="Typesense Api Key ID", - string="Api Key ID", - groups="connector_search_engine.group_connector_search_engine_manager", - ) - api_key = fields.Char( + ts_api_key = fields.Char( help="Typesense Api Key", groups="connector_search_engine.group_connector_search_engine_manager", ) diff --git a/connector_typesense/models/se_index.py b/connector_typesense/models/se_index.py index f5a398a1..3673ff0b 100644 --- a/connector_typesense/models/se_index.py +++ b/connector_typesense/models/se_index.py @@ -1,8 +1,7 @@ # Copyright 2024 Derico # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import _, api, models -from odoo.exceptions import ValidationError +from odoo import models class SeIndex(models.Model): diff --git a/connector_typesense/readme/CHANGES.rst b/connector_typesense/readme/CHANGES.rst deleted file mode 100644 index ec3fd05c..00000000 --- a/connector_typesense/readme/CHANGES.rst +++ /dev/null @@ -1,37 +0,0 @@ -Changelog ---------- - -Future (?) -~~~~~~~~~~ - - -14.0.2.0.0 -~~~~~~~~~~~~ - -**Breaking change** - - -For historical reason (first implementation with algolia) -- the id of the binding was added in the index -- and for elastic/algolia the objectID (= the id of the record bound) was also added - -This lead to a uncomprehensible situation where the frontend dev have an "id" and an "objectID" with different value and have no idea of which one should be used for filtering - -Magic injection of the "id" have been removed (as we already define a export.line in shopinvader) and explicit is better then implicit. - -Note: in shopinvader we push in the key "id" the id of the record bound (we do not care of the id of the binding). - -Elastic Connector do not use any more the "objectID" key -Algolia Connector still use the "objectID" (required) but the value is the same as the id - -See issue shopivader issue `#1000 `_ - - -12.0.2.0.0 -~~~~~~~~~~ - -- index field name is now a computed field based on the backend name, the model exported and the lang -- remove dependency on keychain -- Improve UI on search engine backend (domain on model and exporter...) -- improve test coverage -- use black for auto code style diff --git a/connector_typesense/readme/CONFIGURE.rst b/connector_typesense/readme/CONFIGURE.rst new file mode 100644 index 00000000..c1e532be --- /dev/null +++ b/connector_typesense/readme/CONFIGURE.rst @@ -0,0 +1,3 @@ +You have to configure (Host, Port, Protocol, Typesense API Key) in a new backend form view: + +Search Engine > Configuration > Backends diff --git a/connector_typesense/readme/CONTRIBUTORS.rst b/connector_typesense/readme/CONTRIBUTORS.rst index 0af58a41..38bcf55b 100644 --- a/connector_typesense/readme/CONTRIBUTORS.rst +++ b/connector_typesense/readme/CONTRIBUTORS.rst @@ -1,5 +1,2 @@ -* Sébastien BEAU -* Laurent Mignon -* Simone Orsi -* Raphaël Reverdy * Maik Derstappen +* Mohamed Alkobrosli diff --git a/connector_typesense/readme/HISTORY.rst b/connector_typesense/readme/HISTORY.rst deleted file mode 100644 index 60234453..00000000 --- a/connector_typesense/readme/HISTORY.rst +++ /dev/null @@ -1,36 +0,0 @@ -16.0.0.1.1 (2023-10-13) -~~~~~~~~~~~~~~~~~~~~~~~ - -**Bugfixes** - -- Fixes cache issue with the *se_binding_ids* field on the *s.indexable.record* - model. When a binding is created or updated or deleted, the cache for the - *se_binding_ids* field for referenced records is now invalidated. That way, - the next time the field is accessed after such an operation, the value is - recomputed to reflect the change. (`#163 `_) - - -16.0.0.1.0 (2023-10-13) -~~~~~~~~~~~~~~~~~~~~~~~ - -**Features** - -- A new action **Update state** is now available on *Search Engine Record* objects. - This action allows you to update the state of selected records on the tree view. - - Add a smart button to quickly access to the bound records from the - *Search Engine Backend* and *Search Engine Record* views. (`#162 `__) - - -**Bugfixes** - -- Fix Search Engine Binding form view. The fields data and error are now - properly displayed and fit the width of the form. - - Makes the Odoo's admin user a member of the *Search Engine Connector Manager* group. (`#162 `__) - - -12.0.x.y.z (YYYY-MM-DD) -~~~~~~~~~~~~~~~~~~~~~~~ - -TODO diff --git a/connector_typesense/readme/INSTALL.rst b/connector_typesense/readme/INSTALL.rst index 543187da..451f51b3 100644 --- a/connector_typesense/readme/INSTALL.rst +++ b/connector_typesense/readme/INSTALL.rst @@ -1,13 +1,2 @@ -This addon uses the native json python package provided by python. When -a json for a record is recomputed, the new value is compared to the original -one to see if an export to the search engine index is needed. This is -done by comparing the md5 of the two json strings. This process when done on -a large number of records can be slow when the json is large and complex. To speed -up this process you can install the orjson package. - -.. code-block:: bash - - pip install orjson - This package requires a typesense search engine running. Please read this for a [quick docker based setup](https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting). diff --git a/connector_typesense/readme/ROADMAP.rst b/connector_typesense/readme/ROADMAP.rst deleted file mode 100644 index 94648904..00000000 --- a/connector_typesense/readme/ROADMAP.rst +++ /dev/null @@ -1,4 +0,0 @@ -* Implement generic trigger for binding - based on ir.export linked to the index - (the aim is to set the binding to be updated - if we modify a field configured in the exporter) diff --git a/connector_typesense/readme/TYPESENSE.rst b/connector_typesense/readme/TYPESENSE.rst deleted file mode 100644 index a9f4237d..00000000 --- a/connector_typesense/readme/TYPESENSE.rst +++ /dev/null @@ -1,57 +0,0 @@ -typesense -~~~~~~~~~ - -requirements: to pretty print json, install jq on your system; - - -in terminal export the API key - -.. code-block:: - - export TYPESENSE_API_KEY='xyz' - export TYPESENSE_HOST='http://localhost:8108' - -list all collections (indexes): - -.. code-block:: - - curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ - "http://localhost:8108/collections" | jq - - -retrieve collection details of the products collection (index): - -.. code-block:: - - curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ - -X GET "http://localhost:8108/collections/typesense_backend_1_product_variant_en_us" | jq - - -list aliases: - -.. code-block:: - curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ - "http://localhost:8108/aliases" | jq - - - -get alias info: - -.. code-block:: - curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ - "http://localhost:8108/aliases/typesense_backend_1_product_variant_en_us" | jq - - - - -search for all products: - -curl -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \ -"http://localhost:8108/collections/typesense_backend_1_product_variant_en_us/documents/search?q=*" | jq - - -Typesense GUI -------------- - -a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases - diff --git a/connector_typesense/readme/USAGE.rst b/connector_typesense/readme/USAGE.rst index cbb5f407..60f089bd 100644 --- a/connector_typesense/readme/USAGE.rst +++ b/connector_typesense/readme/USAGE.rst @@ -1,102 +1,2 @@ -Overview -~~~~~~~~ +a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases -A search engine is a system designed to store information in a way that makes -it easy to find through search and analytics queries. The main difference -between a search engine and a database is that a search engine is optimized -for search and analytics queries, while a database is optimized for -transactional and relational queries. - -This addons is designed around 4 main concepts: - -* **The search engine backend** is used to define into Odoo the kind - of search engine that will be used to index the data. It's main responsibility - is to provide an instance of `odoo.addons.search_engine.tools.adapter.SearchEngineAdapter` - that will be used to communicate with the search engine. - -* **The search engine index** is used to define into Odoo the index where - the data will be indexed. An index is always linked to a search engine backend. - The index provides methods to use to manage the lifecycle of the data put into - the index for the records of a given model. To do so, it uses: - - * **The SearchEngineAdapter** provided by the backend to communicate with the - search engine. - * **A ModelSerializer** that is used to transform an odoo record into - a dictionary that can be indexed into the search engine. - * **A JsonValidator** that is used to validate the data that is to be - indexed into the search engine. - - The RecordSerializer and IndexDataValidator are defined on the index itself. - The current addon provides a default implementation only for the IndexDataValidator. - You can find into the github repository `search-engine `_ An implementation of the RecordSerializer based - on the jsonifier addon `connector_search_engine_jsonifier`. - -* **The search engine indexable record** is a mixin that is used to define - the records that can be indexed into a search engine index. The mixin - provides methods: - - * To add a record to an index. - * To remove a record from an index. - * To mark the record into an index (*the search engine bindings*) as to be - recomputed (This method should be called when modifications are made on - the record that could impact the data that are indexed into the search - engine. It will instruct the index that the record must be recomputed and - re-indexed). - - It also ensures that when the record is unlinked, it is removed from the indexes - it was indexed into. - -* **The search engine binding** is a model that represents the link between - an index and an indexable odoo record. It give you access to the data - that are indexed into the search engine for the record. It's also used to - manage the lifecycle of the data into the search engine. When a binding is - created, it's marked as to be computed. Once the data are computed, the - binding is marked as to be indexed. Once the data are indexed, the binding - is marked as indexed. If the linked record is unlinked, the binding is - marked as to be removed. Once the data are removed from the search engine, - the binding is deleted. - -Indexing lifecycle -~~~~~~~~~~~~~~~~~~ - -The indexing lifecycle is based on the following steps: - -* When a record is added to an index, a binding is created and marked as to be - computed. -* A cron job scheduled every 5 minutes will look for bindings that are to be - computed and for each of them will schedule a job to re compute the json data. -* When the json data is computed, the binding is marked as to be exported if the - json is valid and is different from the one that has been computed last time. -* A cron job scheduled every 5 minutes will ensure the syncing with the search - engine. It will: - - * look for bindings that are to be exported and for each of them will schedule - a job to export the json data into the search engine. Once exported, the - binding is marked as 'done'. - * look for bindings that are to be removed and for each of them will schedule - a job to remove the data from the search engine. Once removed, the binding - is deleted. - -To keep in sync the data from your model instance and the data that are indexed -into the search engine, you should call the method `_se_mark_to_update` on the -mode instance when you make modifications that could impact the data that are -indexed into the search engine. - -* When the method `_se_mark_to_update` is called, the binding is marked as to be - computed. -* From there, the same process as described above will be used to recompute the - data and reindex them into the search engine. - -When a model instance is unlinked, the binding is marked as to be removed. From -there if will be processed by the job syncing the data with the search engine. - -.. note:: - - In previous versions of this addon, there was no method to mark a record as - to be recomputed. As a consequence, all the records were re-computed every day - to ensure that the data in the search engine were up to date. This was a - performance issue and consumed a lot of resources. If despite this, you want - to recompute all the records every day, you can activate the cron jon - `Search engine: recompute all index` and deactivate the one named - `earch engine: Generate job for recompute binding to recompute per index`. diff --git a/connector_typesense/readme/newsfragments/.gitignore b/connector_typesense/readme/newsfragments/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/connector_typesense/static/description/icon.png b/connector_typesense/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64e41565f310a40c1e472cbea0b05b910953446c GIT binary patch literal 12321 zcmb`NgLj68as_`+iGm9v28cj`+VQO;kVXkJ!@vonmhO0 zv(IPma7B3uBzQb{5D0`MB`Ky1JdgZ$hXn^7NqKojK_I4MDKTMHkIeHd7)_OY9k+ubWXDvX5|Rx^zFr^s)68A z`0Dw@tQC?6xVap@fUNGZ!bZo;7p}2?9MeUlV4> z&8_77@SdOs?&Xhdv>7`=C0-&oMSm@3fJ2AcT>VMyBI1a+maYm0x*i#`EKn6LUefT# zeU-f>DeAkuJp>UW>o)QE4s&6ZxUcg@%&my!2{I7>4yM`$p)wyMY2R1Xz3k%^io1Zh zml!^Wu-dL6AVQA|qL|yp#I9iRM&f4m3Hp}~j!NNay{TgkXWZ^fIGN%R4g^Fn$~iaf z4lH_gR{NV1dz|^>AR|#Zr<5RIC&=u+Dj%@A>U0uVbENSGNfj}!|0^fFFq0hUSo=V2rnXhzKbI7+#SwCbkor!`!YF~O>_q5i? z^E+!xjg&jn=33XeKl7;HoF5Hd3JV0HY3pM0PXXOE5&vNuovhFkl|F69(wMYG73_8$ zYzDVrg8s&ifiS$>xYG69fro}aZsu_r!Eu1*%(YdDNHUy3Z=-_rti5KP@FhU0^5sX{ zVuWXYXWdnFTFIra0KF}{#%ek5pS+jdcy+$)OGsHpG|1iuXpM|T)Lv(($U!oct`RKd zZCLCHtVlZInsr|NZ3&fotF7z|he?a2h2odzs*2j|FzU3s_s~5`*qt_=yvBvV&(^9g z_Ys^x;@tUO?RrWkWb~(5dz<5+HW>+ScDY8$3AAiJ<_SzU6@HD{kGGMxTDKiZnN!&< zv>WyQM-S4mHw{wt3;CQs)Rt3sMlRU1Lw8OdGgPSo>pt;8qZCTVK}K0<`)vV!982v; zUZRflp^|-H5JMok)ob+BRo#TgFqDR-|4}GiSGl@Z>Z67Kd32A8mAXHKrN(!Vc7Yf4 zjVW~WS8-@rJRhw)*(_j#3Q#(K%Zg^%dq(7xTB*>xo1@^)sI*Ca(3}Y{P>N!40qgH6 z>fc5^V0A8FlMs?mKc8PK7~R?^oyTnz8N(T78&!2qs;kO-ED9fXAb1xd7LYl~dXT^yCsvNF}ReNzws3}sgWQrj1WHFoA6I`k#iQM)o_4n^MHD$jyxBp*rZ4J8nEr;atRkVZ67AboT6a6BhhQf2L~{!`K+>iV&b$~dyE`H)bt3ocQg=dZ38 z@B5q+N!aSJi4+J0>RI^nFvC4wGB{?ec`|PCz%Hkc-@4V5j-3`^(8;txRr~3Sm7IaVtILJ!I3bDqPTL`L2X}MZ)bSfj5wI`+xwSH) zwaKy-KCXh0|8V;r+~kw*4G7X5I=3 z5jmVHKWYs1xG@AFGy^7s=bV&B!&Wtf-XvCKzPWRWE0JfJV(`DNBu}DpO?P z3l%BWYcX|aQ*pKN{Qi@xszIvlX7B8)pxav=G3=Y86Z(FfI-RRvx9`DnG4C+p0fv~r zx5?Nz&#>*f^NwUBcaW7=QN5%&LuQkNHCR|&2KH+Gs|Cft(? zKeFSD4@+40GE$goRsNIRn3w?@&(MCp6K{ zMv~{v(Bp4iLw4ZY2iJU$8pQ?!IUYZfMB#w@Ys<)86`52i5<~owk=~_8GT+^g6 zU}5?kU4U?_%+N5?>85okW5F5LQBI=U-03RK*dfup(E@jXyI3}Gl?{&s%lJ-pwQTfQ zRZ-u`l}2)1^8UEwG&3CQl?AJ?@A*1= z>(Gdhm{+L4hl?x**m-?sQNh*|FUA-nJX@HI!n0@Db7a>EEFtGf2?s=yRZMmvbjugB} zg7>q;^%O-gNTleVN;LZN0{i`XR>MdLxu0EA8J4ey6VHB}^tbalh;}NqpY2* z2eY|cpOVO5C%V46MU--2C9fs@!<(=}Gjh{nN>u%`)mvklL$~s7E zRUVtxa=EXrW4=&GBM|JJVY^P8VvUQB9&G>7WN|AQS0%hHsF({q20=}8TuPtZn|3kA zQ0AW~m*JR0l$k*=LrLe);KA#UAPLJCPYL#%XtB&{v9-G&x zr^L4C^UcrBa-(t;tDhQTXUI-rHFQc+wJd%o_q6*sht5plj*>XmEVAGOgAg)9O}8Ig zs-cf>T8;m!=%yrHybC9`p5`lO(CrZpNcQP?Scv23q#vF4@LK$66z}?@)mK^H9I98d z2$Osyz6mrbx17d{M4!gg<$P?F7Or`J8yIo&X;alxVjq}VP@d;=3g}i!3A~0g9_je| zZ4pWDm(iV+*4_JiU)m8$ldj;B=cVCYSB?X3actl4p7ExI0M?JEY3+`DbZDSutJpil z1F{HOf;x`+DIDSb@qM>a#jUpjO~IFa?0k3B&edTf!@?_AWVnVY&Du?80c+)KUIB?G zNP&5SE71r~o!2R^dvKKm8!o~;GSLGwCq%O;a0bj&RM zSGSs|HLHeXHU00M>uu+p80@Ec1^Wt{YIWQ9`t?!I;we;=WLgmD;lsA8MZ3~w3`=o4 zYEHE%OnxVUnmaOypi(%08{OGQQ@@a|WK9>rPxb~J%Mc_i$cm4m(H7azTa5&~U^(k|W24Wq6$cNsNXfl8CHaE5y;X4@N7 zSwfnlyq=o|^1+hThxZ>1UF&uyB$id0C(h)LOp)jD<^FFDb!o}WZH*N5i;)?T*W8_icS#JKH;iw~~&u=T-eFZG9d4B#6 zeK;xwD$ksKlG~ubo^L47V`ito8tQ_z87dU8O%20rhWWg`b4PZc+A2+<*|{4RgH(UA z^9D~JCLluRc6MD!>t{SPzmix*Os^M_z4d9~C0+iD3CY=Nm$pC~lEa|$Zi4Fgibfw6 zfmsR*2&d0|N9eyZhkZMTf3lF+DbWT3ih>ES$t>+q(T8{7Xpr4AZju#;r~hrVTvCz} z`R4!^QhzPpX%aCPZ>jXovyriyUu?o!WPFm7g|7`9uE&sj%zk3q|ad2(h@NnC67GE4A8Kyx=P}8xa)fQBoTlD8~wCUF*L$q4N z5G|CcRD|5#-JojL)QpRYk&b0`&Y5ibE{2OvOKw9rxL|sv9EDw7Qhla?gh(;^h$^^p zwK^-(XYZ8DSLKD3xzOLhgh&i$g51S@b}}oxz7v6iGC z9zuFu%1eb%G1$b&G0P5U-Rl@zJ=^#|o2Z2P;O2(~|EXO>*G=8@1h#4K&|BCb#Wm%g zPp|~q@q;LKTA-_rR}EV{r)%q2@W`j>`}SLJEuHeQgS+xRAp zfumD~EtZs{zl|w4gV&TEd<)N>2`rwzNx9^7KK)P;Gt0KBa}x<9ba78;^5a{4)K|3W zXz4@IKr%Zeb?kBC&t;4XV=6{i5Gc33@NCliZYE~%UMvL}GV6Pk^uumAHE&g3abw4M z{=abyE%V8!f4uz=WDmLT?=n+Z{;lKIG+)CaNKZ@(kckBvXL6FcrBt<-m9*BeP)EJ) zL&Y56h)*-i3BYW$7__gw-B`L1gM3ele1^cr?KwTNr6>~;k%)5Lgr6Y6ei07xmiSiO;I z0zLC9(ln~ka;4_X%jbcAWiqEwT#zkEq6>T|nLn@2=CUEkh4&j+Pg-{1B&h12*vQ%} z^Ilop9|9zT+O_f=!N2^J5{a=tcJru0CYKT7qsBd{nHe|gO_ue60qC)%r1#JB#HP4a zjXM(VK@lZR`%Bs6^=(*&8Kq zP9A2In$J6@_RM>wQ>kUs7~SgMiI8DL)UJg}wk9LwXp9Of-MW}XYuGYZL)wL5Z^hR( zPk>!LbwyVqV7<9Gh6gOkS`6foQ%Ovdi=4h`Wft>HzX4|SFi9@v; zt?>3HjyU;Ix&~{#@J^SwS`OW=+Vl)?;c=i{4 z!G;#6k(U8-_>VyjxJ15pUEV6AoeDI7WN;_M+`hax2`jmkXyAWe6|_W3?ZlC5^Q*qA zP{H`pLMDF$sk>?mCn4l_6~JcRQug9P&xEicj@Fx1A~Fhl*t=DM;!ql(a__ayPUH{{ zWdol5Gvm3@(}lw4up2$w$lo&xkP5-V9P@F(B2@g3&&O&V^Znv$dTExo`NYt#$TDiO z<%q8i5I#h>Q$5lBqEqY)l9u$ZzQp%1EN@t*s0!zN0&~i= zKOvDoh{ep;TQ`nM-_GTs_s$J%c!F5lAEd@#dmD11q`M!Jv332lyq;py0g=OrJc@|S z0+9KgFtzuTJvsRav>mwZqP?mi(nBAX`$?qH{GI@iS&_)=&aQ~JM&-(MaObsJpdOP` zc9R39-P6n;U*6T9#Pk*4l7w;jv>=CfO@?P+1;%A$DNuWoSM|}M1pSh0$`w*t8hVY1 zq-~l!t|1-QRf#BL|0wGftnI<^}R6jD{&rrkMJ|33Qs(Np-ZFCOSm8=qKdW0}-Hq3_pu8)`-$X5c>~}56i+@Ec~!O3dY}Qv3wz~J~5+}LHQ=-&&y_2 z6I&-atEDyPyF7}ZAyQRr*WR)xy6b}QUnen5_@wjKTbS#=nl-i%i$pr8t*^F|$q7dq zDTKY_RCbh5jzVyE~x!%CUL4AJ$CJPXd*#> zKBeeV@468|vO0zoGD+3u(ZIQTAS#u<+i=|kEB22J_+aCAj@GH>&S0$FxlX!^ntsab z65rPG1?-1n>o$mCp_rd<3uWO%=du|cnCgM3_4@*Z=sb%yi}OZ%#iTR1Yp(LgH7WY% zoIICF*%wb|DzDPfd)tGyX*WIfBgGjJ?O!+K)NU7F^sOrDCCV=oY#5r!ze84Ocl#__ z!N3c$EsGsHCa}xl^G2A+P5>C9YIJ&2G3^!5ZzBqiM7cxQ-*Oz|-u!!e#hZv0h)6Om%%p#v9YFg`z0s7GT zoe5SLM4!0xi7hEC$T^#+7wf@$VpA*b$`r2v=?{f!kqB2|4i0j)b8>vy(FA`1HW`&kxL$>x77L1ST>{HEb-xg0M^S(uLc6yYO1vxB?Zrb%EOmXPW2*T^NHK_lmYJjI3A(< z-y3x4&Rf-&(Xz%`W`zc+!oV81aO-nz>`|YToCy*CAy|-Xy0Nf^b9n-!&p}^_woy^P zC-$=m>xU_h3UuEjWOtcL5c#|yGb~C zuvb-_{64?-ReZpi>YL9nvfqc|-Oy*7-7i9Dx@77&0k`_&w_bA_tciFt=XbyNu(ZA?KKdJ}6ahT2+;HUUJcpBFt2TxZpfiJ2$07p|}o=7LW{l3C(g z+FR}qLMkljSSX|3X`_82A9Whqbp#lg~jPc&J1g z^RTtacvPF8crQ?1Zy%x-f29c~Y~u&;XSX>sFZ)y=WiTaUr60;WW>wsjXs`cs8QMGw z5BiK;=9gg-%-3 zfw^=<{V<^l*Z=6+VsZD8vD?|CJbE4H>shAB?=`Ca<>{@j?;5T`IlM_&fySYCfvnD+ z6vT4MKbjj{8-N)Kp?;NBYwiAGay8uJztA`w7%do^4yvFQFr7(%*InKt8j#mLRv;#I zgb%=&sy(>-I+Ze5kG8W+wZ!|NpRfEhWJ|38+QEvPq!R6vdJ|t(Diy6Ea(wKOs)Ym* zlPAAF6es#u27=A!z-kG+HnN3-FnRs@d_`dwS0Dfs7$#IPULQI4O;Al<2i@51-P-S! zt44Q98+Ar~%f=x<T%520=;LFDvS}?2v>&S z=)(4Cw=ELD9QB&w`P=j6ubiqQM#wl^y&dG;{TxtAMuEu$boANd7|QUEy&D|doBL1U zeP?_z-b$b@sykL-E%jkSD z@{Dhvu~k37r55K(#CF@gF@&^T2~^O?I9>g6=ZpPu%AFeJ*&N8^=A+}ctwFv7L75WN z|I3#domR)%+r6slU#y|IAgWhb@kn_`8wzxi!mz_k#a^eed$%bKjp=H#jiL7_2Q_suun8T(OFgeaQZ6{YA1t@ z7Rs#2{~Ka(7X*ThIS8V1jD1(DP(7B!TrWig1Ns(?xrmlLW{+qJI3QrR_OnvSR*n3NxWmegwS2W6gI?eE zStkQE$i!N_zg!vk-=(x{U@Y51;80XvzICyhwWsby>)u$PDw4UhXE%=g_;XyMkkg{B zj}|yd)!ps;ra~0$W%?a+q7L0T$O47C2&F9PMYMYfa=7;Ur^`t8A8JWVG55nX%k6eq zOUdRDRa1J40!r9zZ}ea=cD(u9)rk~E2r>q0Myi&D3vIq29k|dl2QpYLei3;xclvKpC%TPVAC)! zWx!XaU&11NiL)JmpwVAST+&G>%T$l651Sx}uZKg69Gm+lJpHIzI8(dajX)O{ax^lV z(P&V!OhgX9KI_;u=vWV*(WIW%zU{7dc{i25Xtz*@WqZUjb0=e<_MTqM^2Y7O5?9CA zbN`c=th5mM{AkzZ`80T~5Qb2F= z{3K7&z#h%brx8PE1Ufb2N>0MW2<7xIL{j}@TfE&Mo3%(CII5Th9oqV%f5G69we*cf>z_MM@kZ|#eTjd>IEot zjjHAJxm_S@KM17RwESc8qj#lWkddjmLK{x(qk3p9GI;^drYkQBUM8ti`^+mkVs@~g z6f(zZ;RP@O@}zqKAa^*Q*Oez*O4Iw2H1*I@AK(rCF59sS`&P;|h4PM$9m{@k6SsWh zW7$I6LCj${EM$Q(ERPPPB>p1@42Z})D4S?Z+O;J+?x8=ly}TPC(WjOsx)JO4NiDb zB9{NCyB}u-N25xys?M@%DTaT7oZWi${$o`EMg9DAJhWOnyB^2goG;_-=HH-q`5r&2 zzqP+*@@6qF_e{p}O3xU?&F`^=K-P%&&UxnV{abN? zL#Q~X(PB3n>ufr<+F;V*2%b9lHG`PrODK#)%pD$IIP%Yyf3?8REGWvB9D09zbTU_V z?dX!ubfDhbc36l}JIb~-?oy_01VF6znm&-Z3O=Q7`b%5s`l#Y!L$7@jW{R&M$r61& zuD!jbO3~d>G?vA3W&REZP^X1IZlxN0@j;Q&JEFnrN$>;-5{=0`{STykhm$=!!t<4% zv4ny)dpsMTxLYgw`$4vO9IskCAH`1dJ`?%6K>p<0gT`mEX#REyBOLF$J48Jp?DT-j zZyH%(SEaP>=|@(; zq-U$V7yac0Ui(ZA6U9EnUb8!I=ZJ52kn%F^@=f`EGsodK^;4oQOIk>`M`2M_p1)Ta z+n}=nB9+pM-4p;(&tD>Nrrz zPKfWKEqdQ{IYz40Be{4ng(sFZbiJ5EBX&!WLj@Z+IzIq{1q60!>%Jt3Q`ijm6kt4E zc@o!_s9XqbShg@Dssm_@wMc}owI#P)q2um#Y;kq-cc9-^OivDW3L`4?4E7&9F!0=- zSo69RE8s}r2P;`P-pceH8x=6#nB(h&ds_wQwv-veH2WX9@O_Bn8>sFtv#Q1A=>k&g?z6ZGACCo6f5L>oh zNQL+vU(9l9(EZ~T9W*N&RIGXk(Qn3CNi!73*+UBq?*H|HR+)?!T*jN3N(MyLV(rU= z&(UfQvSqU=WAKiGsdh2-((@Cl7L5;pZF|;M5}3b20fjvm1o()BG`kmDiC3W;F?h(F zZ#?u&=;49$)`)-!i0_7o;s)c%eTh@KKKu)a*$B5+Wo53+w;mqIfW=paiEWl$ARQqi zr~13#^`BfI4MpH!T(u-YER(6}$jEmCW8K*ipP>IGc>Ps=oit&JeH+^34TGyBLv%kZ z7lQhj%Z=zKLD=uFTyhg=ai6-rzDwGTUAZ?}fmnC9nKWV60OJ@a_5{p1ug;yf-ekDP z7o^LeW$h&!2aA*r2rh)hzZAXZ8hyjp_WEDjS;43BHo0}do?}sDc3_yq$Ztg?oW_}4 zH@UZRUZHk>rm8v^fsjByV}`o!Lbao4M!G9oU#@SdDcyTSXEbU2Kl9iKQ%|16E=}na7B@noqsmwZIugF{)In zg$jxV6XG?J33FRvx$(*+Q8|6F(8pKD217Ny_(6*ew4N0*wSK8Orfzbi=)J_1G%;%p zWt(EDdL!xTs}cpB=-z8|l{s@6;tF2X#dyiSqN#uHOVUX)CYucPCkbaja0#D`IkL`; zlkT1Lyp(Sj6s-o~`lX^;bD>KL)904GF0DqqU=d@~{=;@7GK1l&o^zq?*CaqIkzp1$ zkDu>5f4^lp>L3IUIh98!(MS8gXR?#Vmn`5h64x(|38!=}@MmS~V88)6PY zT0zO(jNlrU9wUK-1-~=+;)tA1f|v^x#UAV33>_Y5aBV$+U@%B^7>1ut1O0>i=tWcJ zR0J{^$Liel%-w#RVEW7Bj(`WHy$mm{BLi<|( zx6OPO1d^4Tv4`|)##31ge{RHhRM@M@&d&fuN zE^9)N?(mw*!iAf0sgB%#Zq|nQg>?S6t)YfV&E^02$(PSRAV5v@*_#8V=T6Ih&$TX) z-`mpVGkK#oC?v$i9n`=jCYRCB=$?3qS#BUfwN+)(16aQ5O1w8=6C^KUHlNaIqdp>A~45#M$G4OobN zEdYPid5Au~y=$~+L zWNVof!7%6%ReK;2Ah4Kw`~Ihwf @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -370,200 +370,39 @@

connector_typesense

!! source digest: sha256:f09633c3af59b153f0eba3f876a9835676c430a6f39dd0dfa3545a924c80bc11 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/search-engine Translate me on Weblate Try me on Runboat

-

Base module for connecting Odoo with external search engines. This addon is -intended to be used as a base for other addons that implement specific search -engines. It’s designed to be easily extensible and modular.

+

This addon provides the bases to implement addons to export information to +Typesense indexes.

Table of contents

Installation

-

This addon uses the native json python package provided by python. When -a json for a record is recomputed, the new value is compared to the original -one to see if an export to the search engine index is needed. This is -done by comparing the md5 of the two json strings. This process when done on -a large number of records can be slow when the json is large and complex. To speed -up this process you can install the orjson package.

-
-pip install orjson
-

This package requires a typesense search engine running. Please read this for a [quick docker based setup](https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting).

-
-

Usage

-
-

Overview

-

A search engine is a system designed to store information in a way that makes -it easy to find through search and analytics queries. The main difference -between a search engine and a database is that a search engine is optimized -for search and analytics queries, while a database is optimized for -transactional and relational queries.

-

This addons is designed around 4 main concepts:

-
    -
  • The search engine backend is used to define into Odoo the kind -of search engine that will be used to index the data. It’s main responsibility -is to provide an instance of odoo.addons.search_engine.tools.adapter.SearchEngineAdapter -that will be used to communicate with the search engine.

    -
  • -
  • The search engine index is used to define into Odoo the index where -the data will be indexed. An index is always linked to a search engine backend. -The index provides methods to use to manage the lifecycle of the data put into -the index for the records of a given model. To do so, it uses:

    -
      -
    • The SearchEngineAdapter provided by the backend to communicate with the -search engine.
    • -
    • A ModelSerializer that is used to transform an odoo record into -a dictionary that can be indexed into the search engine.
    • -
    • A JsonValidator that is used to validate the data that is to be -indexed into the search engine.
    • -
    -

    The RecordSerializer and IndexDataValidator are defined on the index itself. -The current addon provides a default implementation only for the IndexDataValidator. -You can find into the github repository search-engine An implementation of the RecordSerializer based -on the jsonifier addon connector_search_engine_jsonifier.

    -
  • -
  • The search engine indexable record is a mixin that is used to define -the records that can be indexed into a search engine index. The mixin -provides methods:

    -
      -
    • To add a record to an index.
    • -
    • To remove a record from an index.
    • -
    • To mark the record into an index (the search engine bindings) as to be -recomputed (This method should be called when modifications are made on -the record that could impact the data that are indexed into the search -engine. It will instruct the index that the record must be recomputed and -re-indexed).
    • -
    -

    It also ensures that when the record is unlinked, it is removed from the indexes -it was indexed into.

    -
  • -
  • The search engine binding is a model that represents the link between -an index and an indexable odoo record. It give you access to the data -that are indexed into the search engine for the record. It’s also used to -manage the lifecycle of the data into the search engine. When a binding is -created, it’s marked as to be computed. Once the data are computed, the -binding is marked as to be indexed. Once the data are indexed, the binding -is marked as indexed. If the linked record is unlinked, the binding is -marked as to be removed. Once the data are removed from the search engine, -the binding is deleted.

    -
  • -
-
-
-

Indexing lifecycle

-

The indexing lifecycle is based on the following steps:

-
    -
  • When a record is added to an index, a binding is created and marked as to be -computed.
  • -
  • A cron job scheduled every 5 minutes will look for bindings that are to be -computed and for each of them will schedule a job to re compute the json data.
  • -
  • When the json data is computed, the binding is marked as to be exported if the -json is valid and is different from the one that has been computed last time.
  • -
  • A cron job scheduled every 5 minutes will ensure the syncing with the search -engine. It will:
      -
    • look for bindings that are to be exported and for each of them will schedule -a job to export the json data into the search engine. Once exported, the -binding is marked as ‘done’.
    • -
    • look for bindings that are to be removed and for each of them will schedule -a job to remove the data from the search engine. Once removed, the binding -is deleted.
    • -
    -
  • -
-

To keep in sync the data from your model instance and the data that are indexed -into the search engine, you should call the method _se_mark_to_update on the -mode instance when you make modifications that could impact the data that are -indexed into the search engine.

-
    -
  • When the method _se_mark_to_update is called, the binding is marked as to be -computed.
  • -
  • From there, the same process as described above will be used to recompute the -data and reindex them into the search engine.
  • -
-

When a model instance is unlinked, the binding is marked as to be removed. From -there if will be processed by the job syncing the data with the search engine.

-
-

Note

-

In previous versions of this addon, there was no method to mark a record as -to be recomputed. As a consequence, all the records were re-computed every day -to ensure that the data in the search engine were up to date. This was a -performance issue and consumed a lot of resources. If despite this, you want -to recompute all the records every day, you can activate the cron jon -Search engine: recompute all index and deactivate the one named -earch engine: Generate job for recompute binding to recompute per index.

-
-
-
-
-

Known issues / Roadmap

-
    -
  • Implement generic trigger for binding -based on ir.export linked to the index -(the aim is to set the binding to be updated -if we modify a field configured in the exporter)
  • -
-
-
-

Changelog

-
-

16.0.0.1.1 (2023-10-13)

-

Bugfixes

-
    -
  • Fixes cache issue with the se_binding_ids field on the s.indexable.record -model. When a binding is created or updated or deleted, the cache for the -se_binding_ids field for referenced records is now invalidated. That way, -the next time the field is accessed after such an operation, the value is -recomputed to reflect the change. (#163)
  • -
-
-
-

16.0.0.1.0 (2023-10-13)

-

Features

-
    -
  • A new action Update state is now available on Search Engine Record objects. -This action allows you to update the state of selected records on the tree view.

    -

    Add a smart button to quickly access to the bound records from the -Search Engine Backend and Search Engine Record views. (#162)

    -
  • -
-

Bugfixes

-
    -
  • Fix Search Engine Binding form view. The fields data and error are now -properly displayed and fit the width of the form.

    -

    Makes the Odoo’s admin user a member of the Search Engine Connector Manager group. (#162)

    -
  • -
-
-
-

12.0.x.y.z (YYYY-MM-DD)

-

TODO

+
+

Configuration

+

You have to configure (Host, Port, Protocol, Typesense API Key) in a new backend form view:

+

Search Engine > Configuration > Backends

+
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -571,26 +410,27 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Derico
  • +
  • Kencove
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

diff --git a/connector_typesense/tests/docker-compose.typesense.example.yml b/connector_typesense/tests/docker-compose.typesense.example.yml new file mode 100644 index 00000000..3c5ffb02 --- /dev/null +++ b/connector_typesense/tests/docker-compose.typesense.example.yml @@ -0,0 +1,13 @@ +version: "3.8" + +services: + typesense-server: + image: typesense/typesense:0.25.2 + container_name: typesense-server + ports: + - "8108:8108" + volumes: + - /tmp/typesense-data:/data + command: > + --data-dir /data --api-key=xyz --listen-port=8108 --enable-cors + restart: unless-stopped diff --git a/connector_typesense/tools/adapter.py b/connector_typesense/tools/adapter.py index 0f0019ae..5ce6a718 100644 --- a/connector_typesense/tools/adapter.py +++ b/connector_typesense/tools/adapter.py @@ -5,6 +5,8 @@ import logging from typing import Any, Iterator +import requests + from odoo import _ from odoo.exceptions import UserError @@ -34,10 +36,6 @@ def __init__(self, *args, **kwargs): def _index_name(self): return self.index_record.name.lower() - # @property - # def _es_connection_class(self): - # return elasticsearch.RequestsHttpConnection - @property def _ts_client(self): if not self.__ts_client: @@ -72,18 +70,19 @@ def test_connection(self): raise UserError( _("Not Found - The requested resource is not found.") ) from exc - except typesense.RequestUnauthorized as exc: + except typesense.exceptions.RequestUnauthorized as exc: raise UserError(_("Unauthorized - Your API key is wrong.")) from exc - except typesense.TypesenseClientError as exc: + except requests.exceptions.ConnectionError as exc: raise UserError(_("Unable to connect :") + "\n\n" + repr(exc)) from exc + except requests.exceptions.InvalidURL as exc: + raise UserError( + _("Invalid URL - No host supplied") + "\n\n" + repr(exc) + ) from exc def index(self, records) -> None: - """ """ - print(">>>>>> run TS index method") ts = self._ts_client records_for_bulk = "" for record in records: - print(f">>> record: {record}") if "id" in record: record["id"] = str(record["id"]) records_for_bulk += f"{json.dumps(record)}\n" @@ -106,24 +105,18 @@ def index(self, records) -> None: ) def delete(self, binding_ids) -> None: - """ """ ts = self._ts_client - _logger.info( - f"Delete binding_ids: {', '.join(binding_ids)} from collection " - f"'{self.index_name}'." + ts.collections[self._index_name].documents.delete( + {"filter_by": f"id:{binding_ids}"} ) - ts.collections[self._index_name].documents.delete({"filter_by=id": binding_ids}) def clear(self) -> None: - """ """ ts = self._ts_client index_name = self._get_current_aliased_index_name() or self._index_name - _logger.info(f"Clear current_aliased_index_name '{index_name}'.") ts.collections[index_name].delete() self.settings() def each(self) -> Iterator[dict[str, Any]]: - """ """ ts = self._ts_client res = ts.collections[self._index_name].documents.search( { @@ -231,7 +224,7 @@ def reindex(self) -> None: try: client.collections[next_aliased_index_name].retrieve() except typesense.exceptions.ObjectNotFound as e: - _logger.warn( + _logger.warning( f"New aliased_index_name not found, skip updating alias and " f"not removing old index (collection)!\n\n{e}" ) diff --git a/connector_typesense/views/se_backend.xml b/connector_typesense/views/ts_backend.xml similarity index 80% rename from connector_typesense/views/se_backend.xml rename to connector_typesense/views/ts_backend.xml index 426ec139..9358d8b4 100644 --- a/connector_typesense/views/se_backend.xml +++ b/connector_typesense/views/ts_backend.xml @@ -24,11 +24,15 @@ + - - diff --git a/requirements.txt b/requirements.txt index 88e80a07..b0a37f9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,6 @@ elasticsearch>=7.0.0,<=7.13.4 pydantic requests +typesense==1.0.3 typing-extensions -typesense unidecode From 52202797a9fa89729aac2657aa607e7d53a1ece7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Fri, 6 Jun 2025 20:00:13 +0200 Subject: [PATCH 3/3] connector_typesense: refactor code Implement a simple update of setting (I recommend to use typesense-dashbord for advanced config) Disable reindex and remove alias logic as it's complex and not needed, schema can be updated Reuse generic and add some specific typesense test --- connector_typesense/README.rst | 6 +- connector_typesense/__manifest__.py | 6 +- connector_typesense/demo/backend_demo.xml | 6 +- connector_typesense/models/__init__.py | 2 +- connector_typesense/models/se_index.py | 9 - connector_typesense/readme/CONTRIBUTORS.rst | 1 + connector_typesense/readme/USAGE.rst | 5 +- .../static/description/index.html | 5 +- connector_typesense/tests/__init__.py | 1 + ...orTypesense.test_index_adapter_delete.yaml | 222 + ..._adapter_delete_nonexisting_documents.yaml | 140 + ...nse.test_index_adapter_index_and_iter.yaml | 10419 ++++++++++++++++ ...rTypesense.test_index_adapter_reindex.yaml | 102 + ...ConnectorTypesense.test_update_schema.yaml | 284 + .../tests/test_connector_typesense.py | 48 + connector_typesense/tools/adapter.py | 238 +- requirements.txt | 2 +- 17 files changed, 11320 insertions(+), 176 deletions(-) delete mode 100644 connector_typesense/models/se_index.py create mode 100644 connector_typesense/tests/__init__.py create mode 100644 connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete.yaml create mode 100644 connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete_nonexisting_documents.yaml create mode 100644 connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_index_and_iter.yaml create mode 100644 connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_reindex.yaml create mode 100644 connector_typesense/tests/cassettes/TestConnectorTypesense.test_update_schema.yaml create mode 100644 connector_typesense/tests/test_connector_typesense.py diff --git a/connector_typesense/README.rst b/connector_typesense/README.rst index 9c16407a..e5fb89e9 100644 --- a/connector_typesense/README.rst +++ b/connector_typesense/README.rst @@ -54,8 +54,9 @@ Search Engine > Configuration > Backends Usage ===== -a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases - +We recommend to use the typesense-dashboard for managing your typesense server. +I will allow you to configure the mapping of index with a nice UI. +Please take a look here: https://github.com/bfritscher/typesense-dashboard/releases Bug Tracker =========== @@ -81,6 +82,7 @@ Contributors * Maik Derstappen * Mohamed Alkobrosli +* Sebastien BEAU Maintainers ~~~~~~~~~~~ diff --git a/connector_typesense/__manifest__.py b/connector_typesense/__manifest__.py index 451af9bd..2c2f4429 100644 --- a/connector_typesense/__manifest__.py +++ b/connector_typesense/__manifest__.py @@ -14,7 +14,9 @@ "data": [ "views/ts_backend.xml", ], - "demo": ["demo/se_index_config_demo.xml", "demo/backend_demo.xml"], - "external_dependencies": {"python": ["typesense==1.0.3", "requests"]}, + "demo": [ + "demo/backend_demo.xml", + ], + "external_dependencies": {"python": ["typesense>=1.1.0", "requests"]}, "installable": True, } diff --git a/connector_typesense/demo/backend_demo.xml b/connector_typesense/demo/backend_demo.xml index 1cd56f01..b774bbba 100644 --- a/connector_typesense/demo/backend_demo.xml +++ b/connector_typesense/demo/backend_demo.xml @@ -3,10 +3,10 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - Demo Sale Channel Typesense - demo_sale_channel_typesense + Demo Typesense Backend + demo_typesense_backend typesense - localhost + typesense 8108 http xyz diff --git a/connector_typesense/models/__init__.py b/connector_typesense/models/__init__.py index b4cddc58..36858c27 100644 --- a/connector_typesense/models/__init__.py +++ b/connector_typesense/models/__init__.py @@ -1 +1 @@ -from . import se_backend, se_index +from . import se_backend diff --git a/connector_typesense/models/se_index.py b/connector_typesense/models/se_index.py deleted file mode 100644 index 3673ff0b..00000000 --- a/connector_typesense/models/se_index.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2024 Derico -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models - - -class SeIndex(models.Model): - - _inherit = "se.index" diff --git a/connector_typesense/readme/CONTRIBUTORS.rst b/connector_typesense/readme/CONTRIBUTORS.rst index 38bcf55b..6a3f4f15 100644 --- a/connector_typesense/readme/CONTRIBUTORS.rst +++ b/connector_typesense/readme/CONTRIBUTORS.rst @@ -1,2 +1,3 @@ * Maik Derstappen * Mohamed Alkobrosli +* Sebastien BEAU diff --git a/connector_typesense/readme/USAGE.rst b/connector_typesense/readme/USAGE.rst index 60f089bd..2fc887b9 100644 --- a/connector_typesense/readme/USAGE.rst +++ b/connector_typesense/readme/USAGE.rst @@ -1,2 +1,3 @@ -a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases - +We recommend to use the typesense-dashboard for managing your typesense server. +I will allow you to configure the mapping of index with a nice UI. +Please take a look here: https://github.com/bfritscher/typesense-dashboard/releases diff --git a/connector_typesense/static/description/index.html b/connector_typesense/static/description/index.html index 335427c5..9cd16f4f 100644 --- a/connector_typesense/static/description/index.html +++ b/connector_typesense/static/description/index.html @@ -399,7 +399,9 @@

Configuration

Usage

-

a nice UI is also available here: https://github.com/bfritscher/typesense-dashboard/releases

+

We recommend to use the typesense-dashboard for managing your typesense server. +I will allow you to configure the mapping of index with a nice UI. +Please take a look here: https://github.com/bfritscher/typesense-dashboard/releases

Bug Tracker

@@ -423,6 +425,7 @@

Contributors

diff --git a/connector_typesense/tests/__init__.py b/connector_typesense/tests/__init__.py new file mode 100644 index 00000000..fb2e1046 --- /dev/null +++ b/connector_typesense/tests/__init__.py @@ -0,0 +1 @@ +from . import test_connector_typesense diff --git a/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete.yaml b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete.yaml new file mode 100644 index 00000000..32e7294e --- /dev/null +++ b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete.yaml @@ -0,0 +1,222 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219703,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"},{"facet":false,"index":true,"infix":false,"locale":"","name":"title","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '525' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"message": "Not Found"}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 404 + message: Not Found +- request: + body: '{"fields": [{"name": "name", "type": "string"}], "name": "demo_typesense_backend_contact_en_us"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections + response: + body: + string: '{"created_at":1749219766,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 201 + message: Created +- request: + body: '{"id": "1", "name": "foo"} + + {"id": "2", "name": "bar"} + + {"id": "3", "name": "joe"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/import?action=upsert + response: + body: + string: '{"success":true} + + {"success":true} + + {"success":true}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '50' + content-type: + - text/plain; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/?filter_by=id%3A%5B1%2C+2%5D + response: + body: + string: '{"num_deleted":2}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '17' + content-type: + - application/json + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=1 + response: + body: + string: '{"facet_counts":[],"found":1,"hits":[{"document":{"id":"3","name":"joe"},"highlight":{},"highlights":[]}],"out_of":1,"page":1,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":0}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '280' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +version: 1 diff --git a/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete_nonexisting_documents.yaml b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete_nonexisting_documents.yaml new file mode 100644 index 00000000..25d5f032 --- /dev/null +++ b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_delete_nonexisting_documents.yaml @@ -0,0 +1,140 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219766,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":1,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '362' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"message": "Not Found"}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 404 + message: Not Found +- request: + body: '{"fields": [{"name": "name", "type": "string"}], "name": "demo_typesense_backend_contact_en_us"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections + response: + body: + string: '{"created_at":1749219770,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/?filter_by=id%3A%5B%27donotexist%27%2C+%27donotexisteither%27%5D + response: + body: + string: '{"num_deleted":0}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '17' + content-type: + - application/json + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +version: 1 diff --git a/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_index_and_iter.yaml b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_index_and_iter.yaml new file mode 100644 index 00000000..e1bf4a09 --- /dev/null +++ b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_index_and_iter.yaml @@ -0,0 +1,10419 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219770,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '362' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"message": "Not Found"}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 404 + message: Not Found +- request: + body: '{"fields": [{"name": "name", "type": "string"}], "name": "demo_typesense_backend_contact_en_us"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections + response: + body: + string: '{"created_at":1749219771,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 201 + message: Created +- request: + body: '{"id": "1", "name": "My name is 1"} + + {"id": "2", "name": "My name is 2"} + + {"id": "3", "name": "My name is 3"} + + {"id": "4", "name": "My name is 4"} + + {"id": "5", "name": "My name is 5"} + + {"id": "6", "name": "My name is 6"} + + {"id": "7", "name": "My name is 7"} + + {"id": "8", "name": "My name is 8"} + + {"id": "9", "name": "My name is 9"} + + {"id": "10", "name": "My name is 10"} + + {"id": "11", "name": "My name is 11"} + + {"id": "12", "name": "My name is 12"} + + {"id": "13", "name": "My name is 13"} + + {"id": "14", "name": "My name is 14"} + + {"id": "15", "name": "My name is 15"} + + {"id": "16", "name": "My name is 16"} + + {"id": "17", "name": "My name is 17"} + + {"id": "18", "name": "My name is 18"} + + {"id": "19", "name": "My name is 19"} + + {"id": "20", "name": "My name is 20"} + + {"id": "21", "name": "My name is 21"} + + {"id": "22", "name": "My name is 22"} + + {"id": "23", "name": "My name is 23"} + + {"id": "24", "name": "My name is 24"} + + {"id": "25", "name": "My name is 25"} + + {"id": "26", "name": "My name is 26"} + + {"id": "27", "name": "My name is 27"} + + {"id": "28", "name": "My name is 28"} + + {"id": "29", "name": "My name is 29"} + + {"id": "30", "name": "My name is 30"} + + {"id": "31", "name": "My name is 31"} + + {"id": "32", "name": "My name is 32"} + + {"id": "33", "name": "My name is 33"} + + {"id": "34", "name": "My name is 34"} + + {"id": "35", "name": "My name is 35"} + + {"id": "36", "name": "My name is 36"} + + {"id": "37", "name": "My name is 37"} + + {"id": "38", "name": "My name is 38"} + + {"id": "39", "name": "My name is 39"} + + {"id": "40", "name": "My name is 40"} + + {"id": "41", "name": "My name is 41"} + + {"id": "42", "name": "My name is 42"} + + {"id": "43", "name": "My name is 43"} + + {"id": "44", "name": "My name is 44"} + + {"id": "45", "name": "My name is 45"} + + {"id": "46", "name": "My name is 46"} + + {"id": "47", "name": "My name is 47"} + + {"id": "48", "name": "My name is 48"} + + {"id": "49", "name": "My name is 49"} + + {"id": "50", "name": "My name is 50"} + + {"id": "51", "name": "My name is 51"} + + {"id": "52", "name": "My name is 52"} + + {"id": "53", "name": "My name is 53"} + + {"id": "54", "name": "My name is 54"} + + {"id": "55", "name": "My name is 55"} + + {"id": "56", "name": "My name is 56"} + + {"id": "57", "name": "My name is 57"} + + {"id": "58", "name": "My name is 58"} + + {"id": "59", "name": "My name is 59"} + + {"id": "60", "name": "My name is 60"} + + {"id": "61", "name": "My name is 61"} + + {"id": "62", "name": "My name is 62"} + + {"id": "63", "name": "My name is 63"} + + {"id": "64", "name": "My name is 64"} + + {"id": "65", "name": "My name is 65"} + + {"id": "66", "name": "My name is 66"} + + {"id": "67", "name": "My name is 67"} + + {"id": "68", "name": "My name is 68"} + + {"id": "69", "name": "My name is 69"} + + {"id": "70", "name": "My name is 70"} + + {"id": "71", "name": "My name is 71"} + + {"id": "72", "name": "My name is 72"} + + {"id": "73", "name": "My name is 73"} + + {"id": "74", "name": "My name is 74"} + + {"id": "75", "name": "My name is 75"} + + {"id": "76", "name": "My name is 76"} + + {"id": "77", "name": "My name is 77"} + + {"id": "78", "name": "My name is 78"} + + {"id": "79", "name": "My name is 79"} + + {"id": "80", "name": "My name is 80"} + + {"id": "81", "name": "My name is 81"} + + {"id": "82", "name": "My name is 82"} + + {"id": "83", "name": "My name is 83"} + + {"id": "84", "name": "My name is 84"} + + {"id": "85", "name": "My name is 85"} + + {"id": "86", "name": "My name is 86"} + + {"id": "87", "name": "My name is 87"} + + {"id": "88", "name": "My name is 88"} + + {"id": "89", "name": "My name is 89"} + + {"id": "90", "name": "My name is 90"} + + {"id": "91", "name": "My name is 91"} + + {"id": "92", "name": "My name is 92"} + + {"id": "93", "name": "My name is 93"} + + {"id": "94", "name": "My name is 94"} + + {"id": "95", "name": "My name is 95"} + + {"id": "96", "name": "My name is 96"} + + {"id": "97", "name": "My name is 97"} + + {"id": "98", "name": "My name is 98"} + + {"id": "99", "name": "My name is 99"} + + {"id": "100", "name": "My name is 100"} + + {"id": "101", "name": "My name is 101"} + + {"id": "102", "name": "My name is 102"} + + {"id": "103", "name": "My name is 103"} + + {"id": "104", "name": "My name is 104"} + + {"id": "105", "name": "My name is 105"} + + {"id": "106", "name": "My name is 106"} + + {"id": "107", "name": "My name is 107"} + + {"id": "108", "name": "My name is 108"} + + {"id": "109", "name": "My name is 109"} + + {"id": "110", "name": "My name is 110"} + + {"id": "111", "name": "My name is 111"} + + {"id": "112", "name": "My name is 112"} + + {"id": "113", "name": "My name is 113"} + + {"id": "114", "name": "My name is 114"} + + {"id": "115", "name": "My name is 115"} + + {"id": "116", "name": "My name is 116"} + + {"id": "117", "name": "My name is 117"} + + {"id": "118", "name": "My name is 118"} + + {"id": "119", "name": "My name is 119"} + + {"id": "120", "name": "My name is 120"} + + {"id": "121", "name": "My name is 121"} + + {"id": "122", "name": "My name is 122"} + + {"id": "123", "name": "My name is 123"} + + {"id": "124", "name": "My name is 124"} + + {"id": "125", "name": "My name is 125"} + + {"id": "126", "name": "My name is 126"} + + {"id": "127", "name": "My name is 127"} + + {"id": "128", "name": "My name is 128"} + + {"id": "129", "name": "My name is 129"} + + {"id": "130", "name": "My name is 130"} + + {"id": "131", "name": "My name is 131"} + + {"id": "132", "name": "My name is 132"} + + {"id": "133", "name": "My name is 133"} + + {"id": "134", "name": "My name is 134"} + + {"id": "135", "name": "My name is 135"} + + {"id": "136", "name": "My name is 136"} + + {"id": "137", "name": "My name is 137"} + + {"id": "138", "name": "My name is 138"} + + {"id": "139", "name": "My name is 139"} + + {"id": "140", "name": "My name is 140"} + + {"id": "141", "name": "My name is 141"} + + {"id": "142", "name": "My name is 142"} + + {"id": "143", "name": "My name is 143"} + + {"id": "144", "name": "My name is 144"} + + {"id": "145", "name": "My name is 145"} + + {"id": "146", "name": "My name is 146"} + + {"id": "147", "name": "My name is 147"} + + {"id": "148", "name": "My name is 148"} + + {"id": "149", "name": "My name is 149"} + + {"id": "150", "name": "My name is 150"} + + {"id": "151", "name": "My name is 151"} + + {"id": "152", "name": "My name is 152"} + + {"id": "153", "name": "My name is 153"} + + {"id": "154", "name": "My name is 154"} + + {"id": "155", "name": "My name is 155"} + + {"id": "156", "name": "My name is 156"} + + {"id": "157", "name": "My name is 157"} + + {"id": "158", "name": "My name is 158"} + + {"id": "159", "name": "My name is 159"} + + {"id": "160", "name": "My name is 160"} + + {"id": "161", "name": "My name is 161"} + + {"id": "162", "name": "My name is 162"} + + {"id": "163", "name": "My name is 163"} + + {"id": "164", "name": "My name is 164"} + + {"id": "165", "name": "My name is 165"} + + {"id": "166", "name": "My name is 166"} + + {"id": "167", "name": "My name is 167"} + + {"id": "168", "name": "My name is 168"} + + {"id": "169", "name": "My name is 169"} + + {"id": "170", "name": "My name is 170"} + + {"id": "171", "name": "My name is 171"} + + {"id": "172", "name": "My name is 172"} + + {"id": "173", "name": "My name is 173"} + + {"id": "174", "name": "My name is 174"} + + {"id": "175", "name": "My name is 175"} + + {"id": "176", "name": "My name is 176"} + + {"id": "177", "name": "My name is 177"} + + {"id": "178", "name": "My name is 178"} + + {"id": "179", "name": "My name is 179"} + + {"id": "180", "name": "My name is 180"} + + {"id": "181", "name": "My name is 181"} + + {"id": "182", "name": "My name is 182"} + + {"id": "183", "name": "My name is 183"} + + {"id": "184", "name": "My name is 184"} + + {"id": "185", "name": "My name is 185"} + + {"id": "186", "name": "My name is 186"} + + {"id": "187", "name": "My name is 187"} + + {"id": "188", "name": "My name is 188"} + + {"id": "189", "name": "My name is 189"} + + {"id": "190", "name": "My name is 190"} + + {"id": "191", "name": "My name is 191"} + + {"id": "192", "name": "My name is 192"} + + {"id": "193", "name": "My name is 193"} + + {"id": "194", "name": "My name is 194"} + + {"id": "195", "name": "My name is 195"} + + {"id": "196", "name": "My name is 196"} + + {"id": "197", "name": "My name is 197"} + + {"id": "198", "name": "My name is 198"} + + {"id": "199", "name": "My name is 199"} + + {"id": "200", "name": "My name is 200"} + + {"id": "201", "name": "My name is 201"} + + {"id": "202", "name": "My name is 202"} + + {"id": "203", "name": "My name is 203"} + + {"id": "204", "name": "My name is 204"} + + {"id": "205", "name": "My name is 205"} + + {"id": "206", "name": "My name is 206"} + + {"id": "207", "name": "My name is 207"} + + {"id": "208", "name": "My name is 208"} + + {"id": "209", "name": "My name is 209"} + + {"id": "210", "name": "My name is 210"} + + {"id": "211", "name": "My name is 211"} + + {"id": "212", "name": "My name is 212"} + + {"id": "213", "name": "My name is 213"} + + {"id": "214", "name": "My name is 214"} + + {"id": "215", "name": "My name is 215"} + + {"id": "216", "name": "My name is 216"} + + {"id": "217", "name": "My name is 217"} + + {"id": "218", "name": "My name is 218"} + + {"id": "219", "name": "My name is 219"} + + {"id": "220", "name": "My name is 220"} + + {"id": "221", "name": "My name is 221"} + + {"id": "222", "name": "My name is 222"} + + {"id": "223", "name": "My name is 223"} + + {"id": "224", "name": "My name is 224"} + + {"id": "225", "name": "My name is 225"} + + {"id": "226", "name": "My name is 226"} + + {"id": "227", "name": "My name is 227"} + + {"id": "228", "name": "My name is 228"} + + {"id": "229", "name": "My name is 229"} + + {"id": "230", "name": "My name is 230"} + + {"id": "231", "name": "My name is 231"} + + {"id": "232", "name": "My name is 232"} + + {"id": "233", "name": "My name is 233"} + + {"id": "234", "name": "My name is 234"} + + {"id": "235", "name": "My name is 235"} + + {"id": "236", "name": "My name is 236"} + + {"id": "237", "name": "My name is 237"} + + {"id": "238", "name": "My name is 238"} + + {"id": "239", "name": "My name is 239"} + + {"id": "240", "name": "My name is 240"} + + {"id": "241", "name": "My name is 241"} + + {"id": "242", "name": "My name is 242"} + + {"id": "243", "name": "My name is 243"} + + {"id": "244", "name": "My name is 244"} + + {"id": "245", "name": "My name is 245"} + + {"id": "246", "name": "My name is 246"} + + {"id": "247", "name": "My name is 247"} + + {"id": "248", "name": "My name is 248"} + + {"id": "249", "name": "My name is 249"} + + {"id": "250", "name": "My name is 250"} + + {"id": "251", "name": "My name is 251"} + + {"id": "252", "name": "My name is 252"} + + {"id": "253", "name": "My name is 253"} + + {"id": "254", "name": "My name is 254"} + + {"id": "255", "name": "My name is 255"} + + {"id": "256", "name": "My name is 256"} + + {"id": "257", "name": "My name is 257"} + + {"id": "258", "name": "My name is 258"} + + {"id": "259", "name": "My name is 259"} + + {"id": "260", "name": "My name is 260"} + + {"id": "261", "name": "My name is 261"} + + {"id": "262", "name": "My name is 262"} + + {"id": "263", "name": "My name is 263"} + + {"id": "264", "name": "My name is 264"} + + {"id": "265", "name": "My name is 265"} + + {"id": "266", "name": "My name is 266"} + + {"id": "267", "name": "My name is 267"} + + {"id": "268", "name": "My name is 268"} + + {"id": "269", "name": "My name is 269"} + + {"id": "270", "name": "My name is 270"} + + {"id": "271", "name": "My name is 271"} + + {"id": "272", "name": "My name is 272"} + + {"id": "273", "name": "My name is 273"} + + {"id": "274", "name": "My name is 274"} + + {"id": "275", "name": "My name is 275"} + + {"id": "276", "name": "My name is 276"} + + {"id": "277", "name": "My name is 277"} + + {"id": "278", "name": "My name is 278"} + + {"id": "279", "name": "My name is 279"} + + {"id": "280", "name": "My name is 280"} + + {"id": "281", "name": "My name is 281"} + + {"id": "282", "name": "My name is 282"} + + {"id": "283", "name": "My name is 283"} + + {"id": "284", "name": "My name is 284"} + + {"id": "285", "name": "My name is 285"} + + {"id": "286", "name": "My name is 286"} + + {"id": "287", "name": "My name is 287"} + + {"id": "288", "name": "My name is 288"} + + {"id": "289", "name": "My name is 289"} + + {"id": "290", "name": "My name is 290"} + + {"id": "291", "name": "My name is 291"} + + {"id": "292", "name": "My name is 292"} + + {"id": "293", "name": "My name is 293"} + + {"id": "294", "name": "My name is 294"} + + {"id": "295", "name": "My name is 295"} + + {"id": "296", "name": "My name is 296"} + + {"id": "297", "name": "My name is 297"} + + {"id": "298", "name": "My name is 298"} + + {"id": "299", "name": "My name is 299"} + + {"id": "300", "name": "My name is 300"} + + {"id": "301", "name": "My name is 301"} + + {"id": "302", "name": "My name is 302"} + + {"id": "303", "name": "My name is 303"} + + {"id": "304", "name": "My name is 304"} + + {"id": "305", "name": "My name is 305"} + + {"id": "306", "name": "My name is 306"} + + {"id": "307", "name": "My name is 307"} + + {"id": "308", "name": "My name is 308"} + + {"id": "309", "name": "My name is 309"} + + {"id": "310", "name": "My name is 310"} + + {"id": "311", "name": "My name is 311"} + + {"id": "312", "name": "My name is 312"} + + {"id": "313", "name": "My name is 313"} + + {"id": "314", "name": "My name is 314"} + + {"id": "315", "name": "My name is 315"} + + {"id": "316", "name": "My name is 316"} + + {"id": "317", "name": "My name is 317"} + + {"id": "318", "name": "My name is 318"} + + {"id": "319", "name": "My name is 319"} + + {"id": "320", "name": "My name is 320"} + + {"id": "321", "name": "My name is 321"} + + {"id": "322", "name": "My name is 322"} + + {"id": "323", "name": "My name is 323"} + + {"id": "324", "name": "My name is 324"} + + {"id": "325", "name": "My name is 325"} + + {"id": "326", "name": "My name is 326"} + + {"id": "327", "name": "My name is 327"} + + {"id": "328", "name": "My name is 328"} + + {"id": "329", "name": "My name is 329"} + + {"id": "330", "name": "My name is 330"} + + {"id": "331", "name": "My name is 331"} + + {"id": "332", "name": "My name is 332"} + + {"id": "333", "name": "My name is 333"} + + {"id": "334", "name": "My name is 334"} + + {"id": "335", "name": "My name is 335"} + + {"id": "336", "name": "My name is 336"} + + {"id": "337", "name": "My name is 337"} + + {"id": "338", "name": "My name is 338"} + + {"id": "339", "name": "My name is 339"} + + {"id": "340", "name": "My name is 340"} + + {"id": "341", "name": "My name is 341"} + + {"id": "342", "name": "My name is 342"} + + {"id": "343", "name": "My name is 343"} + + {"id": "344", "name": "My name is 344"} + + {"id": "345", "name": "My name is 345"} + + {"id": "346", "name": "My name is 346"} + + {"id": "347", "name": "My name is 347"} + + {"id": "348", "name": "My name is 348"} + + {"id": "349", "name": "My name is 349"} + + {"id": "350", "name": "My name is 350"} + + {"id": "351", "name": "My name is 351"} + + {"id": "352", "name": "My name is 352"} + + {"id": "353", "name": "My name is 353"} + + {"id": "354", "name": "My name is 354"} + + {"id": "355", "name": "My name is 355"} + + {"id": "356", "name": "My name is 356"} + + {"id": "357", "name": "My name is 357"} + + {"id": "358", "name": "My name is 358"} + + {"id": "359", "name": "My name is 359"} + + {"id": "360", "name": "My name is 360"} + + {"id": "361", "name": "My name is 361"} + + {"id": "362", "name": "My name is 362"} + + {"id": "363", "name": "My name is 363"} + + {"id": "364", "name": "My name is 364"} + + {"id": "365", "name": "My name is 365"} + + {"id": "366", "name": "My name is 366"} + + {"id": "367", "name": "My name is 367"} + + {"id": "368", "name": "My name is 368"} + + {"id": "369", "name": "My name is 369"} + + {"id": "370", "name": "My name is 370"} + + {"id": "371", "name": "My name is 371"} + + {"id": "372", "name": "My name is 372"} + + {"id": "373", "name": "My name is 373"} + + {"id": "374", "name": "My name is 374"} + + {"id": "375", "name": "My name is 375"} + + {"id": "376", "name": "My name is 376"} + + {"id": "377", "name": "My name is 377"} + + {"id": "378", "name": "My name is 378"} + + {"id": "379", "name": "My name is 379"} + + {"id": "380", "name": "My name is 380"} + + {"id": "381", "name": "My name is 381"} + + {"id": "382", "name": "My name is 382"} + + {"id": "383", "name": "My name is 383"} + + {"id": "384", "name": "My name is 384"} + + {"id": "385", "name": "My name is 385"} + + {"id": "386", "name": "My name is 386"} + + {"id": "387", "name": "My name is 387"} + + {"id": "388", "name": "My name is 388"} + + {"id": "389", "name": "My name is 389"} + + {"id": "390", "name": "My name is 390"} + + {"id": "391", "name": "My name is 391"} + + {"id": "392", "name": "My name is 392"} + + {"id": "393", "name": "My name is 393"} + + {"id": "394", "name": "My name is 394"} + + {"id": "395", "name": "My name is 395"} + + {"id": "396", "name": "My name is 396"} + + {"id": "397", "name": "My name is 397"} + + {"id": "398", "name": "My name is 398"} + + {"id": "399", "name": "My name is 399"} + + {"id": "400", "name": "My name is 400"} + + {"id": "401", "name": "My name is 401"} + + {"id": "402", "name": "My name is 402"} + + {"id": "403", "name": "My name is 403"} + + {"id": "404", "name": "My name is 404"} + + {"id": "405", "name": "My name is 405"} + + {"id": "406", "name": "My name is 406"} + + {"id": "407", "name": "My name is 407"} + + {"id": "408", "name": "My name is 408"} + + {"id": "409", "name": "My name is 409"} + + {"id": "410", "name": "My name is 410"} + + {"id": "411", "name": "My name is 411"} + + {"id": "412", "name": "My name is 412"} + + {"id": "413", "name": "My name is 413"} + + {"id": "414", "name": "My name is 414"} + + {"id": "415", "name": "My name is 415"} + + {"id": "416", "name": "My name is 416"} + + {"id": "417", "name": "My name is 417"} + + {"id": "418", "name": "My name is 418"} + + {"id": "419", "name": "My name is 419"} + + {"id": "420", "name": "My name is 420"} + + {"id": "421", "name": "My name is 421"} + + {"id": "422", "name": "My name is 422"} + + {"id": "423", "name": "My name is 423"} + + {"id": "424", "name": "My name is 424"} + + {"id": "425", "name": "My name is 425"} + + {"id": "426", "name": "My name is 426"} + + {"id": "427", "name": "My name is 427"} + + {"id": "428", "name": "My name is 428"} + + {"id": "429", "name": "My name is 429"} + + {"id": "430", "name": "My name is 430"} + + {"id": "431", "name": "My name is 431"} + + {"id": "432", "name": "My name is 432"} + + {"id": "433", "name": "My name is 433"} + + {"id": "434", "name": "My name is 434"} + + {"id": "435", "name": "My name is 435"} + + {"id": "436", "name": "My name is 436"} + + {"id": "437", "name": "My name is 437"} + + {"id": "438", "name": "My name is 438"} + + {"id": "439", "name": "My name is 439"} + + {"id": "440", "name": "My name is 440"} + + {"id": "441", "name": "My name is 441"} + + {"id": "442", "name": "My name is 442"} + + {"id": "443", "name": "My name is 443"} + + {"id": "444", "name": "My name is 444"} + + {"id": "445", "name": "My name is 445"} + + {"id": "446", "name": "My name is 446"} + + {"id": "447", "name": "My name is 447"} + + {"id": "448", "name": "My name is 448"} + + {"id": "449", "name": "My name is 449"} + + {"id": "450", "name": "My name is 450"} + + {"id": "451", "name": "My name is 451"} + + {"id": "452", "name": "My name is 452"} + + {"id": "453", "name": "My name is 453"} + + {"id": "454", "name": "My name is 454"} + + {"id": "455", "name": "My name is 455"} + + {"id": "456", "name": "My name is 456"} + + {"id": "457", "name": "My name is 457"} + + {"id": "458", "name": "My name is 458"} + + {"id": "459", "name": "My name is 459"} + + {"id": "460", "name": "My name is 460"} + + {"id": "461", "name": "My name is 461"} + + {"id": "462", "name": "My name is 462"} + + {"id": "463", "name": "My name is 463"} + + {"id": "464", "name": "My name is 464"} + + {"id": "465", "name": "My name is 465"} + + {"id": "466", "name": "My name is 466"} + + {"id": "467", "name": "My name is 467"} + + {"id": "468", "name": "My name is 468"} + + {"id": "469", "name": "My name is 469"} + + {"id": "470", "name": "My name is 470"} + + {"id": "471", "name": "My name is 471"} + + {"id": "472", "name": "My name is 472"} + + {"id": "473", "name": "My name is 473"} + + {"id": "474", "name": "My name is 474"} + + {"id": "475", "name": "My name is 475"} + + {"id": "476", "name": "My name is 476"} + + {"id": "477", "name": "My name is 477"} + + {"id": "478", "name": "My name is 478"} + + {"id": "479", "name": "My name is 479"} + + {"id": "480", "name": "My name is 480"} + + {"id": "481", "name": "My name is 481"} + + {"id": "482", "name": "My name is 482"} + + {"id": "483", "name": "My name is 483"} + + {"id": "484", "name": "My name is 484"} + + {"id": "485", "name": "My name is 485"} + + {"id": "486", "name": "My name is 486"} + + {"id": "487", "name": "My name is 487"} + + {"id": "488", "name": "My name is 488"} + + {"id": "489", "name": "My name is 489"} + + {"id": "490", "name": "My name is 490"} + + {"id": "491", "name": "My name is 491"} + + {"id": "492", "name": "My name is 492"} + + {"id": "493", "name": "My name is 493"} + + {"id": "494", "name": "My name is 494"} + + {"id": "495", "name": "My name is 495"} + + {"id": "496", "name": "My name is 496"} + + {"id": "497", "name": "My name is 497"} + + {"id": "498", "name": "My name is 498"} + + {"id": "499", "name": "My name is 499"} + + {"id": "500", "name": "My name is 500"} + + {"id": "501", "name": "My name is 501"} + + {"id": "502", "name": "My name is 502"} + + {"id": "503", "name": "My name is 503"} + + {"id": "504", "name": "My name is 504"} + + {"id": "505", "name": "My name is 505"} + + {"id": "506", "name": "My name is 506"} + + {"id": "507", "name": "My name is 507"} + + {"id": "508", "name": "My name is 508"} + + {"id": "509", "name": "My name is 509"} + + {"id": "510", "name": "My name is 510"} + + {"id": "511", "name": "My name is 511"} + + {"id": "512", "name": "My name is 512"} + + {"id": "513", "name": "My name is 513"} + + {"id": "514", "name": "My name is 514"} + + {"id": "515", "name": "My name is 515"} + + {"id": "516", "name": "My name is 516"} + + {"id": "517", "name": "My name is 517"} + + {"id": "518", "name": "My name is 518"} + + {"id": "519", "name": "My name is 519"} + + {"id": "520", "name": "My name is 520"} + + {"id": "521", "name": "My name is 521"} + + {"id": "522", "name": "My name is 522"} + + {"id": "523", "name": "My name is 523"} + + {"id": "524", "name": "My name is 524"} + + {"id": "525", "name": "My name is 525"} + + {"id": "526", "name": "My name is 526"} + + {"id": "527", "name": "My name is 527"} + + {"id": "528", "name": "My name is 528"} + + {"id": "529", "name": "My name is 529"} + + {"id": "530", "name": "My name is 530"} + + {"id": "531", "name": "My name is 531"} + + {"id": "532", "name": "My name is 532"} + + {"id": "533", "name": "My name is 533"} + + {"id": "534", "name": "My name is 534"} + + {"id": "535", "name": "My name is 535"} + + {"id": "536", "name": "My name is 536"} + + {"id": "537", "name": "My name is 537"} + + {"id": "538", "name": "My name is 538"} + + {"id": "539", "name": "My name is 539"} + + {"id": "540", "name": "My name is 540"} + + {"id": "541", "name": "My name is 541"} + + {"id": "542", "name": "My name is 542"} + + {"id": "543", "name": "My name is 543"} + + {"id": "544", "name": "My name is 544"} + + {"id": "545", "name": "My name is 545"} + + {"id": "546", "name": "My name is 546"} + + {"id": "547", "name": "My name is 547"} + + {"id": "548", "name": "My name is 548"} + + {"id": "549", "name": "My name is 549"} + + {"id": "550", "name": "My name is 550"} + + {"id": "551", "name": "My name is 551"} + + {"id": "552", "name": "My name is 552"} + + {"id": "553", "name": "My name is 553"} + + {"id": "554", "name": "My name is 554"} + + {"id": "555", "name": "My name is 555"} + + {"id": "556", "name": "My name is 556"} + + {"id": "557", "name": "My name is 557"} + + {"id": "558", "name": "My name is 558"} + + {"id": "559", "name": "My name is 559"} + + {"id": "560", "name": "My name is 560"} + + {"id": "561", "name": "My name is 561"} + + {"id": "562", "name": "My name is 562"} + + {"id": "563", "name": "My name is 563"} + + {"id": "564", "name": "My name is 564"} + + {"id": "565", "name": "My name is 565"} + + {"id": "566", "name": "My name is 566"} + + {"id": "567", "name": "My name is 567"} + + {"id": "568", "name": "My name is 568"} + + {"id": "569", "name": "My name is 569"} + + {"id": "570", "name": "My name is 570"} + + {"id": "571", "name": "My name is 571"} + + {"id": "572", "name": "My name is 572"} + + {"id": "573", "name": "My name is 573"} + + {"id": "574", "name": "My name is 574"} + + {"id": "575", "name": "My name is 575"} + + {"id": "576", "name": "My name is 576"} + + {"id": "577", "name": "My name is 577"} + + {"id": "578", "name": "My name is 578"} + + {"id": "579", "name": "My name is 579"} + + {"id": "580", "name": "My name is 580"} + + {"id": "581", "name": "My name is 581"} + + {"id": "582", "name": "My name is 582"} + + {"id": "583", "name": "My name is 583"} + + {"id": "584", "name": "My name is 584"} + + {"id": "585", "name": "My name is 585"} + + {"id": "586", "name": "My name is 586"} + + {"id": "587", "name": "My name is 587"} + + {"id": "588", "name": "My name is 588"} + + {"id": "589", "name": "My name is 589"} + + {"id": "590", "name": "My name is 590"} + + {"id": "591", "name": "My name is 591"} + + {"id": "592", "name": "My name is 592"} + + {"id": "593", "name": "My name is 593"} + + {"id": "594", "name": "My name is 594"} + + {"id": "595", "name": "My name is 595"} + + {"id": "596", "name": "My name is 596"} + + {"id": "597", "name": "My name is 597"} + + {"id": "598", "name": "My name is 598"} + + {"id": "599", "name": "My name is 599"} + + {"id": "600", "name": "My name is 600"} + + {"id": "601", "name": "My name is 601"} + + {"id": "602", "name": "My name is 602"} + + {"id": "603", "name": "My name is 603"} + + {"id": "604", "name": "My name is 604"} + + {"id": "605", "name": "My name is 605"} + + {"id": "606", "name": "My name is 606"} + + {"id": "607", "name": "My name is 607"} + + {"id": "608", "name": "My name is 608"} + + {"id": "609", "name": "My name is 609"} + + {"id": "610", "name": "My name is 610"} + + {"id": "611", "name": "My name is 611"} + + {"id": "612", "name": "My name is 612"} + + {"id": "613", "name": "My name is 613"} + + {"id": "614", "name": "My name is 614"} + + {"id": "615", "name": "My name is 615"} + + {"id": "616", "name": "My name is 616"} + + {"id": "617", "name": "My name is 617"} + + {"id": "618", "name": "My name is 618"} + + {"id": "619", "name": "My name is 619"} + + {"id": "620", "name": "My name is 620"} + + {"id": "621", "name": "My name is 621"} + + {"id": "622", "name": "My name is 622"} + + {"id": "623", "name": "My name is 623"} + + {"id": "624", "name": "My name is 624"} + + {"id": "625", "name": "My name is 625"} + + {"id": "626", "name": "My name is 626"} + + {"id": "627", "name": "My name is 627"} + + {"id": "628", "name": "My name is 628"} + + {"id": "629", "name": "My name is 629"} + + {"id": "630", "name": "My name is 630"} + + {"id": "631", "name": "My name is 631"} + + {"id": "632", "name": "My name is 632"} + + {"id": "633", "name": "My name is 633"} + + {"id": "634", "name": "My name is 634"} + + {"id": "635", "name": "My name is 635"} + + {"id": "636", "name": "My name is 636"} + + {"id": "637", "name": "My name is 637"} + + {"id": "638", "name": "My name is 638"} + + {"id": "639", "name": "My name is 639"} + + {"id": "640", "name": "My name is 640"} + + {"id": "641", "name": "My name is 641"} + + {"id": "642", "name": "My name is 642"} + + {"id": "643", "name": "My name is 643"} + + {"id": "644", "name": "My name is 644"} + + {"id": "645", "name": "My name is 645"} + + {"id": "646", "name": "My name is 646"} + + {"id": "647", "name": "My name is 647"} + + {"id": "648", "name": "My name is 648"} + + {"id": "649", "name": "My name is 649"} + + {"id": "650", "name": "My name is 650"} + + {"id": "651", "name": "My name is 651"} + + {"id": "652", "name": "My name is 652"} + + {"id": "653", "name": "My name is 653"} + + {"id": "654", "name": "My name is 654"} + + {"id": "655", "name": "My name is 655"} + + {"id": "656", "name": "My name is 656"} + + {"id": "657", "name": "My name is 657"} + + {"id": "658", "name": "My name is 658"} + + {"id": "659", "name": "My name is 659"} + + {"id": "660", "name": "My name is 660"} + + {"id": "661", "name": "My name is 661"} + + {"id": "662", "name": "My name is 662"} + + {"id": "663", "name": "My name is 663"} + + {"id": "664", "name": "My name is 664"} + + {"id": "665", "name": "My name is 665"} + + {"id": "666", "name": "My name is 666"} + + {"id": "667", "name": "My name is 667"} + + {"id": "668", "name": "My name is 668"} + + {"id": "669", "name": "My name is 669"} + + {"id": "670", "name": "My name is 670"} + + {"id": "671", "name": "My name is 671"} + + {"id": "672", "name": "My name is 672"} + + {"id": "673", "name": "My name is 673"} + + {"id": "674", "name": "My name is 674"} + + {"id": "675", "name": "My name is 675"} + + {"id": "676", "name": "My name is 676"} + + {"id": "677", "name": "My name is 677"} + + {"id": "678", "name": "My name is 678"} + + {"id": "679", "name": "My name is 679"} + + {"id": "680", "name": "My name is 680"} + + {"id": "681", "name": "My name is 681"} + + {"id": "682", "name": "My name is 682"} + + {"id": "683", "name": "My name is 683"} + + {"id": "684", "name": "My name is 684"} + + {"id": "685", "name": "My name is 685"} + + {"id": "686", "name": "My name is 686"} + + {"id": "687", "name": "My name is 687"} + + {"id": "688", "name": "My name is 688"} + + {"id": "689", "name": "My name is 689"} + + {"id": "690", "name": "My name is 690"} + + {"id": "691", "name": "My name is 691"} + + {"id": "692", "name": "My name is 692"} + + {"id": "693", "name": "My name is 693"} + + {"id": "694", "name": "My name is 694"} + + {"id": "695", "name": "My name is 695"} + + {"id": "696", "name": "My name is 696"} + + {"id": "697", "name": "My name is 697"} + + {"id": "698", "name": "My name is 698"} + + {"id": "699", "name": "My name is 699"} + + {"id": "700", "name": "My name is 700"} + + {"id": "701", "name": "My name is 701"} + + {"id": "702", "name": "My name is 702"} + + {"id": "703", "name": "My name is 703"} + + {"id": "704", "name": "My name is 704"} + + {"id": "705", "name": "My name is 705"} + + {"id": "706", "name": "My name is 706"} + + {"id": "707", "name": "My name is 707"} + + {"id": "708", "name": "My name is 708"} + + {"id": "709", "name": "My name is 709"} + + {"id": "710", "name": "My name is 710"} + + {"id": "711", "name": "My name is 711"} + + {"id": "712", "name": "My name is 712"} + + {"id": "713", "name": "My name is 713"} + + {"id": "714", "name": "My name is 714"} + + {"id": "715", "name": "My name is 715"} + + {"id": "716", "name": "My name is 716"} + + {"id": "717", "name": "My name is 717"} + + {"id": "718", "name": "My name is 718"} + + {"id": "719", "name": "My name is 719"} + + {"id": "720", "name": "My name is 720"} + + {"id": "721", "name": "My name is 721"} + + {"id": "722", "name": "My name is 722"} + + {"id": "723", "name": "My name is 723"} + + {"id": "724", "name": "My name is 724"} + + {"id": "725", "name": "My name is 725"} + + {"id": "726", "name": "My name is 726"} + + {"id": "727", "name": "My name is 727"} + + {"id": "728", "name": "My name is 728"} + + {"id": "729", "name": "My name is 729"} + + {"id": "730", "name": "My name is 730"} + + {"id": "731", "name": "My name is 731"} + + {"id": "732", "name": "My name is 732"} + + {"id": "733", "name": "My name is 733"} + + {"id": "734", "name": "My name is 734"} + + {"id": "735", "name": "My name is 735"} + + {"id": "736", "name": "My name is 736"} + + {"id": "737", "name": "My name is 737"} + + {"id": "738", "name": "My name is 738"} + + {"id": "739", "name": "My name is 739"} + + {"id": "740", "name": "My name is 740"} + + {"id": "741", "name": "My name is 741"} + + {"id": "742", "name": "My name is 742"} + + {"id": "743", "name": "My name is 743"} + + {"id": "744", "name": "My name is 744"} + + {"id": "745", "name": "My name is 745"} + + {"id": "746", "name": "My name is 746"} + + {"id": "747", "name": "My name is 747"} + + {"id": "748", "name": "My name is 748"} + + {"id": "749", "name": "My name is 749"} + + {"id": "750", "name": "My name is 750"} + + {"id": "751", "name": "My name is 751"} + + {"id": "752", "name": "My name is 752"} + + {"id": "753", "name": "My name is 753"} + + {"id": "754", "name": "My name is 754"} + + {"id": "755", "name": "My name is 755"} + + {"id": "756", "name": "My name is 756"} + + {"id": "757", "name": "My name is 757"} + + {"id": "758", "name": "My name is 758"} + + {"id": "759", "name": "My name is 759"} + + {"id": "760", "name": "My name is 760"} + + {"id": "761", "name": "My name is 761"} + + {"id": "762", "name": "My name is 762"} + + {"id": "763", "name": "My name is 763"} + + {"id": "764", "name": "My name is 764"} + + {"id": "765", "name": "My name is 765"} + + {"id": "766", "name": "My name is 766"} + + {"id": "767", "name": "My name is 767"} + + {"id": "768", "name": "My name is 768"} + + {"id": "769", "name": "My name is 769"} + + {"id": "770", "name": "My name is 770"} + + {"id": "771", "name": "My name is 771"} + + {"id": "772", "name": "My name is 772"} + + {"id": "773", "name": "My name is 773"} + + {"id": "774", "name": "My name is 774"} + + {"id": "775", "name": "My name is 775"} + + {"id": "776", "name": "My name is 776"} + + {"id": "777", "name": "My name is 777"} + + {"id": "778", "name": "My name is 778"} + + {"id": "779", "name": "My name is 779"} + + {"id": "780", "name": "My name is 780"} + + {"id": "781", "name": "My name is 781"} + + {"id": "782", "name": "My name is 782"} + + {"id": "783", "name": "My name is 783"} + + {"id": "784", "name": "My name is 784"} + + {"id": "785", "name": "My name is 785"} + + {"id": "786", "name": "My name is 786"} + + {"id": "787", "name": "My name is 787"} + + {"id": "788", "name": "My name is 788"} + + {"id": "789", "name": "My name is 789"} + + {"id": "790", "name": "My name is 790"} + + {"id": "791", "name": "My name is 791"} + + {"id": "792", "name": "My name is 792"} + + {"id": "793", "name": "My name is 793"} + + {"id": "794", "name": "My name is 794"} + + {"id": "795", "name": "My name is 795"} + + {"id": "796", "name": "My name is 796"} + + {"id": "797", "name": "My name is 797"} + + {"id": "798", "name": "My name is 798"} + + {"id": "799", "name": "My name is 799"} + + {"id": "800", "name": "My name is 800"} + + {"id": "801", "name": "My name is 801"} + + {"id": "802", "name": "My name is 802"} + + {"id": "803", "name": "My name is 803"} + + {"id": "804", "name": "My name is 804"} + + {"id": "805", "name": "My name is 805"} + + {"id": "806", "name": "My name is 806"} + + {"id": "807", "name": "My name is 807"} + + {"id": "808", "name": "My name is 808"} + + {"id": "809", "name": "My name is 809"} + + {"id": "810", "name": "My name is 810"} + + {"id": "811", "name": "My name is 811"} + + {"id": "812", "name": "My name is 812"} + + {"id": "813", "name": "My name is 813"} + + {"id": "814", "name": "My name is 814"} + + {"id": "815", "name": "My name is 815"} + + {"id": "816", "name": "My name is 816"} + + {"id": "817", "name": "My name is 817"} + + {"id": "818", "name": "My name is 818"} + + {"id": "819", "name": "My name is 819"} + + {"id": "820", "name": "My name is 820"} + + {"id": "821", "name": "My name is 821"} + + {"id": "822", "name": "My name is 822"} + + {"id": "823", "name": "My name is 823"} + + {"id": "824", "name": "My name is 824"} + + {"id": "825", "name": "My name is 825"} + + {"id": "826", "name": "My name is 826"} + + {"id": "827", "name": "My name is 827"} + + {"id": "828", "name": "My name is 828"} + + {"id": "829", "name": "My name is 829"} + + {"id": "830", "name": "My name is 830"} + + {"id": "831", "name": "My name is 831"} + + {"id": "832", "name": "My name is 832"} + + {"id": "833", "name": "My name is 833"} + + {"id": "834", "name": "My name is 834"} + + {"id": "835", "name": "My name is 835"} + + {"id": "836", "name": "My name is 836"} + + {"id": "837", "name": "My name is 837"} + + {"id": "838", "name": "My name is 838"} + + {"id": "839", "name": "My name is 839"} + + {"id": "840", "name": "My name is 840"} + + {"id": "841", "name": "My name is 841"} + + {"id": "842", "name": "My name is 842"} + + {"id": "843", "name": "My name is 843"} + + {"id": "844", "name": "My name is 844"} + + {"id": "845", "name": "My name is 845"} + + {"id": "846", "name": "My name is 846"} + + {"id": "847", "name": "My name is 847"} + + {"id": "848", "name": "My name is 848"} + + {"id": "849", "name": "My name is 849"} + + {"id": "850", "name": "My name is 850"} + + {"id": "851", "name": "My name is 851"} + + {"id": "852", "name": "My name is 852"} + + {"id": "853", "name": "My name is 853"} + + {"id": "854", "name": "My name is 854"} + + {"id": "855", "name": "My name is 855"} + + {"id": "856", "name": "My name is 856"} + + {"id": "857", "name": "My name is 857"} + + {"id": "858", "name": "My name is 858"} + + {"id": "859", "name": "My name is 859"} + + {"id": "860", "name": "My name is 860"} + + {"id": "861", "name": "My name is 861"} + + {"id": "862", "name": "My name is 862"} + + {"id": "863", "name": "My name is 863"} + + {"id": "864", "name": "My name is 864"} + + {"id": "865", "name": "My name is 865"} + + {"id": "866", "name": "My name is 866"} + + {"id": "867", "name": "My name is 867"} + + {"id": "868", "name": "My name is 868"} + + {"id": "869", "name": "My name is 869"} + + {"id": "870", "name": "My name is 870"} + + {"id": "871", "name": "My name is 871"} + + {"id": "872", "name": "My name is 872"} + + {"id": "873", "name": "My name is 873"} + + {"id": "874", "name": "My name is 874"} + + {"id": "875", "name": "My name is 875"} + + {"id": "876", "name": "My name is 876"} + + {"id": "877", "name": "My name is 877"} + + {"id": "878", "name": "My name is 878"} + + {"id": "879", "name": "My name is 879"} + + {"id": "880", "name": "My name is 880"} + + {"id": "881", "name": "My name is 881"} + + {"id": "882", "name": "My name is 882"} + + {"id": "883", "name": "My name is 883"} + + {"id": "884", "name": "My name is 884"} + + {"id": "885", "name": "My name is 885"} + + {"id": "886", "name": "My name is 886"} + + {"id": "887", "name": "My name is 887"} + + {"id": "888", "name": "My name is 888"} + + {"id": "889", "name": "My name is 889"} + + {"id": "890", "name": "My name is 890"} + + {"id": "891", "name": "My name is 891"} + + {"id": "892", "name": "My name is 892"} + + {"id": "893", "name": "My name is 893"} + + {"id": "894", "name": "My name is 894"} + + {"id": "895", "name": "My name is 895"} + + {"id": "896", "name": "My name is 896"} + + {"id": "897", "name": "My name is 897"} + + {"id": "898", "name": "My name is 898"} + + {"id": "899", "name": "My name is 899"} + + {"id": "900", "name": "My name is 900"} + + {"id": "901", "name": "My name is 901"} + + {"id": "902", "name": "My name is 902"} + + {"id": "903", "name": "My name is 903"} + + {"id": "904", "name": "My name is 904"} + + {"id": "905", "name": "My name is 905"} + + {"id": "906", "name": "My name is 906"} + + {"id": "907", "name": "My name is 907"} + + {"id": "908", "name": "My name is 908"} + + {"id": "909", "name": "My name is 909"} + + {"id": "910", "name": "My name is 910"} + + {"id": "911", "name": "My name is 911"} + + {"id": "912", "name": "My name is 912"} + + {"id": "913", "name": "My name is 913"} + + {"id": "914", "name": "My name is 914"} + + {"id": "915", "name": "My name is 915"} + + {"id": "916", "name": "My name is 916"} + + {"id": "917", "name": "My name is 917"} + + {"id": "918", "name": "My name is 918"} + + {"id": "919", "name": "My name is 919"} + + {"id": "920", "name": "My name is 920"} + + {"id": "921", "name": "My name is 921"} + + {"id": "922", "name": "My name is 922"} + + {"id": "923", "name": "My name is 923"} + + {"id": "924", "name": "My name is 924"} + + {"id": "925", "name": "My name is 925"} + + {"id": "926", "name": "My name is 926"} + + {"id": "927", "name": "My name is 927"} + + {"id": "928", "name": "My name is 928"} + + {"id": "929", "name": "My name is 929"} + + {"id": "930", "name": "My name is 930"} + + {"id": "931", "name": "My name is 931"} + + {"id": "932", "name": "My name is 932"} + + {"id": "933", "name": "My name is 933"} + + {"id": "934", "name": "My name is 934"} + + {"id": "935", "name": "My name is 935"} + + {"id": "936", "name": "My name is 936"} + + {"id": "937", "name": "My name is 937"} + + {"id": "938", "name": "My name is 938"} + + {"id": "939", "name": "My name is 939"} + + {"id": "940", "name": "My name is 940"} + + {"id": "941", "name": "My name is 941"} + + {"id": "942", "name": "My name is 942"} + + {"id": "943", "name": "My name is 943"} + + {"id": "944", "name": "My name is 944"} + + {"id": "945", "name": "My name is 945"} + + {"id": "946", "name": "My name is 946"} + + {"id": "947", "name": "My name is 947"} + + {"id": "948", "name": "My name is 948"} + + {"id": "949", "name": "My name is 949"} + + {"id": "950", "name": "My name is 950"} + + {"id": "951", "name": "My name is 951"} + + {"id": "952", "name": "My name is 952"} + + {"id": "953", "name": "My name is 953"} + + {"id": "954", "name": "My name is 954"} + + {"id": "955", "name": "My name is 955"} + + {"id": "956", "name": "My name is 956"} + + {"id": "957", "name": "My name is 957"} + + {"id": "958", "name": "My name is 958"} + + {"id": "959", "name": "My name is 959"} + + {"id": "960", "name": "My name is 960"} + + {"id": "961", "name": "My name is 961"} + + {"id": "962", "name": "My name is 962"} + + {"id": "963", "name": "My name is 963"} + + {"id": "964", "name": "My name is 964"} + + {"id": "965", "name": "My name is 965"} + + {"id": "966", "name": "My name is 966"} + + {"id": "967", "name": "My name is 967"} + + {"id": "968", "name": "My name is 968"} + + {"id": "969", "name": "My name is 969"} + + {"id": "970", "name": "My name is 970"} + + {"id": "971", "name": "My name is 971"} + + {"id": "972", "name": "My name is 972"} + + {"id": "973", "name": "My name is 973"} + + {"id": "974", "name": "My name is 974"} + + {"id": "975", "name": "My name is 975"} + + {"id": "976", "name": "My name is 976"} + + {"id": "977", "name": "My name is 977"} + + {"id": "978", "name": "My name is 978"} + + {"id": "979", "name": "My name is 979"} + + {"id": "980", "name": "My name is 980"} + + {"id": "981", "name": "My name is 981"} + + {"id": "982", "name": "My name is 982"} + + {"id": "983", "name": "My name is 983"} + + {"id": "984", "name": "My name is 984"} + + {"id": "985", "name": "My name is 985"} + + {"id": "986", "name": "My name is 986"} + + {"id": "987", "name": "My name is 987"} + + {"id": "988", "name": "My name is 988"} + + {"id": "989", "name": "My name is 989"} + + {"id": "990", "name": "My name is 990"} + + {"id": "991", "name": "My name is 991"} + + {"id": "992", "name": "My name is 992"} + + {"id": "993", "name": "My name is 993"} + + {"id": "994", "name": "My name is 994"} + + {"id": "995", "name": "My name is 995"} + + {"id": "996", "name": "My name is 996"} + + {"id": "997", "name": "My name is 997"} + + {"id": "998", "name": "My name is 998"} + + {"id": "999", "name": "My name is 999"} + + {"id": "1000", "name": "My name is 1000"} + + {"id": "1001", "name": "My name is 1001"} + + {"id": "1002", "name": "My name is 1002"} + + {"id": "1003", "name": "My name is 1003"} + + {"id": "1004", "name": "My name is 1004"} + + {"id": "1005", "name": "My name is 1005"} + + {"id": "1006", "name": "My name is 1006"} + + {"id": "1007", "name": "My name is 1007"} + + {"id": "1008", "name": "My name is 1008"} + + {"id": "1009", "name": "My name is 1009"} + + {"id": "1010", "name": "My name is 1010"} + + {"id": "1011", "name": "My name is 1011"} + + {"id": "1012", "name": "My name is 1012"} + + {"id": "1013", "name": "My name is 1013"} + + {"id": "1014", "name": "My name is 1014"} + + {"id": "1015", "name": "My name is 1015"} + + {"id": "1016", "name": "My name is 1016"} + + {"id": "1017", "name": "My name is 1017"} + + {"id": "1018", "name": "My name is 1018"} + + {"id": "1019", "name": "My name is 1019"} + + {"id": "1020", "name": "My name is 1020"} + + {"id": "1021", "name": "My name is 1021"} + + {"id": "1022", "name": "My name is 1022"} + + {"id": "1023", "name": "My name is 1023"} + + {"id": "1024", "name": "My name is 1024"} + + {"id": "1025", "name": "My name is 1025"} + + {"id": "1026", "name": "My name is 1026"} + + {"id": "1027", "name": "My name is 1027"} + + {"id": "1028", "name": "My name is 1028"} + + {"id": "1029", "name": "My name is 1029"} + + {"id": "1030", "name": "My name is 1030"} + + {"id": "1031", "name": "My name is 1031"} + + {"id": "1032", "name": "My name is 1032"} + + {"id": "1033", "name": "My name is 1033"} + + {"id": "1034", "name": "My name is 1034"} + + {"id": "1035", "name": "My name is 1035"} + + {"id": "1036", "name": "My name is 1036"} + + {"id": "1037", "name": "My name is 1037"} + + {"id": "1038", "name": "My name is 1038"} + + {"id": "1039", "name": "My name is 1039"} + + {"id": "1040", "name": "My name is 1040"} + + {"id": "1041", "name": "My name is 1041"} + + {"id": "1042", "name": "My name is 1042"} + + {"id": "1043", "name": "My name is 1043"} + + {"id": "1044", "name": "My name is 1044"} + + {"id": "1045", "name": "My name is 1045"} + + {"id": "1046", "name": "My name is 1046"} + + {"id": "1047", "name": "My name is 1047"} + + {"id": "1048", "name": "My name is 1048"} + + {"id": "1049", "name": "My name is 1049"} + + {"id": "1050", "name": "My name is 1050"} + + {"id": "1051", "name": "My name is 1051"} + + {"id": "1052", "name": "My name is 1052"} + + {"id": "1053", "name": "My name is 1053"} + + {"id": "1054", "name": "My name is 1054"} + + {"id": "1055", "name": "My name is 1055"} + + {"id": "1056", "name": "My name is 1056"} + + {"id": "1057", "name": "My name is 1057"} + + {"id": "1058", "name": "My name is 1058"} + + {"id": "1059", "name": "My name is 1059"} + + {"id": "1060", "name": "My name is 1060"} + + {"id": "1061", "name": "My name is 1061"} + + {"id": "1062", "name": "My name is 1062"} + + {"id": "1063", "name": "My name is 1063"} + + {"id": "1064", "name": "My name is 1064"} + + {"id": "1065", "name": "My name is 1065"} + + {"id": "1066", "name": "My name is 1066"} + + {"id": "1067", "name": "My name is 1067"} + + {"id": "1068", "name": "My name is 1068"} + + {"id": "1069", "name": "My name is 1069"} + + {"id": "1070", "name": "My name is 1070"} + + {"id": "1071", "name": "My name is 1071"} + + {"id": "1072", "name": "My name is 1072"} + + {"id": "1073", "name": "My name is 1073"} + + {"id": "1074", "name": "My name is 1074"} + + {"id": "1075", "name": "My name is 1075"} + + {"id": "1076", "name": "My name is 1076"} + + {"id": "1077", "name": "My name is 1077"} + + {"id": "1078", "name": "My name is 1078"} + + {"id": "1079", "name": "My name is 1079"} + + {"id": "1080", "name": "My name is 1080"} + + {"id": "1081", "name": "My name is 1081"} + + {"id": "1082", "name": "My name is 1082"} + + {"id": "1083", "name": "My name is 1083"} + + {"id": "1084", "name": "My name is 1084"} + + {"id": "1085", "name": "My name is 1085"} + + {"id": "1086", "name": "My name is 1086"} + + {"id": "1087", "name": "My name is 1087"} + + {"id": "1088", "name": "My name is 1088"} + + {"id": "1089", "name": "My name is 1089"} + + {"id": "1090", "name": "My name is 1090"} + + {"id": "1091", "name": "My name is 1091"} + + {"id": "1092", "name": "My name is 1092"} + + {"id": "1093", "name": "My name is 1093"} + + {"id": "1094", "name": "My name is 1094"} + + {"id": "1095", "name": "My name is 1095"} + + {"id": "1096", "name": "My name is 1096"} + + {"id": "1097", "name": "My name is 1097"} + + {"id": "1098", "name": "My name is 1098"} + + {"id": "1099", "name": "My name is 1099"} + + {"id": "1100", "name": "My name is 1100"} + + {"id": "1101", "name": "My name is 1101"} + + {"id": "1102", "name": "My name is 1102"} + + {"id": "1103", "name": "My name is 1103"} + + {"id": "1104", "name": "My name is 1104"} + + {"id": "1105", "name": "My name is 1105"} + + {"id": "1106", "name": "My name is 1106"} + + {"id": "1107", "name": "My name is 1107"} + + {"id": "1108", "name": "My name is 1108"} + + {"id": "1109", "name": "My name is 1109"} + + {"id": "1110", "name": "My name is 1110"} + + {"id": "1111", "name": "My name is 1111"} + + {"id": "1112", "name": "My name is 1112"} + + {"id": "1113", "name": "My name is 1113"} + + {"id": "1114", "name": "My name is 1114"} + + {"id": "1115", "name": "My name is 1115"} + + {"id": "1116", "name": "My name is 1116"} + + {"id": "1117", "name": "My name is 1117"} + + {"id": "1118", "name": "My name is 1118"} + + {"id": "1119", "name": "My name is 1119"} + + {"id": "1120", "name": "My name is 1120"} + + {"id": "1121", "name": "My name is 1121"} + + {"id": "1122", "name": "My name is 1122"} + + {"id": "1123", "name": "My name is 1123"} + + {"id": "1124", "name": "My name is 1124"} + + {"id": "1125", "name": "My name is 1125"} + + {"id": "1126", "name": "My name is 1126"} + + {"id": "1127", "name": "My name is 1127"} + + {"id": "1128", "name": "My name is 1128"} + + {"id": "1129", "name": "My name is 1129"} + + {"id": "1130", "name": "My name is 1130"} + + {"id": "1131", "name": "My name is 1131"} + + {"id": "1132", "name": "My name is 1132"} + + {"id": "1133", "name": "My name is 1133"} + + {"id": "1134", "name": "My name is 1134"} + + {"id": "1135", "name": "My name is 1135"} + + {"id": "1136", "name": "My name is 1136"} + + {"id": "1137", "name": "My name is 1137"} + + {"id": "1138", "name": "My name is 1138"} + + {"id": "1139", "name": "My name is 1139"} + + {"id": "1140", "name": "My name is 1140"} + + {"id": "1141", "name": "My name is 1141"} + + {"id": "1142", "name": "My name is 1142"} + + {"id": "1143", "name": "My name is 1143"} + + {"id": "1144", "name": "My name is 1144"} + + {"id": "1145", "name": "My name is 1145"} + + {"id": "1146", "name": "My name is 1146"} + + {"id": "1147", "name": "My name is 1147"} + + {"id": "1148", "name": "My name is 1148"} + + {"id": "1149", "name": "My name is 1149"} + + {"id": "1150", "name": "My name is 1150"} + + {"id": "1151", "name": "My name is 1151"} + + {"id": "1152", "name": "My name is 1152"} + + {"id": "1153", "name": "My name is 1153"} + + {"id": "1154", "name": "My name is 1154"} + + {"id": "1155", "name": "My name is 1155"} + + {"id": "1156", "name": "My name is 1156"} + + {"id": "1157", "name": "My name is 1157"} + + {"id": "1158", "name": "My name is 1158"} + + {"id": "1159", "name": "My name is 1159"} + + {"id": "1160", "name": "My name is 1160"} + + {"id": "1161", "name": "My name is 1161"} + + {"id": "1162", "name": "My name is 1162"} + + {"id": "1163", "name": "My name is 1163"} + + {"id": "1164", "name": "My name is 1164"} + + {"id": "1165", "name": "My name is 1165"} + + {"id": "1166", "name": "My name is 1166"} + + {"id": "1167", "name": "My name is 1167"} + + {"id": "1168", "name": "My name is 1168"} + + {"id": "1169", "name": "My name is 1169"} + + {"id": "1170", "name": "My name is 1170"} + + {"id": "1171", "name": "My name is 1171"} + + {"id": "1172", "name": "My name is 1172"} + + {"id": "1173", "name": "My name is 1173"} + + {"id": "1174", "name": "My name is 1174"} + + {"id": "1175", "name": "My name is 1175"} + + {"id": "1176", "name": "My name is 1176"} + + {"id": "1177", "name": "My name is 1177"} + + {"id": "1178", "name": "My name is 1178"} + + {"id": "1179", "name": "My name is 1179"} + + {"id": "1180", "name": "My name is 1180"} + + {"id": "1181", "name": "My name is 1181"} + + {"id": "1182", "name": "My name is 1182"} + + {"id": "1183", "name": "My name is 1183"} + + {"id": "1184", "name": "My name is 1184"} + + {"id": "1185", "name": "My name is 1185"} + + {"id": "1186", "name": "My name is 1186"} + + {"id": "1187", "name": "My name is 1187"} + + {"id": "1188", "name": "My name is 1188"} + + {"id": "1189", "name": "My name is 1189"} + + {"id": "1190", "name": "My name is 1190"} + + {"id": "1191", "name": "My name is 1191"} + + {"id": "1192", "name": "My name is 1192"} + + {"id": "1193", "name": "My name is 1193"} + + {"id": "1194", "name": "My name is 1194"} + + {"id": "1195", "name": "My name is 1195"} + + {"id": "1196", "name": "My name is 1196"} + + {"id": "1197", "name": "My name is 1197"} + + {"id": "1198", "name": "My name is 1198"} + + {"id": "1199", "name": "My name is 1199"} + + {"id": "1200", "name": "My name is 1200"} + + {"id": "1201", "name": "My name is 1201"} + + {"id": "1202", "name": "My name is 1202"} + + {"id": "1203", "name": "My name is 1203"} + + {"id": "1204", "name": "My name is 1204"} + + {"id": "1205", "name": "My name is 1205"} + + {"id": "1206", "name": "My name is 1206"} + + {"id": "1207", "name": "My name is 1207"} + + {"id": "1208", "name": "My name is 1208"} + + {"id": "1209", "name": "My name is 1209"} + + {"id": "1210", "name": "My name is 1210"} + + {"id": "1211", "name": "My name is 1211"} + + {"id": "1212", "name": "My name is 1212"} + + {"id": "1213", "name": "My name is 1213"} + + {"id": "1214", "name": "My name is 1214"} + + {"id": "1215", "name": "My name is 1215"} + + {"id": "1216", "name": "My name is 1216"} + + {"id": "1217", "name": "My name is 1217"} + + {"id": "1218", "name": "My name is 1218"} + + {"id": "1219", "name": "My name is 1219"} + + {"id": "1220", "name": "My name is 1220"} + + {"id": "1221", "name": "My name is 1221"} + + {"id": "1222", "name": "My name is 1222"} + + {"id": "1223", "name": "My name is 1223"} + + {"id": "1224", "name": "My name is 1224"} + + {"id": "1225", "name": "My name is 1225"} + + {"id": "1226", "name": "My name is 1226"} + + {"id": "1227", "name": "My name is 1227"} + + {"id": "1228", "name": "My name is 1228"} + + {"id": "1229", "name": "My name is 1229"} + + {"id": "1230", "name": "My name is 1230"} + + {"id": "1231", "name": "My name is 1231"} + + {"id": "1232", "name": "My name is 1232"} + + {"id": "1233", "name": "My name is 1233"} + + {"id": "1234", "name": "My name is 1234"} + + {"id": "1235", "name": "My name is 1235"} + + {"id": "1236", "name": "My name is 1236"} + + {"id": "1237", "name": "My name is 1237"} + + {"id": "1238", "name": "My name is 1238"} + + {"id": "1239", "name": "My name is 1239"} + + {"id": "1240", "name": "My name is 1240"} + + {"id": "1241", "name": "My name is 1241"} + + {"id": "1242", "name": "My name is 1242"} + + {"id": "1243", "name": "My name is 1243"} + + {"id": "1244", "name": "My name is 1244"} + + {"id": "1245", "name": "My name is 1245"} + + {"id": "1246", "name": "My name is 1246"} + + {"id": "1247", "name": "My name is 1247"} + + {"id": "1248", "name": "My name is 1248"} + + {"id": "1249", "name": "My name is 1249"} + + {"id": "1250", "name": "My name is 1250"} + + {"id": "1251", "name": "My name is 1251"} + + {"id": "1252", "name": "My name is 1252"} + + {"id": "1253", "name": "My name is 1253"} + + {"id": "1254", "name": "My name is 1254"} + + {"id": "1255", "name": "My name is 1255"} + + {"id": "1256", "name": "My name is 1256"} + + {"id": "1257", "name": "My name is 1257"} + + {"id": "1258", "name": "My name is 1258"} + + {"id": "1259", "name": "My name is 1259"} + + {"id": "1260", "name": "My name is 1260"} + + {"id": "1261", "name": "My name is 1261"} + + {"id": "1262", "name": "My name is 1262"} + + {"id": "1263", "name": "My name is 1263"} + + {"id": "1264", "name": "My name is 1264"} + + {"id": "1265", "name": "My name is 1265"} + + {"id": "1266", "name": "My name is 1266"} + + {"id": "1267", "name": "My name is 1267"} + + {"id": "1268", "name": "My name is 1268"} + + {"id": "1269", "name": "My name is 1269"} + + {"id": "1270", "name": "My name is 1270"} + + {"id": "1271", "name": "My name is 1271"} + + {"id": "1272", "name": "My name is 1272"} + + {"id": "1273", "name": "My name is 1273"} + + {"id": "1274", "name": "My name is 1274"} + + {"id": "1275", "name": "My name is 1275"} + + {"id": "1276", "name": "My name is 1276"} + + {"id": "1277", "name": "My name is 1277"} + + {"id": "1278", "name": "My name is 1278"} + + {"id": "1279", "name": "My name is 1279"} + + {"id": "1280", "name": "My name is 1280"} + + {"id": "1281", "name": "My name is 1281"} + + {"id": "1282", "name": "My name is 1282"} + + {"id": "1283", "name": "My name is 1283"} + + {"id": "1284", "name": "My name is 1284"} + + {"id": "1285", "name": "My name is 1285"} + + {"id": "1286", "name": "My name is 1286"} + + {"id": "1287", "name": "My name is 1287"} + + {"id": "1288", "name": "My name is 1288"} + + {"id": "1289", "name": "My name is 1289"} + + {"id": "1290", "name": "My name is 1290"} + + {"id": "1291", "name": "My name is 1291"} + + {"id": "1292", "name": "My name is 1292"} + + {"id": "1293", "name": "My name is 1293"} + + {"id": "1294", "name": "My name is 1294"} + + {"id": "1295", "name": "My name is 1295"} + + {"id": "1296", "name": "My name is 1296"} + + {"id": "1297", "name": "My name is 1297"} + + {"id": "1298", "name": "My name is 1298"} + + {"id": "1299", "name": "My name is 1299"} + + {"id": "1300", "name": "My name is 1300"} + + {"id": "1301", "name": "My name is 1301"} + + {"id": "1302", "name": "My name is 1302"} + + {"id": "1303", "name": "My name is 1303"} + + {"id": "1304", "name": "My name is 1304"} + + {"id": "1305", "name": "My name is 1305"} + + {"id": "1306", "name": "My name is 1306"} + + {"id": "1307", "name": "My name is 1307"} + + {"id": "1308", "name": "My name is 1308"} + + {"id": "1309", "name": "My name is 1309"} + + {"id": "1310", "name": "My name is 1310"} + + {"id": "1311", "name": "My name is 1311"} + + {"id": "1312", "name": "My name is 1312"} + + {"id": "1313", "name": "My name is 1313"} + + {"id": "1314", "name": "My name is 1314"} + + {"id": "1315", "name": "My name is 1315"} + + {"id": "1316", "name": "My name is 1316"} + + {"id": "1317", "name": "My name is 1317"} + + {"id": "1318", "name": "My name is 1318"} + + {"id": "1319", "name": "My name is 1319"} + + {"id": "1320", "name": "My name is 1320"} + + {"id": "1321", "name": "My name is 1321"} + + {"id": "1322", "name": "My name is 1322"} + + {"id": "1323", "name": "My name is 1323"} + + {"id": "1324", "name": "My name is 1324"} + + {"id": "1325", "name": "My name is 1325"} + + {"id": "1326", "name": "My name is 1326"} + + {"id": "1327", "name": "My name is 1327"} + + {"id": "1328", "name": "My name is 1328"} + + {"id": "1329", "name": "My name is 1329"} + + {"id": "1330", "name": "My name is 1330"} + + {"id": "1331", "name": "My name is 1331"} + + {"id": "1332", "name": "My name is 1332"} + + {"id": "1333", "name": "My name is 1333"} + + {"id": "1334", "name": "My name is 1334"} + + {"id": "1335", "name": "My name is 1335"} + + {"id": "1336", "name": "My name is 1336"} + + {"id": "1337", "name": "My name is 1337"} + + {"id": "1338", "name": "My name is 1338"} + + {"id": "1339", "name": "My name is 1339"} + + {"id": "1340", "name": "My name is 1340"} + + {"id": "1341", "name": "My name is 1341"} + + {"id": "1342", "name": "My name is 1342"} + + {"id": "1343", "name": "My name is 1343"} + + {"id": "1344", "name": "My name is 1344"} + + {"id": "1345", "name": "My name is 1345"} + + {"id": "1346", "name": "My name is 1346"} + + {"id": "1347", "name": "My name is 1347"} + + {"id": "1348", "name": "My name is 1348"} + + {"id": "1349", "name": "My name is 1349"} + + {"id": "1350", "name": "My name is 1350"} + + {"id": "1351", "name": "My name is 1351"} + + {"id": "1352", "name": "My name is 1352"} + + {"id": "1353", "name": "My name is 1353"} + + {"id": "1354", "name": "My name is 1354"} + + {"id": "1355", "name": "My name is 1355"} + + {"id": "1356", "name": "My name is 1356"} + + {"id": "1357", "name": "My name is 1357"} + + {"id": "1358", "name": "My name is 1358"} + + {"id": "1359", "name": "My name is 1359"} + + {"id": "1360", "name": "My name is 1360"} + + {"id": "1361", "name": "My name is 1361"} + + {"id": "1362", "name": "My name is 1362"} + + {"id": "1363", "name": "My name is 1363"} + + {"id": "1364", "name": "My name is 1364"} + + {"id": "1365", "name": "My name is 1365"} + + {"id": "1366", "name": "My name is 1366"} + + {"id": "1367", "name": "My name is 1367"} + + {"id": "1368", "name": "My name is 1368"} + + {"id": "1369", "name": "My name is 1369"} + + {"id": "1370", "name": "My name is 1370"} + + {"id": "1371", "name": "My name is 1371"} + + {"id": "1372", "name": "My name is 1372"} + + {"id": "1373", "name": "My name is 1373"} + + {"id": "1374", "name": "My name is 1374"} + + {"id": "1375", "name": "My name is 1375"} + + {"id": "1376", "name": "My name is 1376"} + + {"id": "1377", "name": "My name is 1377"} + + {"id": "1378", "name": "My name is 1378"} + + {"id": "1379", "name": "My name is 1379"} + + {"id": "1380", "name": "My name is 1380"} + + {"id": "1381", "name": "My name is 1381"} + + {"id": "1382", "name": "My name is 1382"} + + {"id": "1383", "name": "My name is 1383"} + + {"id": "1384", "name": "My name is 1384"} + + {"id": "1385", "name": "My name is 1385"} + + {"id": "1386", "name": "My name is 1386"} + + {"id": "1387", "name": "My name is 1387"} + + {"id": "1388", "name": "My name is 1388"} + + {"id": "1389", "name": "My name is 1389"} + + {"id": "1390", "name": "My name is 1390"} + + {"id": "1391", "name": "My name is 1391"} + + {"id": "1392", "name": "My name is 1392"} + + {"id": "1393", "name": "My name is 1393"} + + {"id": "1394", "name": "My name is 1394"} + + {"id": "1395", "name": "My name is 1395"} + + {"id": "1396", "name": "My name is 1396"} + + {"id": "1397", "name": "My name is 1397"} + + {"id": "1398", "name": "My name is 1398"} + + {"id": "1399", "name": "My name is 1399"} + + {"id": "1400", "name": "My name is 1400"} + + {"id": "1401", "name": "My name is 1401"} + + {"id": "1402", "name": "My name is 1402"} + + {"id": "1403", "name": "My name is 1403"} + + {"id": "1404", "name": "My name is 1404"} + + {"id": "1405", "name": "My name is 1405"} + + {"id": "1406", "name": "My name is 1406"} + + {"id": "1407", "name": "My name is 1407"} + + {"id": "1408", "name": "My name is 1408"} + + {"id": "1409", "name": "My name is 1409"} + + {"id": "1410", "name": "My name is 1410"} + + {"id": "1411", "name": "My name is 1411"} + + {"id": "1412", "name": "My name is 1412"} + + {"id": "1413", "name": "My name is 1413"} + + {"id": "1414", "name": "My name is 1414"} + + {"id": "1415", "name": "My name is 1415"} + + {"id": "1416", "name": "My name is 1416"} + + {"id": "1417", "name": "My name is 1417"} + + {"id": "1418", "name": "My name is 1418"} + + {"id": "1419", "name": "My name is 1419"} + + {"id": "1420", "name": "My name is 1420"} + + {"id": "1421", "name": "My name is 1421"} + + {"id": "1422", "name": "My name is 1422"} + + {"id": "1423", "name": "My name is 1423"} + + {"id": "1424", "name": "My name is 1424"} + + {"id": "1425", "name": "My name is 1425"} + + {"id": "1426", "name": "My name is 1426"} + + {"id": "1427", "name": "My name is 1427"} + + {"id": "1428", "name": "My name is 1428"} + + {"id": "1429", "name": "My name is 1429"} + + {"id": "1430", "name": "My name is 1430"} + + {"id": "1431", "name": "My name is 1431"} + + {"id": "1432", "name": "My name is 1432"} + + {"id": "1433", "name": "My name is 1433"} + + {"id": "1434", "name": "My name is 1434"} + + {"id": "1435", "name": "My name is 1435"} + + {"id": "1436", "name": "My name is 1436"} + + {"id": "1437", "name": "My name is 1437"} + + {"id": "1438", "name": "My name is 1438"} + + {"id": "1439", "name": "My name is 1439"} + + {"id": "1440", "name": "My name is 1440"} + + {"id": "1441", "name": "My name is 1441"} + + {"id": "1442", "name": "My name is 1442"} + + {"id": "1443", "name": "My name is 1443"} + + {"id": "1444", "name": "My name is 1444"} + + {"id": "1445", "name": "My name is 1445"} + + {"id": "1446", "name": "My name is 1446"} + + {"id": "1447", "name": "My name is 1447"} + + {"id": "1448", "name": "My name is 1448"} + + {"id": "1449", "name": "My name is 1449"} + + {"id": "1450", "name": "My name is 1450"} + + {"id": "1451", "name": "My name is 1451"} + + {"id": "1452", "name": "My name is 1452"} + + {"id": "1453", "name": "My name is 1453"} + + {"id": "1454", "name": "My name is 1454"} + + {"id": "1455", "name": "My name is 1455"} + + {"id": "1456", "name": "My name is 1456"} + + {"id": "1457", "name": "My name is 1457"} + + {"id": "1458", "name": "My name is 1458"} + + {"id": "1459", "name": "My name is 1459"} + + {"id": "1460", "name": "My name is 1460"} + + {"id": "1461", "name": "My name is 1461"} + + {"id": "1462", "name": "My name is 1462"} + + {"id": "1463", "name": "My name is 1463"} + + {"id": "1464", "name": "My name is 1464"} + + {"id": "1465", "name": "My name is 1465"} + + {"id": "1466", "name": "My name is 1466"} + + {"id": "1467", "name": "My name is 1467"} + + {"id": "1468", "name": "My name is 1468"} + + {"id": "1469", "name": "My name is 1469"} + + {"id": "1470", "name": "My name is 1470"} + + {"id": "1471", "name": "My name is 1471"} + + {"id": "1472", "name": "My name is 1472"} + + {"id": "1473", "name": "My name is 1473"} + + {"id": "1474", "name": "My name is 1474"} + + {"id": "1475", "name": "My name is 1475"} + + {"id": "1476", "name": "My name is 1476"} + + {"id": "1477", "name": "My name is 1477"} + + {"id": "1478", "name": "My name is 1478"} + + {"id": "1479", "name": "My name is 1479"} + + {"id": "1480", "name": "My name is 1480"} + + {"id": "1481", "name": "My name is 1481"} + + {"id": "1482", "name": "My name is 1482"} + + {"id": "1483", "name": "My name is 1483"} + + {"id": "1484", "name": "My name is 1484"} + + {"id": "1485", "name": "My name is 1485"} + + {"id": "1486", "name": "My name is 1486"} + + {"id": "1487", "name": "My name is 1487"} + + {"id": "1488", "name": "My name is 1488"} + + {"id": "1489", "name": "My name is 1489"} + + {"id": "1490", "name": "My name is 1490"} + + {"id": "1491", "name": "My name is 1491"} + + {"id": "1492", "name": "My name is 1492"} + + {"id": "1493", "name": "My name is 1493"} + + {"id": "1494", "name": "My name is 1494"} + + {"id": "1495", "name": "My name is 1495"} + + {"id": "1496", "name": "My name is 1496"} + + {"id": "1497", "name": "My name is 1497"} + + {"id": "1498", "name": "My name is 1498"} + + {"id": "1499", "name": "My name is 1499"} + + {"id": "1500", "name": "My name is 1500"} + + {"id": "1501", "name": "My name is 1501"} + + {"id": "1502", "name": "My name is 1502"} + + {"id": "1503", "name": "My name is 1503"} + + {"id": "1504", "name": "My name is 1504"} + + {"id": "1505", "name": "My name is 1505"} + + {"id": "1506", "name": "My name is 1506"} + + {"id": "1507", "name": "My name is 1507"} + + {"id": "1508", "name": "My name is 1508"} + + {"id": "1509", "name": "My name is 1509"} + + {"id": "1510", "name": "My name is 1510"} + + {"id": "1511", "name": "My name is 1511"} + + {"id": "1512", "name": "My name is 1512"} + + {"id": "1513", "name": "My name is 1513"} + + {"id": "1514", "name": "My name is 1514"} + + {"id": "1515", "name": "My name is 1515"} + + {"id": "1516", "name": "My name is 1516"} + + {"id": "1517", "name": "My name is 1517"} + + {"id": "1518", "name": "My name is 1518"} + + {"id": "1519", "name": "My name is 1519"} + + {"id": "1520", "name": "My name is 1520"} + + {"id": "1521", "name": "My name is 1521"} + + {"id": "1522", "name": "My name is 1522"} + + {"id": "1523", "name": "My name is 1523"} + + {"id": "1524", "name": "My name is 1524"} + + {"id": "1525", "name": "My name is 1525"} + + {"id": "1526", "name": "My name is 1526"} + + {"id": "1527", "name": "My name is 1527"} + + {"id": "1528", "name": "My name is 1528"} + + {"id": "1529", "name": "My name is 1529"} + + {"id": "1530", "name": "My name is 1530"} + + {"id": "1531", "name": "My name is 1531"} + + {"id": "1532", "name": "My name is 1532"} + + {"id": "1533", "name": "My name is 1533"} + + {"id": "1534", "name": "My name is 1534"} + + {"id": "1535", "name": "My name is 1535"} + + {"id": "1536", "name": "My name is 1536"} + + {"id": "1537", "name": "My name is 1537"} + + {"id": "1538", "name": "My name is 1538"} + + {"id": "1539", "name": "My name is 1539"} + + {"id": "1540", "name": "My name is 1540"} + + {"id": "1541", "name": "My name is 1541"} + + {"id": "1542", "name": "My name is 1542"} + + {"id": "1543", "name": "My name is 1543"} + + {"id": "1544", "name": "My name is 1544"} + + {"id": "1545", "name": "My name is 1545"} + + {"id": "1546", "name": "My name is 1546"} + + {"id": "1547", "name": "My name is 1547"} + + {"id": "1548", "name": "My name is 1548"} + + {"id": "1549", "name": "My name is 1549"} + + {"id": "1550", "name": "My name is 1550"} + + {"id": "1551", "name": "My name is 1551"} + + {"id": "1552", "name": "My name is 1552"} + + {"id": "1553", "name": "My name is 1553"} + + {"id": "1554", "name": "My name is 1554"} + + {"id": "1555", "name": "My name is 1555"} + + {"id": "1556", "name": "My name is 1556"} + + {"id": "1557", "name": "My name is 1557"} + + {"id": "1558", "name": "My name is 1558"} + + {"id": "1559", "name": "My name is 1559"} + + {"id": "1560", "name": "My name is 1560"} + + {"id": "1561", "name": "My name is 1561"} + + {"id": "1562", "name": "My name is 1562"} + + {"id": "1563", "name": "My name is 1563"} + + {"id": "1564", "name": "My name is 1564"} + + {"id": "1565", "name": "My name is 1565"} + + {"id": "1566", "name": "My name is 1566"} + + {"id": "1567", "name": "My name is 1567"} + + {"id": "1568", "name": "My name is 1568"} + + {"id": "1569", "name": "My name is 1569"} + + {"id": "1570", "name": "My name is 1570"} + + {"id": "1571", "name": "My name is 1571"} + + {"id": "1572", "name": "My name is 1572"} + + {"id": "1573", "name": "My name is 1573"} + + {"id": "1574", "name": "My name is 1574"} + + {"id": "1575", "name": "My name is 1575"} + + {"id": "1576", "name": "My name is 1576"} + + {"id": "1577", "name": "My name is 1577"} + + {"id": "1578", "name": "My name is 1578"} + + {"id": "1579", "name": "My name is 1579"} + + {"id": "1580", "name": "My name is 1580"} + + {"id": "1581", "name": "My name is 1581"} + + {"id": "1582", "name": "My name is 1582"} + + {"id": "1583", "name": "My name is 1583"} + + {"id": "1584", "name": "My name is 1584"} + + {"id": "1585", "name": "My name is 1585"} + + {"id": "1586", "name": "My name is 1586"} + + {"id": "1587", "name": "My name is 1587"} + + {"id": "1588", "name": "My name is 1588"} + + {"id": "1589", "name": "My name is 1589"} + + {"id": "1590", "name": "My name is 1590"} + + {"id": "1591", "name": "My name is 1591"} + + {"id": "1592", "name": "My name is 1592"} + + {"id": "1593", "name": "My name is 1593"} + + {"id": "1594", "name": "My name is 1594"} + + {"id": "1595", "name": "My name is 1595"} + + {"id": "1596", "name": "My name is 1596"} + + {"id": "1597", "name": "My name is 1597"} + + {"id": "1598", "name": "My name is 1598"} + + {"id": "1599", "name": "My name is 1599"} + + {"id": "1600", "name": "My name is 1600"} + + {"id": "1601", "name": "My name is 1601"} + + {"id": "1602", "name": "My name is 1602"} + + {"id": "1603", "name": "My name is 1603"} + + {"id": "1604", "name": "My name is 1604"} + + {"id": "1605", "name": "My name is 1605"} + + {"id": "1606", "name": "My name is 1606"} + + {"id": "1607", "name": "My name is 1607"} + + {"id": "1608", "name": "My name is 1608"} + + {"id": "1609", "name": "My name is 1609"} + + {"id": "1610", "name": "My name is 1610"} + + {"id": "1611", "name": "My name is 1611"} + + {"id": "1612", "name": "My name is 1612"} + + {"id": "1613", "name": "My name is 1613"} + + {"id": "1614", "name": "My name is 1614"} + + {"id": "1615", "name": "My name is 1615"} + + {"id": "1616", "name": "My name is 1616"} + + {"id": "1617", "name": "My name is 1617"} + + {"id": "1618", "name": "My name is 1618"} + + {"id": "1619", "name": "My name is 1619"} + + {"id": "1620", "name": "My name is 1620"} + + {"id": "1621", "name": "My name is 1621"} + + {"id": "1622", "name": "My name is 1622"} + + {"id": "1623", "name": "My name is 1623"} + + {"id": "1624", "name": "My name is 1624"} + + {"id": "1625", "name": "My name is 1625"} + + {"id": "1626", "name": "My name is 1626"} + + {"id": "1627", "name": "My name is 1627"} + + {"id": "1628", "name": "My name is 1628"} + + {"id": "1629", "name": "My name is 1629"} + + {"id": "1630", "name": "My name is 1630"} + + {"id": "1631", "name": "My name is 1631"} + + {"id": "1632", "name": "My name is 1632"} + + {"id": "1633", "name": "My name is 1633"} + + {"id": "1634", "name": "My name is 1634"} + + {"id": "1635", "name": "My name is 1635"} + + {"id": "1636", "name": "My name is 1636"} + + {"id": "1637", "name": "My name is 1637"} + + {"id": "1638", "name": "My name is 1638"} + + {"id": "1639", "name": "My name is 1639"} + + {"id": "1640", "name": "My name is 1640"} + + {"id": "1641", "name": "My name is 1641"} + + {"id": "1642", "name": "My name is 1642"} + + {"id": "1643", "name": "My name is 1643"} + + {"id": "1644", "name": "My name is 1644"} + + {"id": "1645", "name": "My name is 1645"} + + {"id": "1646", "name": "My name is 1646"} + + {"id": "1647", "name": "My name is 1647"} + + {"id": "1648", "name": "My name is 1648"} + + {"id": "1649", "name": "My name is 1649"} + + {"id": "1650", "name": "My name is 1650"} + + {"id": "1651", "name": "My name is 1651"} + + {"id": "1652", "name": "My name is 1652"} + + {"id": "1653", "name": "My name is 1653"} + + {"id": "1654", "name": "My name is 1654"} + + {"id": "1655", "name": "My name is 1655"} + + {"id": "1656", "name": "My name is 1656"} + + {"id": "1657", "name": "My name is 1657"} + + {"id": "1658", "name": "My name is 1658"} + + {"id": "1659", "name": "My name is 1659"} + + {"id": "1660", "name": "My name is 1660"} + + {"id": "1661", "name": "My name is 1661"} + + {"id": "1662", "name": "My name is 1662"} + + {"id": "1663", "name": "My name is 1663"} + + {"id": "1664", "name": "My name is 1664"} + + {"id": "1665", "name": "My name is 1665"} + + {"id": "1666", "name": "My name is 1666"} + + {"id": "1667", "name": "My name is 1667"} + + {"id": "1668", "name": "My name is 1668"} + + {"id": "1669", "name": "My name is 1669"} + + {"id": "1670", "name": "My name is 1670"} + + {"id": "1671", "name": "My name is 1671"} + + {"id": "1672", "name": "My name is 1672"} + + {"id": "1673", "name": "My name is 1673"} + + {"id": "1674", "name": "My name is 1674"} + + {"id": "1675", "name": "My name is 1675"} + + {"id": "1676", "name": "My name is 1676"} + + {"id": "1677", "name": "My name is 1677"} + + {"id": "1678", "name": "My name is 1678"} + + {"id": "1679", "name": "My name is 1679"} + + {"id": "1680", "name": "My name is 1680"} + + {"id": "1681", "name": "My name is 1681"} + + {"id": "1682", "name": "My name is 1682"} + + {"id": "1683", "name": "My name is 1683"} + + {"id": "1684", "name": "My name is 1684"} + + {"id": "1685", "name": "My name is 1685"} + + {"id": "1686", "name": "My name is 1686"} + + {"id": "1687", "name": "My name is 1687"} + + {"id": "1688", "name": "My name is 1688"} + + {"id": "1689", "name": "My name is 1689"} + + {"id": "1690", "name": "My name is 1690"} + + {"id": "1691", "name": "My name is 1691"} + + {"id": "1692", "name": "My name is 1692"} + + {"id": "1693", "name": "My name is 1693"} + + {"id": "1694", "name": "My name is 1694"} + + {"id": "1695", "name": "My name is 1695"} + + {"id": "1696", "name": "My name is 1696"} + + {"id": "1697", "name": "My name is 1697"} + + {"id": "1698", "name": "My name is 1698"} + + {"id": "1699", "name": "My name is 1699"} + + {"id": "1700", "name": "My name is 1700"} + + {"id": "1701", "name": "My name is 1701"} + + {"id": "1702", "name": "My name is 1702"} + + {"id": "1703", "name": "My name is 1703"} + + {"id": "1704", "name": "My name is 1704"} + + {"id": "1705", "name": "My name is 1705"} + + {"id": "1706", "name": "My name is 1706"} + + {"id": "1707", "name": "My name is 1707"} + + {"id": "1708", "name": "My name is 1708"} + + {"id": "1709", "name": "My name is 1709"} + + {"id": "1710", "name": "My name is 1710"} + + {"id": "1711", "name": "My name is 1711"} + + {"id": "1712", "name": "My name is 1712"} + + {"id": "1713", "name": "My name is 1713"} + + {"id": "1714", "name": "My name is 1714"} + + {"id": "1715", "name": "My name is 1715"} + + {"id": "1716", "name": "My name is 1716"} + + {"id": "1717", "name": "My name is 1717"} + + {"id": "1718", "name": "My name is 1718"} + + {"id": "1719", "name": "My name is 1719"} + + {"id": "1720", "name": "My name is 1720"} + + {"id": "1721", "name": "My name is 1721"} + + {"id": "1722", "name": "My name is 1722"} + + {"id": "1723", "name": "My name is 1723"} + + {"id": "1724", "name": "My name is 1724"} + + {"id": "1725", "name": "My name is 1725"} + + {"id": "1726", "name": "My name is 1726"} + + {"id": "1727", "name": "My name is 1727"} + + {"id": "1728", "name": "My name is 1728"} + + {"id": "1729", "name": "My name is 1729"} + + {"id": "1730", "name": "My name is 1730"} + + {"id": "1731", "name": "My name is 1731"} + + {"id": "1732", "name": "My name is 1732"} + + {"id": "1733", "name": "My name is 1733"} + + {"id": "1734", "name": "My name is 1734"} + + {"id": "1735", "name": "My name is 1735"} + + {"id": "1736", "name": "My name is 1736"} + + {"id": "1737", "name": "My name is 1737"} + + {"id": "1738", "name": "My name is 1738"} + + {"id": "1739", "name": "My name is 1739"} + + {"id": "1740", "name": "My name is 1740"} + + {"id": "1741", "name": "My name is 1741"} + + {"id": "1742", "name": "My name is 1742"} + + {"id": "1743", "name": "My name is 1743"} + + {"id": "1744", "name": "My name is 1744"} + + {"id": "1745", "name": "My name is 1745"} + + {"id": "1746", "name": "My name is 1746"} + + {"id": "1747", "name": "My name is 1747"} + + {"id": "1748", "name": "My name is 1748"} + + {"id": "1749", "name": "My name is 1749"} + + {"id": "1750", "name": "My name is 1750"} + + {"id": "1751", "name": "My name is 1751"} + + {"id": "1752", "name": "My name is 1752"} + + {"id": "1753", "name": "My name is 1753"} + + {"id": "1754", "name": "My name is 1754"} + + {"id": "1755", "name": "My name is 1755"} + + {"id": "1756", "name": "My name is 1756"} + + {"id": "1757", "name": "My name is 1757"} + + {"id": "1758", "name": "My name is 1758"} + + {"id": "1759", "name": "My name is 1759"} + + {"id": "1760", "name": "My name is 1760"} + + {"id": "1761", "name": "My name is 1761"} + + {"id": "1762", "name": "My name is 1762"} + + {"id": "1763", "name": "My name is 1763"} + + {"id": "1764", "name": "My name is 1764"} + + {"id": "1765", "name": "My name is 1765"} + + {"id": "1766", "name": "My name is 1766"} + + {"id": "1767", "name": "My name is 1767"} + + {"id": "1768", "name": "My name is 1768"} + + {"id": "1769", "name": "My name is 1769"} + + {"id": "1770", "name": "My name is 1770"} + + {"id": "1771", "name": "My name is 1771"} + + {"id": "1772", "name": "My name is 1772"} + + {"id": "1773", "name": "My name is 1773"} + + {"id": "1774", "name": "My name is 1774"} + + {"id": "1775", "name": "My name is 1775"} + + {"id": "1776", "name": "My name is 1776"} + + {"id": "1777", "name": "My name is 1777"} + + {"id": "1778", "name": "My name is 1778"} + + {"id": "1779", "name": "My name is 1779"} + + {"id": "1780", "name": "My name is 1780"} + + {"id": "1781", "name": "My name is 1781"} + + {"id": "1782", "name": "My name is 1782"} + + {"id": "1783", "name": "My name is 1783"} + + {"id": "1784", "name": "My name is 1784"} + + {"id": "1785", "name": "My name is 1785"} + + {"id": "1786", "name": "My name is 1786"} + + {"id": "1787", "name": "My name is 1787"} + + {"id": "1788", "name": "My name is 1788"} + + {"id": "1789", "name": "My name is 1789"} + + {"id": "1790", "name": "My name is 1790"} + + {"id": "1791", "name": "My name is 1791"} + + {"id": "1792", "name": "My name is 1792"} + + {"id": "1793", "name": "My name is 1793"} + + {"id": "1794", "name": "My name is 1794"} + + {"id": "1795", "name": "My name is 1795"} + + {"id": "1796", "name": "My name is 1796"} + + {"id": "1797", "name": "My name is 1797"} + + {"id": "1798", "name": "My name is 1798"} + + {"id": "1799", "name": "My name is 1799"} + + {"id": "1800", "name": "My name is 1800"} + + {"id": "1801", "name": "My name is 1801"} + + {"id": "1802", "name": "My name is 1802"} + + {"id": "1803", "name": "My name is 1803"} + + {"id": "1804", "name": "My name is 1804"} + + {"id": "1805", "name": "My name is 1805"} + + {"id": "1806", "name": "My name is 1806"} + + {"id": "1807", "name": "My name is 1807"} + + {"id": "1808", "name": "My name is 1808"} + + {"id": "1809", "name": "My name is 1809"} + + {"id": "1810", "name": "My name is 1810"} + + {"id": "1811", "name": "My name is 1811"} + + {"id": "1812", "name": "My name is 1812"} + + {"id": "1813", "name": "My name is 1813"} + + {"id": "1814", "name": "My name is 1814"} + + {"id": "1815", "name": "My name is 1815"} + + {"id": "1816", "name": "My name is 1816"} + + {"id": "1817", "name": "My name is 1817"} + + {"id": "1818", "name": "My name is 1818"} + + {"id": "1819", "name": "My name is 1819"} + + {"id": "1820", "name": "My name is 1820"} + + {"id": "1821", "name": "My name is 1821"} + + {"id": "1822", "name": "My name is 1822"} + + {"id": "1823", "name": "My name is 1823"} + + {"id": "1824", "name": "My name is 1824"} + + {"id": "1825", "name": "My name is 1825"} + + {"id": "1826", "name": "My name is 1826"} + + {"id": "1827", "name": "My name is 1827"} + + {"id": "1828", "name": "My name is 1828"} + + {"id": "1829", "name": "My name is 1829"} + + {"id": "1830", "name": "My name is 1830"} + + {"id": "1831", "name": "My name is 1831"} + + {"id": "1832", "name": "My name is 1832"} + + {"id": "1833", "name": "My name is 1833"} + + {"id": "1834", "name": "My name is 1834"} + + {"id": "1835", "name": "My name is 1835"} + + {"id": "1836", "name": "My name is 1836"} + + {"id": "1837", "name": "My name is 1837"} + + {"id": "1838", "name": "My name is 1838"} + + {"id": "1839", "name": "My name is 1839"} + + {"id": "1840", "name": "My name is 1840"} + + {"id": "1841", "name": "My name is 1841"} + + {"id": "1842", "name": "My name is 1842"} + + {"id": "1843", "name": "My name is 1843"} + + {"id": "1844", "name": "My name is 1844"} + + {"id": "1845", "name": "My name is 1845"} + + {"id": "1846", "name": "My name is 1846"} + + {"id": "1847", "name": "My name is 1847"} + + {"id": "1848", "name": "My name is 1848"} + + {"id": "1849", "name": "My name is 1849"} + + {"id": "1850", "name": "My name is 1850"} + + {"id": "1851", "name": "My name is 1851"} + + {"id": "1852", "name": "My name is 1852"} + + {"id": "1853", "name": "My name is 1853"} + + {"id": "1854", "name": "My name is 1854"} + + {"id": "1855", "name": "My name is 1855"} + + {"id": "1856", "name": "My name is 1856"} + + {"id": "1857", "name": "My name is 1857"} + + {"id": "1858", "name": "My name is 1858"} + + {"id": "1859", "name": "My name is 1859"} + + {"id": "1860", "name": "My name is 1860"} + + {"id": "1861", "name": "My name is 1861"} + + {"id": "1862", "name": "My name is 1862"} + + {"id": "1863", "name": "My name is 1863"} + + {"id": "1864", "name": "My name is 1864"} + + {"id": "1865", "name": "My name is 1865"} + + {"id": "1866", "name": "My name is 1866"} + + {"id": "1867", "name": "My name is 1867"} + + {"id": "1868", "name": "My name is 1868"} + + {"id": "1869", "name": "My name is 1869"} + + {"id": "1870", "name": "My name is 1870"} + + {"id": "1871", "name": "My name is 1871"} + + {"id": "1872", "name": "My name is 1872"} + + {"id": "1873", "name": "My name is 1873"} + + {"id": "1874", "name": "My name is 1874"} + + {"id": "1875", "name": "My name is 1875"} + + {"id": "1876", "name": "My name is 1876"} + + {"id": "1877", "name": "My name is 1877"} + + {"id": "1878", "name": "My name is 1878"} + + {"id": "1879", "name": "My name is 1879"} + + {"id": "1880", "name": "My name is 1880"} + + {"id": "1881", "name": "My name is 1881"} + + {"id": "1882", "name": "My name is 1882"} + + {"id": "1883", "name": "My name is 1883"} + + {"id": "1884", "name": "My name is 1884"} + + {"id": "1885", "name": "My name is 1885"} + + {"id": "1886", "name": "My name is 1886"} + + {"id": "1887", "name": "My name is 1887"} + + {"id": "1888", "name": "My name is 1888"} + + {"id": "1889", "name": "My name is 1889"} + + {"id": "1890", "name": "My name is 1890"} + + {"id": "1891", "name": "My name is 1891"} + + {"id": "1892", "name": "My name is 1892"} + + {"id": "1893", "name": "My name is 1893"} + + {"id": "1894", "name": "My name is 1894"} + + {"id": "1895", "name": "My name is 1895"} + + {"id": "1896", "name": "My name is 1896"} + + {"id": "1897", "name": "My name is 1897"} + + {"id": "1898", "name": "My name is 1898"} + + {"id": "1899", "name": "My name is 1899"} + + {"id": "1900", "name": "My name is 1900"} + + {"id": "1901", "name": "My name is 1901"} + + {"id": "1902", "name": "My name is 1902"} + + {"id": "1903", "name": "My name is 1903"} + + {"id": "1904", "name": "My name is 1904"} + + {"id": "1905", "name": "My name is 1905"} + + {"id": "1906", "name": "My name is 1906"} + + {"id": "1907", "name": "My name is 1907"} + + {"id": "1908", "name": "My name is 1908"} + + {"id": "1909", "name": "My name is 1909"} + + {"id": "1910", "name": "My name is 1910"} + + {"id": "1911", "name": "My name is 1911"} + + {"id": "1912", "name": "My name is 1912"} + + {"id": "1913", "name": "My name is 1913"} + + {"id": "1914", "name": "My name is 1914"} + + {"id": "1915", "name": "My name is 1915"} + + {"id": "1916", "name": "My name is 1916"} + + {"id": "1917", "name": "My name is 1917"} + + {"id": "1918", "name": "My name is 1918"} + + {"id": "1919", "name": "My name is 1919"} + + {"id": "1920", "name": "My name is 1920"} + + {"id": "1921", "name": "My name is 1921"} + + {"id": "1922", "name": "My name is 1922"} + + {"id": "1923", "name": "My name is 1923"} + + {"id": "1924", "name": "My name is 1924"} + + {"id": "1925", "name": "My name is 1925"} + + {"id": "1926", "name": "My name is 1926"} + + {"id": "1927", "name": "My name is 1927"} + + {"id": "1928", "name": "My name is 1928"} + + {"id": "1929", "name": "My name is 1929"} + + {"id": "1930", "name": "My name is 1930"} + + {"id": "1931", "name": "My name is 1931"} + + {"id": "1932", "name": "My name is 1932"} + + {"id": "1933", "name": "My name is 1933"} + + {"id": "1934", "name": "My name is 1934"} + + {"id": "1935", "name": "My name is 1935"} + + {"id": "1936", "name": "My name is 1936"} + + {"id": "1937", "name": "My name is 1937"} + + {"id": "1938", "name": "My name is 1938"} + + {"id": "1939", "name": "My name is 1939"} + + {"id": "1940", "name": "My name is 1940"} + + {"id": "1941", "name": "My name is 1941"} + + {"id": "1942", "name": "My name is 1942"} + + {"id": "1943", "name": "My name is 1943"} + + {"id": "1944", "name": "My name is 1944"} + + {"id": "1945", "name": "My name is 1945"} + + {"id": "1946", "name": "My name is 1946"} + + {"id": "1947", "name": "My name is 1947"} + + {"id": "1948", "name": "My name is 1948"} + + {"id": "1949", "name": "My name is 1949"} + + {"id": "1950", "name": "My name is 1950"} + + {"id": "1951", "name": "My name is 1951"} + + {"id": "1952", "name": "My name is 1952"} + + {"id": "1953", "name": "My name is 1953"} + + {"id": "1954", "name": "My name is 1954"} + + {"id": "1955", "name": "My name is 1955"} + + {"id": "1956", "name": "My name is 1956"} + + {"id": "1957", "name": "My name is 1957"} + + {"id": "1958", "name": "My name is 1958"} + + {"id": "1959", "name": "My name is 1959"} + + {"id": "1960", "name": "My name is 1960"} + + {"id": "1961", "name": "My name is 1961"} + + {"id": "1962", "name": "My name is 1962"} + + {"id": "1963", "name": "My name is 1963"} + + {"id": "1964", "name": "My name is 1964"} + + {"id": "1965", "name": "My name is 1965"} + + {"id": "1966", "name": "My name is 1966"} + + {"id": "1967", "name": "My name is 1967"} + + {"id": "1968", "name": "My name is 1968"} + + {"id": "1969", "name": "My name is 1969"} + + {"id": "1970", "name": "My name is 1970"} + + {"id": "1971", "name": "My name is 1971"} + + {"id": "1972", "name": "My name is 1972"} + + {"id": "1973", "name": "My name is 1973"} + + {"id": "1974", "name": "My name is 1974"} + + {"id": "1975", "name": "My name is 1975"} + + {"id": "1976", "name": "My name is 1976"} + + {"id": "1977", "name": "My name is 1977"} + + {"id": "1978", "name": "My name is 1978"} + + {"id": "1979", "name": "My name is 1979"} + + {"id": "1980", "name": "My name is 1980"} + + {"id": "1981", "name": "My name is 1981"} + + {"id": "1982", "name": "My name is 1982"} + + {"id": "1983", "name": "My name is 1983"} + + {"id": "1984", "name": "My name is 1984"} + + {"id": "1985", "name": "My name is 1985"} + + {"id": "1986", "name": "My name is 1986"} + + {"id": "1987", "name": "My name is 1987"} + + {"id": "1988", "name": "My name is 1988"} + + {"id": "1989", "name": "My name is 1989"} + + {"id": "1990", "name": "My name is 1990"} + + {"id": "1991", "name": "My name is 1991"} + + {"id": "1992", "name": "My name is 1992"} + + {"id": "1993", "name": "My name is 1993"} + + {"id": "1994", "name": "My name is 1994"} + + {"id": "1995", "name": "My name is 1995"} + + {"id": "1996", "name": "My name is 1996"} + + {"id": "1997", "name": "My name is 1997"} + + {"id": "1998", "name": "My name is 1998"} + + {"id": "1999", "name": "My name is 1999"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '81743' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/import?action=upsert + response: + body: + string: '{"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true} + + {"success":true}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '33982' + content-type: + - text/plain; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=1 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"1999","name":"My + name is 1999"},"highlight":{},"highlights":[]},{"document":{"id":"1998","name":"My + name is 1998"},"highlight":{},"highlights":[]},{"document":{"id":"1997","name":"My + name is 1997"},"highlight":{},"highlights":[]},{"document":{"id":"1996","name":"My + name is 1996"},"highlight":{},"highlights":[]},{"document":{"id":"1995","name":"My + name is 1995"},"highlight":{},"highlights":[]},{"document":{"id":"1994","name":"My + name is 1994"},"highlight":{},"highlights":[]},{"document":{"id":"1993","name":"My + name is 1993"},"highlight":{},"highlights":[]},{"document":{"id":"1992","name":"My + name is 1992"},"highlight":{},"highlights":[]},{"document":{"id":"1991","name":"My + name is 1991"},"highlight":{},"highlights":[]},{"document":{"id":"1990","name":"My + name is 1990"},"highlight":{},"highlights":[]},{"document":{"id":"1989","name":"My + name is 1989"},"highlight":{},"highlights":[]},{"document":{"id":"1988","name":"My + name is 1988"},"highlight":{},"highlights":[]},{"document":{"id":"1987","name":"My + name is 1987"},"highlight":{},"highlights":[]},{"document":{"id":"1986","name":"My + name is 1986"},"highlight":{},"highlights":[]},{"document":{"id":"1985","name":"My + name is 1985"},"highlight":{},"highlights":[]},{"document":{"id":"1984","name":"My + name is 1984"},"highlight":{},"highlights":[]},{"document":{"id":"1983","name":"My + name is 1983"},"highlight":{},"highlights":[]},{"document":{"id":"1982","name":"My + name is 1982"},"highlight":{},"highlights":[]},{"document":{"id":"1981","name":"My + name is 1981"},"highlight":{},"highlights":[]},{"document":{"id":"1980","name":"My + name is 1980"},"highlight":{},"highlights":[]},{"document":{"id":"1979","name":"My + name is 1979"},"highlight":{},"highlights":[]},{"document":{"id":"1978","name":"My + name is 1978"},"highlight":{},"highlights":[]},{"document":{"id":"1977","name":"My + name is 1977"},"highlight":{},"highlights":[]},{"document":{"id":"1976","name":"My + name is 1976"},"highlight":{},"highlights":[]},{"document":{"id":"1975","name":"My + name is 1975"},"highlight":{},"highlights":[]},{"document":{"id":"1974","name":"My + name is 1974"},"highlight":{},"highlights":[]},{"document":{"id":"1973","name":"My + name is 1973"},"highlight":{},"highlights":[]},{"document":{"id":"1972","name":"My + name is 1972"},"highlight":{},"highlights":[]},{"document":{"id":"1971","name":"My + name is 1971"},"highlight":{},"highlights":[]},{"document":{"id":"1970","name":"My + name is 1970"},"highlight":{},"highlights":[]},{"document":{"id":"1969","name":"My + name is 1969"},"highlight":{},"highlights":[]},{"document":{"id":"1968","name":"My + name is 1968"},"highlight":{},"highlights":[]},{"document":{"id":"1967","name":"My + name is 1967"},"highlight":{},"highlights":[]},{"document":{"id":"1966","name":"My + name is 1966"},"highlight":{},"highlights":[]},{"document":{"id":"1965","name":"My + name is 1965"},"highlight":{},"highlights":[]},{"document":{"id":"1964","name":"My + name is 1964"},"highlight":{},"highlights":[]},{"document":{"id":"1963","name":"My + name is 1963"},"highlight":{},"highlights":[]},{"document":{"id":"1962","name":"My + name is 1962"},"highlight":{},"highlights":[]},{"document":{"id":"1961","name":"My + name is 1961"},"highlight":{},"highlights":[]},{"document":{"id":"1960","name":"My + name is 1960"},"highlight":{},"highlights":[]},{"document":{"id":"1959","name":"My + name is 1959"},"highlight":{},"highlights":[]},{"document":{"id":"1958","name":"My + name is 1958"},"highlight":{},"highlights":[]},{"document":{"id":"1957","name":"My + name is 1957"},"highlight":{},"highlights":[]},{"document":{"id":"1956","name":"My + name is 1956"},"highlight":{},"highlights":[]},{"document":{"id":"1955","name":"My + name is 1955"},"highlight":{},"highlights":[]},{"document":{"id":"1954","name":"My + name is 1954"},"highlight":{},"highlights":[]},{"document":{"id":"1953","name":"My + name is 1953"},"highlight":{},"highlights":[]},{"document":{"id":"1952","name":"My + name is 1952"},"highlight":{},"highlights":[]},{"document":{"id":"1951","name":"My + name is 1951"},"highlight":{},"highlights":[]},{"document":{"id":"1950","name":"My + name is 1950"},"highlight":{},"highlights":[]},{"document":{"id":"1949","name":"My + name is 1949"},"highlight":{},"highlights":[]},{"document":{"id":"1948","name":"My + name is 1948"},"highlight":{},"highlights":[]},{"document":{"id":"1947","name":"My + name is 1947"},"highlight":{},"highlights":[]},{"document":{"id":"1946","name":"My + name is 1946"},"highlight":{},"highlights":[]},{"document":{"id":"1945","name":"My + name is 1945"},"highlight":{},"highlights":[]},{"document":{"id":"1944","name":"My + name is 1944"},"highlight":{},"highlights":[]},{"document":{"id":"1943","name":"My + name is 1943"},"highlight":{},"highlights":[]},{"document":{"id":"1942","name":"My + name is 1942"},"highlight":{},"highlights":[]},{"document":{"id":"1941","name":"My + name is 1941"},"highlight":{},"highlights":[]},{"document":{"id":"1940","name":"My + name is 1940"},"highlight":{},"highlights":[]},{"document":{"id":"1939","name":"My + name is 1939"},"highlight":{},"highlights":[]},{"document":{"id":"1938","name":"My + name is 1938"},"highlight":{},"highlights":[]},{"document":{"id":"1937","name":"My + name is 1937"},"highlight":{},"highlights":[]},{"document":{"id":"1936","name":"My + name is 1936"},"highlight":{},"highlights":[]},{"document":{"id":"1935","name":"My + name is 1935"},"highlight":{},"highlights":[]},{"document":{"id":"1934","name":"My + name is 1934"},"highlight":{},"highlights":[]},{"document":{"id":"1933","name":"My + name is 1933"},"highlight":{},"highlights":[]},{"document":{"id":"1932","name":"My + name is 1932"},"highlight":{},"highlights":[]},{"document":{"id":"1931","name":"My + name is 1931"},"highlight":{},"highlights":[]},{"document":{"id":"1930","name":"My + name is 1930"},"highlight":{},"highlights":[]},{"document":{"id":"1929","name":"My + name is 1929"},"highlight":{},"highlights":[]},{"document":{"id":"1928","name":"My + name is 1928"},"highlight":{},"highlights":[]},{"document":{"id":"1927","name":"My + name is 1927"},"highlight":{},"highlights":[]},{"document":{"id":"1926","name":"My + name is 1926"},"highlight":{},"highlights":[]},{"document":{"id":"1925","name":"My + name is 1925"},"highlight":{},"highlights":[]},{"document":{"id":"1924","name":"My + name is 1924"},"highlight":{},"highlights":[]},{"document":{"id":"1923","name":"My + name is 1923"},"highlight":{},"highlights":[]},{"document":{"id":"1922","name":"My + name is 1922"},"highlight":{},"highlights":[]},{"document":{"id":"1921","name":"My + name is 1921"},"highlight":{},"highlights":[]},{"document":{"id":"1920","name":"My + name is 1920"},"highlight":{},"highlights":[]},{"document":{"id":"1919","name":"My + name is 1919"},"highlight":{},"highlights":[]},{"document":{"id":"1918","name":"My + name is 1918"},"highlight":{},"highlights":[]},{"document":{"id":"1917","name":"My + name is 1917"},"highlight":{},"highlights":[]},{"document":{"id":"1916","name":"My + name is 1916"},"highlight":{},"highlights":[]},{"document":{"id":"1915","name":"My + name is 1915"},"highlight":{},"highlights":[]},{"document":{"id":"1914","name":"My + name is 1914"},"highlight":{},"highlights":[]},{"document":{"id":"1913","name":"My + name is 1913"},"highlight":{},"highlights":[]},{"document":{"id":"1912","name":"My + name is 1912"},"highlight":{},"highlights":[]},{"document":{"id":"1911","name":"My + name is 1911"},"highlight":{},"highlights":[]},{"document":{"id":"1910","name":"My + name is 1910"},"highlight":{},"highlights":[]},{"document":{"id":"1909","name":"My + name is 1909"},"highlight":{},"highlights":[]},{"document":{"id":"1908","name":"My + name is 1908"},"highlight":{},"highlights":[]},{"document":{"id":"1907","name":"My + name is 1907"},"highlight":{},"highlights":[]},{"document":{"id":"1906","name":"My + name is 1906"},"highlight":{},"highlights":[]},{"document":{"id":"1905","name":"My + name is 1905"},"highlight":{},"highlights":[]},{"document":{"id":"1904","name":"My + name is 1904"},"highlight":{},"highlights":[]},{"document":{"id":"1903","name":"My + name is 1903"},"highlight":{},"highlights":[]},{"document":{"id":"1902","name":"My + name is 1902"},"highlight":{},"highlights":[]},{"document":{"id":"1901","name":"My + name is 1901"},"highlight":{},"highlights":[]},{"document":{"id":"1900","name":"My + name is 1900"},"highlight":{},"highlights":[]},{"document":{"id":"1899","name":"My + name is 1899"},"highlight":{},"highlights":[]},{"document":{"id":"1898","name":"My + name is 1898"},"highlight":{},"highlights":[]},{"document":{"id":"1897","name":"My + name is 1897"},"highlight":{},"highlights":[]},{"document":{"id":"1896","name":"My + name is 1896"},"highlight":{},"highlights":[]},{"document":{"id":"1895","name":"My + name is 1895"},"highlight":{},"highlights":[]},{"document":{"id":"1894","name":"My + name is 1894"},"highlight":{},"highlights":[]},{"document":{"id":"1893","name":"My + name is 1893"},"highlight":{},"highlights":[]},{"document":{"id":"1892","name":"My + name is 1892"},"highlight":{},"highlights":[]},{"document":{"id":"1891","name":"My + name is 1891"},"highlight":{},"highlights":[]},{"document":{"id":"1890","name":"My + name is 1890"},"highlight":{},"highlights":[]},{"document":{"id":"1889","name":"My + name is 1889"},"highlight":{},"highlights":[]},{"document":{"id":"1888","name":"My + name is 1888"},"highlight":{},"highlights":[]},{"document":{"id":"1887","name":"My + name is 1887"},"highlight":{},"highlights":[]},{"document":{"id":"1886","name":"My + name is 1886"},"highlight":{},"highlights":[]},{"document":{"id":"1885","name":"My + name is 1885"},"highlight":{},"highlights":[]},{"document":{"id":"1884","name":"My + name is 1884"},"highlight":{},"highlights":[]},{"document":{"id":"1883","name":"My + name is 1883"},"highlight":{},"highlights":[]},{"document":{"id":"1882","name":"My + name is 1882"},"highlight":{},"highlights":[]},{"document":{"id":"1881","name":"My + name is 1881"},"highlight":{},"highlights":[]},{"document":{"id":"1880","name":"My + name is 1880"},"highlight":{},"highlights":[]},{"document":{"id":"1879","name":"My + name is 1879"},"highlight":{},"highlights":[]},{"document":{"id":"1878","name":"My + name is 1878"},"highlight":{},"highlights":[]},{"document":{"id":"1877","name":"My + name is 1877"},"highlight":{},"highlights":[]},{"document":{"id":"1876","name":"My + name is 1876"},"highlight":{},"highlights":[]},{"document":{"id":"1875","name":"My + name is 1875"},"highlight":{},"highlights":[]},{"document":{"id":"1874","name":"My + name is 1874"},"highlight":{},"highlights":[]},{"document":{"id":"1873","name":"My + name is 1873"},"highlight":{},"highlights":[]},{"document":{"id":"1872","name":"My + name is 1872"},"highlight":{},"highlights":[]},{"document":{"id":"1871","name":"My + name is 1871"},"highlight":{},"highlights":[]},{"document":{"id":"1870","name":"My + name is 1870"},"highlight":{},"highlights":[]},{"document":{"id":"1869","name":"My + name is 1869"},"highlight":{},"highlights":[]},{"document":{"id":"1868","name":"My + name is 1868"},"highlight":{},"highlights":[]},{"document":{"id":"1867","name":"My + name is 1867"},"highlight":{},"highlights":[]},{"document":{"id":"1866","name":"My + name is 1866"},"highlight":{},"highlights":[]},{"document":{"id":"1865","name":"My + name is 1865"},"highlight":{},"highlights":[]},{"document":{"id":"1864","name":"My + name is 1864"},"highlight":{},"highlights":[]},{"document":{"id":"1863","name":"My + name is 1863"},"highlight":{},"highlights":[]},{"document":{"id":"1862","name":"My + name is 1862"},"highlight":{},"highlights":[]},{"document":{"id":"1861","name":"My + name is 1861"},"highlight":{},"highlights":[]},{"document":{"id":"1860","name":"My + name is 1860"},"highlight":{},"highlights":[]},{"document":{"id":"1859","name":"My + name is 1859"},"highlight":{},"highlights":[]},{"document":{"id":"1858","name":"My + name is 1858"},"highlight":{},"highlights":[]},{"document":{"id":"1857","name":"My + name is 1857"},"highlight":{},"highlights":[]},{"document":{"id":"1856","name":"My + name is 1856"},"highlight":{},"highlights":[]},{"document":{"id":"1855","name":"My + name is 1855"},"highlight":{},"highlights":[]},{"document":{"id":"1854","name":"My + name is 1854"},"highlight":{},"highlights":[]},{"document":{"id":"1853","name":"My + name is 1853"},"highlight":{},"highlights":[]},{"document":{"id":"1852","name":"My + name is 1852"},"highlight":{},"highlights":[]},{"document":{"id":"1851","name":"My + name is 1851"},"highlight":{},"highlights":[]},{"document":{"id":"1850","name":"My + name is 1850"},"highlight":{},"highlights":[]},{"document":{"id":"1849","name":"My + name is 1849"},"highlight":{},"highlights":[]},{"document":{"id":"1848","name":"My + name is 1848"},"highlight":{},"highlights":[]},{"document":{"id":"1847","name":"My + name is 1847"},"highlight":{},"highlights":[]},{"document":{"id":"1846","name":"My + name is 1846"},"highlight":{},"highlights":[]},{"document":{"id":"1845","name":"My + name is 1845"},"highlight":{},"highlights":[]},{"document":{"id":"1844","name":"My + name is 1844"},"highlight":{},"highlights":[]},{"document":{"id":"1843","name":"My + name is 1843"},"highlight":{},"highlights":[]},{"document":{"id":"1842","name":"My + name is 1842"},"highlight":{},"highlights":[]},{"document":{"id":"1841","name":"My + name is 1841"},"highlight":{},"highlights":[]},{"document":{"id":"1840","name":"My + name is 1840"},"highlight":{},"highlights":[]},{"document":{"id":"1839","name":"My + name is 1839"},"highlight":{},"highlights":[]},{"document":{"id":"1838","name":"My + name is 1838"},"highlight":{},"highlights":[]},{"document":{"id":"1837","name":"My + name is 1837"},"highlight":{},"highlights":[]},{"document":{"id":"1836","name":"My + name is 1836"},"highlight":{},"highlights":[]},{"document":{"id":"1835","name":"My + name is 1835"},"highlight":{},"highlights":[]},{"document":{"id":"1834","name":"My + name is 1834"},"highlight":{},"highlights":[]},{"document":{"id":"1833","name":"My + name is 1833"},"highlight":{},"highlights":[]},{"document":{"id":"1832","name":"My + name is 1832"},"highlight":{},"highlights":[]},{"document":{"id":"1831","name":"My + name is 1831"},"highlight":{},"highlights":[]},{"document":{"id":"1830","name":"My + name is 1830"},"highlight":{},"highlights":[]},{"document":{"id":"1829","name":"My + name is 1829"},"highlight":{},"highlights":[]},{"document":{"id":"1828","name":"My + name is 1828"},"highlight":{},"highlights":[]},{"document":{"id":"1827","name":"My + name is 1827"},"highlight":{},"highlights":[]},{"document":{"id":"1826","name":"My + name is 1826"},"highlight":{},"highlights":[]},{"document":{"id":"1825","name":"My + name is 1825"},"highlight":{},"highlights":[]},{"document":{"id":"1824","name":"My + name is 1824"},"highlight":{},"highlights":[]},{"document":{"id":"1823","name":"My + name is 1823"},"highlight":{},"highlights":[]},{"document":{"id":"1822","name":"My + name is 1822"},"highlight":{},"highlights":[]},{"document":{"id":"1821","name":"My + name is 1821"},"highlight":{},"highlights":[]},{"document":{"id":"1820","name":"My + name is 1820"},"highlight":{},"highlights":[]},{"document":{"id":"1819","name":"My + name is 1819"},"highlight":{},"highlights":[]},{"document":{"id":"1818","name":"My + name is 1818"},"highlight":{},"highlights":[]},{"document":{"id":"1817","name":"My + name is 1817"},"highlight":{},"highlights":[]},{"document":{"id":"1816","name":"My + name is 1816"},"highlight":{},"highlights":[]},{"document":{"id":"1815","name":"My + name is 1815"},"highlight":{},"highlights":[]},{"document":{"id":"1814","name":"My + name is 1814"},"highlight":{},"highlights":[]},{"document":{"id":"1813","name":"My + name is 1813"},"highlight":{},"highlights":[]},{"document":{"id":"1812","name":"My + name is 1812"},"highlight":{},"highlights":[]},{"document":{"id":"1811","name":"My + name is 1811"},"highlight":{},"highlights":[]},{"document":{"id":"1810","name":"My + name is 1810"},"highlight":{},"highlights":[]},{"document":{"id":"1809","name":"My + name is 1809"},"highlight":{},"highlights":[]},{"document":{"id":"1808","name":"My + name is 1808"},"highlight":{},"highlights":[]},{"document":{"id":"1807","name":"My + name is 1807"},"highlight":{},"highlights":[]},{"document":{"id":"1806","name":"My + name is 1806"},"highlight":{},"highlights":[]},{"document":{"id":"1805","name":"My + name is 1805"},"highlight":{},"highlights":[]},{"document":{"id":"1804","name":"My + name is 1804"},"highlight":{},"highlights":[]},{"document":{"id":"1803","name":"My + name is 1803"},"highlight":{},"highlights":[]},{"document":{"id":"1802","name":"My + name is 1802"},"highlight":{},"highlights":[]},{"document":{"id":"1801","name":"My + name is 1801"},"highlight":{},"highlights":[]},{"document":{"id":"1800","name":"My + name is 1800"},"highlight":{},"highlights":[]},{"document":{"id":"1799","name":"My + name is 1799"},"highlight":{},"highlights":[]},{"document":{"id":"1798","name":"My + name is 1798"},"highlight":{},"highlights":[]},{"document":{"id":"1797","name":"My + name is 1797"},"highlight":{},"highlights":[]},{"document":{"id":"1796","name":"My + name is 1796"},"highlight":{},"highlights":[]},{"document":{"id":"1795","name":"My + name is 1795"},"highlight":{},"highlights":[]},{"document":{"id":"1794","name":"My + name is 1794"},"highlight":{},"highlights":[]},{"document":{"id":"1793","name":"My + name is 1793"},"highlight":{},"highlights":[]},{"document":{"id":"1792","name":"My + name is 1792"},"highlight":{},"highlights":[]},{"document":{"id":"1791","name":"My + name is 1791"},"highlight":{},"highlights":[]},{"document":{"id":"1790","name":"My + name is 1790"},"highlight":{},"highlights":[]},{"document":{"id":"1789","name":"My + name is 1789"},"highlight":{},"highlights":[]},{"document":{"id":"1788","name":"My + name is 1788"},"highlight":{},"highlights":[]},{"document":{"id":"1787","name":"My + name is 1787"},"highlight":{},"highlights":[]},{"document":{"id":"1786","name":"My + name is 1786"},"highlight":{},"highlights":[]},{"document":{"id":"1785","name":"My + name is 1785"},"highlight":{},"highlights":[]},{"document":{"id":"1784","name":"My + name is 1784"},"highlight":{},"highlights":[]},{"document":{"id":"1783","name":"My + name is 1783"},"highlight":{},"highlights":[]},{"document":{"id":"1782","name":"My + name is 1782"},"highlight":{},"highlights":[]},{"document":{"id":"1781","name":"My + name is 1781"},"highlight":{},"highlights":[]},{"document":{"id":"1780","name":"My + name is 1780"},"highlight":{},"highlights":[]},{"document":{"id":"1779","name":"My + name is 1779"},"highlight":{},"highlights":[]},{"document":{"id":"1778","name":"My + name is 1778"},"highlight":{},"highlights":[]},{"document":{"id":"1777","name":"My + name is 1777"},"highlight":{},"highlights":[]},{"document":{"id":"1776","name":"My + name is 1776"},"highlight":{},"highlights":[]},{"document":{"id":"1775","name":"My + name is 1775"},"highlight":{},"highlights":[]},{"document":{"id":"1774","name":"My + name is 1774"},"highlight":{},"highlights":[]},{"document":{"id":"1773","name":"My + name is 1773"},"highlight":{},"highlights":[]},{"document":{"id":"1772","name":"My + name is 1772"},"highlight":{},"highlights":[]},{"document":{"id":"1771","name":"My + name is 1771"},"highlight":{},"highlights":[]},{"document":{"id":"1770","name":"My + name is 1770"},"highlight":{},"highlights":[]},{"document":{"id":"1769","name":"My + name is 1769"},"highlight":{},"highlights":[]},{"document":{"id":"1768","name":"My + name is 1768"},"highlight":{},"highlights":[]},{"document":{"id":"1767","name":"My + name is 1767"},"highlight":{},"highlights":[]},{"document":{"id":"1766","name":"My + name is 1766"},"highlight":{},"highlights":[]},{"document":{"id":"1765","name":"My + name is 1765"},"highlight":{},"highlights":[]},{"document":{"id":"1764","name":"My + name is 1764"},"highlight":{},"highlights":[]},{"document":{"id":"1763","name":"My + name is 1763"},"highlight":{},"highlights":[]},{"document":{"id":"1762","name":"My + name is 1762"},"highlight":{},"highlights":[]},{"document":{"id":"1761","name":"My + name is 1761"},"highlight":{},"highlights":[]},{"document":{"id":"1760","name":"My + name is 1760"},"highlight":{},"highlights":[]},{"document":{"id":"1759","name":"My + name is 1759"},"highlight":{},"highlights":[]},{"document":{"id":"1758","name":"My + name is 1758"},"highlight":{},"highlights":[]},{"document":{"id":"1757","name":"My + name is 1757"},"highlight":{},"highlights":[]},{"document":{"id":"1756","name":"My + name is 1756"},"highlight":{},"highlights":[]},{"document":{"id":"1755","name":"My + name is 1755"},"highlight":{},"highlights":[]},{"document":{"id":"1754","name":"My + name is 1754"},"highlight":{},"highlights":[]},{"document":{"id":"1753","name":"My + name is 1753"},"highlight":{},"highlights":[]},{"document":{"id":"1752","name":"My + name is 1752"},"highlight":{},"highlights":[]},{"document":{"id":"1751","name":"My + name is 1751"},"highlight":{},"highlights":[]},{"document":{"id":"1750","name":"My + name is 1750"},"highlight":{},"highlights":[]}],"out_of":1999,"page":1,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":1}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20968' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=2 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"1749","name":"My + name is 1749"},"highlight":{},"highlights":[]},{"document":{"id":"1748","name":"My + name is 1748"},"highlight":{},"highlights":[]},{"document":{"id":"1747","name":"My + name is 1747"},"highlight":{},"highlights":[]},{"document":{"id":"1746","name":"My + name is 1746"},"highlight":{},"highlights":[]},{"document":{"id":"1745","name":"My + name is 1745"},"highlight":{},"highlights":[]},{"document":{"id":"1744","name":"My + name is 1744"},"highlight":{},"highlights":[]},{"document":{"id":"1743","name":"My + name is 1743"},"highlight":{},"highlights":[]},{"document":{"id":"1742","name":"My + name is 1742"},"highlight":{},"highlights":[]},{"document":{"id":"1741","name":"My + name is 1741"},"highlight":{},"highlights":[]},{"document":{"id":"1740","name":"My + name is 1740"},"highlight":{},"highlights":[]},{"document":{"id":"1739","name":"My + name is 1739"},"highlight":{},"highlights":[]},{"document":{"id":"1738","name":"My + name is 1738"},"highlight":{},"highlights":[]},{"document":{"id":"1737","name":"My + name is 1737"},"highlight":{},"highlights":[]},{"document":{"id":"1736","name":"My + name is 1736"},"highlight":{},"highlights":[]},{"document":{"id":"1735","name":"My + name is 1735"},"highlight":{},"highlights":[]},{"document":{"id":"1734","name":"My + name is 1734"},"highlight":{},"highlights":[]},{"document":{"id":"1733","name":"My + name is 1733"},"highlight":{},"highlights":[]},{"document":{"id":"1732","name":"My + name is 1732"},"highlight":{},"highlights":[]},{"document":{"id":"1731","name":"My + name is 1731"},"highlight":{},"highlights":[]},{"document":{"id":"1730","name":"My + name is 1730"},"highlight":{},"highlights":[]},{"document":{"id":"1729","name":"My + name is 1729"},"highlight":{},"highlights":[]},{"document":{"id":"1728","name":"My + name is 1728"},"highlight":{},"highlights":[]},{"document":{"id":"1727","name":"My + name is 1727"},"highlight":{},"highlights":[]},{"document":{"id":"1726","name":"My + name is 1726"},"highlight":{},"highlights":[]},{"document":{"id":"1725","name":"My + name is 1725"},"highlight":{},"highlights":[]},{"document":{"id":"1724","name":"My + name is 1724"},"highlight":{},"highlights":[]},{"document":{"id":"1723","name":"My + name is 1723"},"highlight":{},"highlights":[]},{"document":{"id":"1722","name":"My + name is 1722"},"highlight":{},"highlights":[]},{"document":{"id":"1721","name":"My + name is 1721"},"highlight":{},"highlights":[]},{"document":{"id":"1720","name":"My + name is 1720"},"highlight":{},"highlights":[]},{"document":{"id":"1719","name":"My + name is 1719"},"highlight":{},"highlights":[]},{"document":{"id":"1718","name":"My + name is 1718"},"highlight":{},"highlights":[]},{"document":{"id":"1717","name":"My + name is 1717"},"highlight":{},"highlights":[]},{"document":{"id":"1716","name":"My + name is 1716"},"highlight":{},"highlights":[]},{"document":{"id":"1715","name":"My + name is 1715"},"highlight":{},"highlights":[]},{"document":{"id":"1714","name":"My + name is 1714"},"highlight":{},"highlights":[]},{"document":{"id":"1713","name":"My + name is 1713"},"highlight":{},"highlights":[]},{"document":{"id":"1712","name":"My + name is 1712"},"highlight":{},"highlights":[]},{"document":{"id":"1711","name":"My + name is 1711"},"highlight":{},"highlights":[]},{"document":{"id":"1710","name":"My + name is 1710"},"highlight":{},"highlights":[]},{"document":{"id":"1709","name":"My + name is 1709"},"highlight":{},"highlights":[]},{"document":{"id":"1708","name":"My + name is 1708"},"highlight":{},"highlights":[]},{"document":{"id":"1707","name":"My + name is 1707"},"highlight":{},"highlights":[]},{"document":{"id":"1706","name":"My + name is 1706"},"highlight":{},"highlights":[]},{"document":{"id":"1705","name":"My + name is 1705"},"highlight":{},"highlights":[]},{"document":{"id":"1704","name":"My + name is 1704"},"highlight":{},"highlights":[]},{"document":{"id":"1703","name":"My + name is 1703"},"highlight":{},"highlights":[]},{"document":{"id":"1702","name":"My + name is 1702"},"highlight":{},"highlights":[]},{"document":{"id":"1701","name":"My + name is 1701"},"highlight":{},"highlights":[]},{"document":{"id":"1700","name":"My + name is 1700"},"highlight":{},"highlights":[]},{"document":{"id":"1699","name":"My + name is 1699"},"highlight":{},"highlights":[]},{"document":{"id":"1698","name":"My + name is 1698"},"highlight":{},"highlights":[]},{"document":{"id":"1697","name":"My + name is 1697"},"highlight":{},"highlights":[]},{"document":{"id":"1696","name":"My + name is 1696"},"highlight":{},"highlights":[]},{"document":{"id":"1695","name":"My + name is 1695"},"highlight":{},"highlights":[]},{"document":{"id":"1694","name":"My + name is 1694"},"highlight":{},"highlights":[]},{"document":{"id":"1693","name":"My + name is 1693"},"highlight":{},"highlights":[]},{"document":{"id":"1692","name":"My + name is 1692"},"highlight":{},"highlights":[]},{"document":{"id":"1691","name":"My + name is 1691"},"highlight":{},"highlights":[]},{"document":{"id":"1690","name":"My + name is 1690"},"highlight":{},"highlights":[]},{"document":{"id":"1689","name":"My + name is 1689"},"highlight":{},"highlights":[]},{"document":{"id":"1688","name":"My + name is 1688"},"highlight":{},"highlights":[]},{"document":{"id":"1687","name":"My + name is 1687"},"highlight":{},"highlights":[]},{"document":{"id":"1686","name":"My + name is 1686"},"highlight":{},"highlights":[]},{"document":{"id":"1685","name":"My + name is 1685"},"highlight":{},"highlights":[]},{"document":{"id":"1684","name":"My + name is 1684"},"highlight":{},"highlights":[]},{"document":{"id":"1683","name":"My + name is 1683"},"highlight":{},"highlights":[]},{"document":{"id":"1682","name":"My + name is 1682"},"highlight":{},"highlights":[]},{"document":{"id":"1681","name":"My + name is 1681"},"highlight":{},"highlights":[]},{"document":{"id":"1680","name":"My + name is 1680"},"highlight":{},"highlights":[]},{"document":{"id":"1679","name":"My + name is 1679"},"highlight":{},"highlights":[]},{"document":{"id":"1678","name":"My + name is 1678"},"highlight":{},"highlights":[]},{"document":{"id":"1677","name":"My + name is 1677"},"highlight":{},"highlights":[]},{"document":{"id":"1676","name":"My + name is 1676"},"highlight":{},"highlights":[]},{"document":{"id":"1675","name":"My + name is 1675"},"highlight":{},"highlights":[]},{"document":{"id":"1674","name":"My + name is 1674"},"highlight":{},"highlights":[]},{"document":{"id":"1673","name":"My + name is 1673"},"highlight":{},"highlights":[]},{"document":{"id":"1672","name":"My + name is 1672"},"highlight":{},"highlights":[]},{"document":{"id":"1671","name":"My + name is 1671"},"highlight":{},"highlights":[]},{"document":{"id":"1670","name":"My + name is 1670"},"highlight":{},"highlights":[]},{"document":{"id":"1669","name":"My + name is 1669"},"highlight":{},"highlights":[]},{"document":{"id":"1668","name":"My + name is 1668"},"highlight":{},"highlights":[]},{"document":{"id":"1667","name":"My + name is 1667"},"highlight":{},"highlights":[]},{"document":{"id":"1666","name":"My + name is 1666"},"highlight":{},"highlights":[]},{"document":{"id":"1665","name":"My + name is 1665"},"highlight":{},"highlights":[]},{"document":{"id":"1664","name":"My + name is 1664"},"highlight":{},"highlights":[]},{"document":{"id":"1663","name":"My + name is 1663"},"highlight":{},"highlights":[]},{"document":{"id":"1662","name":"My + name is 1662"},"highlight":{},"highlights":[]},{"document":{"id":"1661","name":"My + name is 1661"},"highlight":{},"highlights":[]},{"document":{"id":"1660","name":"My + name is 1660"},"highlight":{},"highlights":[]},{"document":{"id":"1659","name":"My + name is 1659"},"highlight":{},"highlights":[]},{"document":{"id":"1658","name":"My + name is 1658"},"highlight":{},"highlights":[]},{"document":{"id":"1657","name":"My + name is 1657"},"highlight":{},"highlights":[]},{"document":{"id":"1656","name":"My + name is 1656"},"highlight":{},"highlights":[]},{"document":{"id":"1655","name":"My + name is 1655"},"highlight":{},"highlights":[]},{"document":{"id":"1654","name":"My + name is 1654"},"highlight":{},"highlights":[]},{"document":{"id":"1653","name":"My + name is 1653"},"highlight":{},"highlights":[]},{"document":{"id":"1652","name":"My + name is 1652"},"highlight":{},"highlights":[]},{"document":{"id":"1651","name":"My + name is 1651"},"highlight":{},"highlights":[]},{"document":{"id":"1650","name":"My + name is 1650"},"highlight":{},"highlights":[]},{"document":{"id":"1649","name":"My + name is 1649"},"highlight":{},"highlights":[]},{"document":{"id":"1648","name":"My + name is 1648"},"highlight":{},"highlights":[]},{"document":{"id":"1647","name":"My + name is 1647"},"highlight":{},"highlights":[]},{"document":{"id":"1646","name":"My + name is 1646"},"highlight":{},"highlights":[]},{"document":{"id":"1645","name":"My + name is 1645"},"highlight":{},"highlights":[]},{"document":{"id":"1644","name":"My + name is 1644"},"highlight":{},"highlights":[]},{"document":{"id":"1643","name":"My + name is 1643"},"highlight":{},"highlights":[]},{"document":{"id":"1642","name":"My + name is 1642"},"highlight":{},"highlights":[]},{"document":{"id":"1641","name":"My + name is 1641"},"highlight":{},"highlights":[]},{"document":{"id":"1640","name":"My + name is 1640"},"highlight":{},"highlights":[]},{"document":{"id":"1639","name":"My + name is 1639"},"highlight":{},"highlights":[]},{"document":{"id":"1638","name":"My + name is 1638"},"highlight":{},"highlights":[]},{"document":{"id":"1637","name":"My + name is 1637"},"highlight":{},"highlights":[]},{"document":{"id":"1636","name":"My + name is 1636"},"highlight":{},"highlights":[]},{"document":{"id":"1635","name":"My + name is 1635"},"highlight":{},"highlights":[]},{"document":{"id":"1634","name":"My + name is 1634"},"highlight":{},"highlights":[]},{"document":{"id":"1633","name":"My + name is 1633"},"highlight":{},"highlights":[]},{"document":{"id":"1632","name":"My + name is 1632"},"highlight":{},"highlights":[]},{"document":{"id":"1631","name":"My + name is 1631"},"highlight":{},"highlights":[]},{"document":{"id":"1630","name":"My + name is 1630"},"highlight":{},"highlights":[]},{"document":{"id":"1629","name":"My + name is 1629"},"highlight":{},"highlights":[]},{"document":{"id":"1628","name":"My + name is 1628"},"highlight":{},"highlights":[]},{"document":{"id":"1627","name":"My + name is 1627"},"highlight":{},"highlights":[]},{"document":{"id":"1626","name":"My + name is 1626"},"highlight":{},"highlights":[]},{"document":{"id":"1625","name":"My + name is 1625"},"highlight":{},"highlights":[]},{"document":{"id":"1624","name":"My + name is 1624"},"highlight":{},"highlights":[]},{"document":{"id":"1623","name":"My + name is 1623"},"highlight":{},"highlights":[]},{"document":{"id":"1622","name":"My + name is 1622"},"highlight":{},"highlights":[]},{"document":{"id":"1621","name":"My + name is 1621"},"highlight":{},"highlights":[]},{"document":{"id":"1620","name":"My + name is 1620"},"highlight":{},"highlights":[]},{"document":{"id":"1619","name":"My + name is 1619"},"highlight":{},"highlights":[]},{"document":{"id":"1618","name":"My + name is 1618"},"highlight":{},"highlights":[]},{"document":{"id":"1617","name":"My + name is 1617"},"highlight":{},"highlights":[]},{"document":{"id":"1616","name":"My + name is 1616"},"highlight":{},"highlights":[]},{"document":{"id":"1615","name":"My + name is 1615"},"highlight":{},"highlights":[]},{"document":{"id":"1614","name":"My + name is 1614"},"highlight":{},"highlights":[]},{"document":{"id":"1613","name":"My + name is 1613"},"highlight":{},"highlights":[]},{"document":{"id":"1612","name":"My + name is 1612"},"highlight":{},"highlights":[]},{"document":{"id":"1611","name":"My + name is 1611"},"highlight":{},"highlights":[]},{"document":{"id":"1610","name":"My + name is 1610"},"highlight":{},"highlights":[]},{"document":{"id":"1609","name":"My + name is 1609"},"highlight":{},"highlights":[]},{"document":{"id":"1608","name":"My + name is 1608"},"highlight":{},"highlights":[]},{"document":{"id":"1607","name":"My + name is 1607"},"highlight":{},"highlights":[]},{"document":{"id":"1606","name":"My + name is 1606"},"highlight":{},"highlights":[]},{"document":{"id":"1605","name":"My + name is 1605"},"highlight":{},"highlights":[]},{"document":{"id":"1604","name":"My + name is 1604"},"highlight":{},"highlights":[]},{"document":{"id":"1603","name":"My + name is 1603"},"highlight":{},"highlights":[]},{"document":{"id":"1602","name":"My + name is 1602"},"highlight":{},"highlights":[]},{"document":{"id":"1601","name":"My + name is 1601"},"highlight":{},"highlights":[]},{"document":{"id":"1600","name":"My + name is 1600"},"highlight":{},"highlights":[]},{"document":{"id":"1599","name":"My + name is 1599"},"highlight":{},"highlights":[]},{"document":{"id":"1598","name":"My + name is 1598"},"highlight":{},"highlights":[]},{"document":{"id":"1597","name":"My + name is 1597"},"highlight":{},"highlights":[]},{"document":{"id":"1596","name":"My + name is 1596"},"highlight":{},"highlights":[]},{"document":{"id":"1595","name":"My + name is 1595"},"highlight":{},"highlights":[]},{"document":{"id":"1594","name":"My + name is 1594"},"highlight":{},"highlights":[]},{"document":{"id":"1593","name":"My + name is 1593"},"highlight":{},"highlights":[]},{"document":{"id":"1592","name":"My + name is 1592"},"highlight":{},"highlights":[]},{"document":{"id":"1591","name":"My + name is 1591"},"highlight":{},"highlights":[]},{"document":{"id":"1590","name":"My + name is 1590"},"highlight":{},"highlights":[]},{"document":{"id":"1589","name":"My + name is 1589"},"highlight":{},"highlights":[]},{"document":{"id":"1588","name":"My + name is 1588"},"highlight":{},"highlights":[]},{"document":{"id":"1587","name":"My + name is 1587"},"highlight":{},"highlights":[]},{"document":{"id":"1586","name":"My + name is 1586"},"highlight":{},"highlights":[]},{"document":{"id":"1585","name":"My + name is 1585"},"highlight":{},"highlights":[]},{"document":{"id":"1584","name":"My + name is 1584"},"highlight":{},"highlights":[]},{"document":{"id":"1583","name":"My + name is 1583"},"highlight":{},"highlights":[]},{"document":{"id":"1582","name":"My + name is 1582"},"highlight":{},"highlights":[]},{"document":{"id":"1581","name":"My + name is 1581"},"highlight":{},"highlights":[]},{"document":{"id":"1580","name":"My + name is 1580"},"highlight":{},"highlights":[]},{"document":{"id":"1579","name":"My + name is 1579"},"highlight":{},"highlights":[]},{"document":{"id":"1578","name":"My + name is 1578"},"highlight":{},"highlights":[]},{"document":{"id":"1577","name":"My + name is 1577"},"highlight":{},"highlights":[]},{"document":{"id":"1576","name":"My + name is 1576"},"highlight":{},"highlights":[]},{"document":{"id":"1575","name":"My + name is 1575"},"highlight":{},"highlights":[]},{"document":{"id":"1574","name":"My + name is 1574"},"highlight":{},"highlights":[]},{"document":{"id":"1573","name":"My + name is 1573"},"highlight":{},"highlights":[]},{"document":{"id":"1572","name":"My + name is 1572"},"highlight":{},"highlights":[]},{"document":{"id":"1571","name":"My + name is 1571"},"highlight":{},"highlights":[]},{"document":{"id":"1570","name":"My + name is 1570"},"highlight":{},"highlights":[]},{"document":{"id":"1569","name":"My + name is 1569"},"highlight":{},"highlights":[]},{"document":{"id":"1568","name":"My + name is 1568"},"highlight":{},"highlights":[]},{"document":{"id":"1567","name":"My + name is 1567"},"highlight":{},"highlights":[]},{"document":{"id":"1566","name":"My + name is 1566"},"highlight":{},"highlights":[]},{"document":{"id":"1565","name":"My + name is 1565"},"highlight":{},"highlights":[]},{"document":{"id":"1564","name":"My + name is 1564"},"highlight":{},"highlights":[]},{"document":{"id":"1563","name":"My + name is 1563"},"highlight":{},"highlights":[]},{"document":{"id":"1562","name":"My + name is 1562"},"highlight":{},"highlights":[]},{"document":{"id":"1561","name":"My + name is 1561"},"highlight":{},"highlights":[]},{"document":{"id":"1560","name":"My + name is 1560"},"highlight":{},"highlights":[]},{"document":{"id":"1559","name":"My + name is 1559"},"highlight":{},"highlights":[]},{"document":{"id":"1558","name":"My + name is 1558"},"highlight":{},"highlights":[]},{"document":{"id":"1557","name":"My + name is 1557"},"highlight":{},"highlights":[]},{"document":{"id":"1556","name":"My + name is 1556"},"highlight":{},"highlights":[]},{"document":{"id":"1555","name":"My + name is 1555"},"highlight":{},"highlights":[]},{"document":{"id":"1554","name":"My + name is 1554"},"highlight":{},"highlights":[]},{"document":{"id":"1553","name":"My + name is 1553"},"highlight":{},"highlights":[]},{"document":{"id":"1552","name":"My + name is 1552"},"highlight":{},"highlights":[]},{"document":{"id":"1551","name":"My + name is 1551"},"highlight":{},"highlights":[]},{"document":{"id":"1550","name":"My + name is 1550"},"highlight":{},"highlights":[]},{"document":{"id":"1549","name":"My + name is 1549"},"highlight":{},"highlights":[]},{"document":{"id":"1548","name":"My + name is 1548"},"highlight":{},"highlights":[]},{"document":{"id":"1547","name":"My + name is 1547"},"highlight":{},"highlights":[]},{"document":{"id":"1546","name":"My + name is 1546"},"highlight":{},"highlights":[]},{"document":{"id":"1545","name":"My + name is 1545"},"highlight":{},"highlights":[]},{"document":{"id":"1544","name":"My + name is 1544"},"highlight":{},"highlights":[]},{"document":{"id":"1543","name":"My + name is 1543"},"highlight":{},"highlights":[]},{"document":{"id":"1542","name":"My + name is 1542"},"highlight":{},"highlights":[]},{"document":{"id":"1541","name":"My + name is 1541"},"highlight":{},"highlights":[]},{"document":{"id":"1540","name":"My + name is 1540"},"highlight":{},"highlights":[]},{"document":{"id":"1539","name":"My + name is 1539"},"highlight":{},"highlights":[]},{"document":{"id":"1538","name":"My + name is 1538"},"highlight":{},"highlights":[]},{"document":{"id":"1537","name":"My + name is 1537"},"highlight":{},"highlights":[]},{"document":{"id":"1536","name":"My + name is 1536"},"highlight":{},"highlights":[]},{"document":{"id":"1535","name":"My + name is 1535"},"highlight":{},"highlights":[]},{"document":{"id":"1534","name":"My + name is 1534"},"highlight":{},"highlights":[]},{"document":{"id":"1533","name":"My + name is 1533"},"highlight":{},"highlights":[]},{"document":{"id":"1532","name":"My + name is 1532"},"highlight":{},"highlights":[]},{"document":{"id":"1531","name":"My + name is 1531"},"highlight":{},"highlights":[]},{"document":{"id":"1530","name":"My + name is 1530"},"highlight":{},"highlights":[]},{"document":{"id":"1529","name":"My + name is 1529"},"highlight":{},"highlights":[]},{"document":{"id":"1528","name":"My + name is 1528"},"highlight":{},"highlights":[]},{"document":{"id":"1527","name":"My + name is 1527"},"highlight":{},"highlights":[]},{"document":{"id":"1526","name":"My + name is 1526"},"highlight":{},"highlights":[]},{"document":{"id":"1525","name":"My + name is 1525"},"highlight":{},"highlights":[]},{"document":{"id":"1524","name":"My + name is 1524"},"highlight":{},"highlights":[]},{"document":{"id":"1523","name":"My + name is 1523"},"highlight":{},"highlights":[]},{"document":{"id":"1522","name":"My + name is 1522"},"highlight":{},"highlights":[]},{"document":{"id":"1521","name":"My + name is 1521"},"highlight":{},"highlights":[]},{"document":{"id":"1520","name":"My + name is 1520"},"highlight":{},"highlights":[]},{"document":{"id":"1519","name":"My + name is 1519"},"highlight":{},"highlights":[]},{"document":{"id":"1518","name":"My + name is 1518"},"highlight":{},"highlights":[]},{"document":{"id":"1517","name":"My + name is 1517"},"highlight":{},"highlights":[]},{"document":{"id":"1516","name":"My + name is 1516"},"highlight":{},"highlights":[]},{"document":{"id":"1515","name":"My + name is 1515"},"highlight":{},"highlights":[]},{"document":{"id":"1514","name":"My + name is 1514"},"highlight":{},"highlights":[]},{"document":{"id":"1513","name":"My + name is 1513"},"highlight":{},"highlights":[]},{"document":{"id":"1512","name":"My + name is 1512"},"highlight":{},"highlights":[]},{"document":{"id":"1511","name":"My + name is 1511"},"highlight":{},"highlights":[]},{"document":{"id":"1510","name":"My + name is 1510"},"highlight":{},"highlights":[]},{"document":{"id":"1509","name":"My + name is 1509"},"highlight":{},"highlights":[]},{"document":{"id":"1508","name":"My + name is 1508"},"highlight":{},"highlights":[]},{"document":{"id":"1507","name":"My + name is 1507"},"highlight":{},"highlights":[]},{"document":{"id":"1506","name":"My + name is 1506"},"highlight":{},"highlights":[]},{"document":{"id":"1505","name":"My + name is 1505"},"highlight":{},"highlights":[]},{"document":{"id":"1504","name":"My + name is 1504"},"highlight":{},"highlights":[]},{"document":{"id":"1503","name":"My + name is 1503"},"highlight":{},"highlights":[]},{"document":{"id":"1502","name":"My + name is 1502"},"highlight":{},"highlights":[]},{"document":{"id":"1501","name":"My + name is 1501"},"highlight":{},"highlights":[]},{"document":{"id":"1500","name":"My + name is 1500"},"highlight":{},"highlights":[]}],"out_of":1999,"page":2,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":1}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20968' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=3 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"1499","name":"My + name is 1499"},"highlight":{},"highlights":[]},{"document":{"id":"1498","name":"My + name is 1498"},"highlight":{},"highlights":[]},{"document":{"id":"1497","name":"My + name is 1497"},"highlight":{},"highlights":[]},{"document":{"id":"1496","name":"My + name is 1496"},"highlight":{},"highlights":[]},{"document":{"id":"1495","name":"My + name is 1495"},"highlight":{},"highlights":[]},{"document":{"id":"1494","name":"My + name is 1494"},"highlight":{},"highlights":[]},{"document":{"id":"1493","name":"My + name is 1493"},"highlight":{},"highlights":[]},{"document":{"id":"1492","name":"My + name is 1492"},"highlight":{},"highlights":[]},{"document":{"id":"1491","name":"My + name is 1491"},"highlight":{},"highlights":[]},{"document":{"id":"1490","name":"My + name is 1490"},"highlight":{},"highlights":[]},{"document":{"id":"1489","name":"My + name is 1489"},"highlight":{},"highlights":[]},{"document":{"id":"1488","name":"My + name is 1488"},"highlight":{},"highlights":[]},{"document":{"id":"1487","name":"My + name is 1487"},"highlight":{},"highlights":[]},{"document":{"id":"1486","name":"My + name is 1486"},"highlight":{},"highlights":[]},{"document":{"id":"1485","name":"My + name is 1485"},"highlight":{},"highlights":[]},{"document":{"id":"1484","name":"My + name is 1484"},"highlight":{},"highlights":[]},{"document":{"id":"1483","name":"My + name is 1483"},"highlight":{},"highlights":[]},{"document":{"id":"1482","name":"My + name is 1482"},"highlight":{},"highlights":[]},{"document":{"id":"1481","name":"My + name is 1481"},"highlight":{},"highlights":[]},{"document":{"id":"1480","name":"My + name is 1480"},"highlight":{},"highlights":[]},{"document":{"id":"1479","name":"My + name is 1479"},"highlight":{},"highlights":[]},{"document":{"id":"1478","name":"My + name is 1478"},"highlight":{},"highlights":[]},{"document":{"id":"1477","name":"My + name is 1477"},"highlight":{},"highlights":[]},{"document":{"id":"1476","name":"My + name is 1476"},"highlight":{},"highlights":[]},{"document":{"id":"1475","name":"My + name is 1475"},"highlight":{},"highlights":[]},{"document":{"id":"1474","name":"My + name is 1474"},"highlight":{},"highlights":[]},{"document":{"id":"1473","name":"My + name is 1473"},"highlight":{},"highlights":[]},{"document":{"id":"1472","name":"My + name is 1472"},"highlight":{},"highlights":[]},{"document":{"id":"1471","name":"My + name is 1471"},"highlight":{},"highlights":[]},{"document":{"id":"1470","name":"My + name is 1470"},"highlight":{},"highlights":[]},{"document":{"id":"1469","name":"My + name is 1469"},"highlight":{},"highlights":[]},{"document":{"id":"1468","name":"My + name is 1468"},"highlight":{},"highlights":[]},{"document":{"id":"1467","name":"My + name is 1467"},"highlight":{},"highlights":[]},{"document":{"id":"1466","name":"My + name is 1466"},"highlight":{},"highlights":[]},{"document":{"id":"1465","name":"My + name is 1465"},"highlight":{},"highlights":[]},{"document":{"id":"1464","name":"My + name is 1464"},"highlight":{},"highlights":[]},{"document":{"id":"1463","name":"My + name is 1463"},"highlight":{},"highlights":[]},{"document":{"id":"1462","name":"My + name is 1462"},"highlight":{},"highlights":[]},{"document":{"id":"1461","name":"My + name is 1461"},"highlight":{},"highlights":[]},{"document":{"id":"1460","name":"My + name is 1460"},"highlight":{},"highlights":[]},{"document":{"id":"1459","name":"My + name is 1459"},"highlight":{},"highlights":[]},{"document":{"id":"1458","name":"My + name is 1458"},"highlight":{},"highlights":[]},{"document":{"id":"1457","name":"My + name is 1457"},"highlight":{},"highlights":[]},{"document":{"id":"1456","name":"My + name is 1456"},"highlight":{},"highlights":[]},{"document":{"id":"1455","name":"My + name is 1455"},"highlight":{},"highlights":[]},{"document":{"id":"1454","name":"My + name is 1454"},"highlight":{},"highlights":[]},{"document":{"id":"1453","name":"My + name is 1453"},"highlight":{},"highlights":[]},{"document":{"id":"1452","name":"My + name is 1452"},"highlight":{},"highlights":[]},{"document":{"id":"1451","name":"My + name is 1451"},"highlight":{},"highlights":[]},{"document":{"id":"1450","name":"My + name is 1450"},"highlight":{},"highlights":[]},{"document":{"id":"1449","name":"My + name is 1449"},"highlight":{},"highlights":[]},{"document":{"id":"1448","name":"My + name is 1448"},"highlight":{},"highlights":[]},{"document":{"id":"1447","name":"My + name is 1447"},"highlight":{},"highlights":[]},{"document":{"id":"1446","name":"My + name is 1446"},"highlight":{},"highlights":[]},{"document":{"id":"1445","name":"My + name is 1445"},"highlight":{},"highlights":[]},{"document":{"id":"1444","name":"My + name is 1444"},"highlight":{},"highlights":[]},{"document":{"id":"1443","name":"My + name is 1443"},"highlight":{},"highlights":[]},{"document":{"id":"1442","name":"My + name is 1442"},"highlight":{},"highlights":[]},{"document":{"id":"1441","name":"My + name is 1441"},"highlight":{},"highlights":[]},{"document":{"id":"1440","name":"My + name is 1440"},"highlight":{},"highlights":[]},{"document":{"id":"1439","name":"My + name is 1439"},"highlight":{},"highlights":[]},{"document":{"id":"1438","name":"My + name is 1438"},"highlight":{},"highlights":[]},{"document":{"id":"1437","name":"My + name is 1437"},"highlight":{},"highlights":[]},{"document":{"id":"1436","name":"My + name is 1436"},"highlight":{},"highlights":[]},{"document":{"id":"1435","name":"My + name is 1435"},"highlight":{},"highlights":[]},{"document":{"id":"1434","name":"My + name is 1434"},"highlight":{},"highlights":[]},{"document":{"id":"1433","name":"My + name is 1433"},"highlight":{},"highlights":[]},{"document":{"id":"1432","name":"My + name is 1432"},"highlight":{},"highlights":[]},{"document":{"id":"1431","name":"My + name is 1431"},"highlight":{},"highlights":[]},{"document":{"id":"1430","name":"My + name is 1430"},"highlight":{},"highlights":[]},{"document":{"id":"1429","name":"My + name is 1429"},"highlight":{},"highlights":[]},{"document":{"id":"1428","name":"My + name is 1428"},"highlight":{},"highlights":[]},{"document":{"id":"1427","name":"My + name is 1427"},"highlight":{},"highlights":[]},{"document":{"id":"1426","name":"My + name is 1426"},"highlight":{},"highlights":[]},{"document":{"id":"1425","name":"My + name is 1425"},"highlight":{},"highlights":[]},{"document":{"id":"1424","name":"My + name is 1424"},"highlight":{},"highlights":[]},{"document":{"id":"1423","name":"My + name is 1423"},"highlight":{},"highlights":[]},{"document":{"id":"1422","name":"My + name is 1422"},"highlight":{},"highlights":[]},{"document":{"id":"1421","name":"My + name is 1421"},"highlight":{},"highlights":[]},{"document":{"id":"1420","name":"My + name is 1420"},"highlight":{},"highlights":[]},{"document":{"id":"1419","name":"My + name is 1419"},"highlight":{},"highlights":[]},{"document":{"id":"1418","name":"My + name is 1418"},"highlight":{},"highlights":[]},{"document":{"id":"1417","name":"My + name is 1417"},"highlight":{},"highlights":[]},{"document":{"id":"1416","name":"My + name is 1416"},"highlight":{},"highlights":[]},{"document":{"id":"1415","name":"My + name is 1415"},"highlight":{},"highlights":[]},{"document":{"id":"1414","name":"My + name is 1414"},"highlight":{},"highlights":[]},{"document":{"id":"1413","name":"My + name is 1413"},"highlight":{},"highlights":[]},{"document":{"id":"1412","name":"My + name is 1412"},"highlight":{},"highlights":[]},{"document":{"id":"1411","name":"My + name is 1411"},"highlight":{},"highlights":[]},{"document":{"id":"1410","name":"My + name is 1410"},"highlight":{},"highlights":[]},{"document":{"id":"1409","name":"My + name is 1409"},"highlight":{},"highlights":[]},{"document":{"id":"1408","name":"My + name is 1408"},"highlight":{},"highlights":[]},{"document":{"id":"1407","name":"My + name is 1407"},"highlight":{},"highlights":[]},{"document":{"id":"1406","name":"My + name is 1406"},"highlight":{},"highlights":[]},{"document":{"id":"1405","name":"My + name is 1405"},"highlight":{},"highlights":[]},{"document":{"id":"1404","name":"My + name is 1404"},"highlight":{},"highlights":[]},{"document":{"id":"1403","name":"My + name is 1403"},"highlight":{},"highlights":[]},{"document":{"id":"1402","name":"My + name is 1402"},"highlight":{},"highlights":[]},{"document":{"id":"1401","name":"My + name is 1401"},"highlight":{},"highlights":[]},{"document":{"id":"1400","name":"My + name is 1400"},"highlight":{},"highlights":[]},{"document":{"id":"1399","name":"My + name is 1399"},"highlight":{},"highlights":[]},{"document":{"id":"1398","name":"My + name is 1398"},"highlight":{},"highlights":[]},{"document":{"id":"1397","name":"My + name is 1397"},"highlight":{},"highlights":[]},{"document":{"id":"1396","name":"My + name is 1396"},"highlight":{},"highlights":[]},{"document":{"id":"1395","name":"My + name is 1395"},"highlight":{},"highlights":[]},{"document":{"id":"1394","name":"My + name is 1394"},"highlight":{},"highlights":[]},{"document":{"id":"1393","name":"My + name is 1393"},"highlight":{},"highlights":[]},{"document":{"id":"1392","name":"My + name is 1392"},"highlight":{},"highlights":[]},{"document":{"id":"1391","name":"My + name is 1391"},"highlight":{},"highlights":[]},{"document":{"id":"1390","name":"My + name is 1390"},"highlight":{},"highlights":[]},{"document":{"id":"1389","name":"My + name is 1389"},"highlight":{},"highlights":[]},{"document":{"id":"1388","name":"My + name is 1388"},"highlight":{},"highlights":[]},{"document":{"id":"1387","name":"My + name is 1387"},"highlight":{},"highlights":[]},{"document":{"id":"1386","name":"My + name is 1386"},"highlight":{},"highlights":[]},{"document":{"id":"1385","name":"My + name is 1385"},"highlight":{},"highlights":[]},{"document":{"id":"1384","name":"My + name is 1384"},"highlight":{},"highlights":[]},{"document":{"id":"1383","name":"My + name is 1383"},"highlight":{},"highlights":[]},{"document":{"id":"1382","name":"My + name is 1382"},"highlight":{},"highlights":[]},{"document":{"id":"1381","name":"My + name is 1381"},"highlight":{},"highlights":[]},{"document":{"id":"1380","name":"My + name is 1380"},"highlight":{},"highlights":[]},{"document":{"id":"1379","name":"My + name is 1379"},"highlight":{},"highlights":[]},{"document":{"id":"1378","name":"My + name is 1378"},"highlight":{},"highlights":[]},{"document":{"id":"1377","name":"My + name is 1377"},"highlight":{},"highlights":[]},{"document":{"id":"1376","name":"My + name is 1376"},"highlight":{},"highlights":[]},{"document":{"id":"1375","name":"My + name is 1375"},"highlight":{},"highlights":[]},{"document":{"id":"1374","name":"My + name is 1374"},"highlight":{},"highlights":[]},{"document":{"id":"1373","name":"My + name is 1373"},"highlight":{},"highlights":[]},{"document":{"id":"1372","name":"My + name is 1372"},"highlight":{},"highlights":[]},{"document":{"id":"1371","name":"My + name is 1371"},"highlight":{},"highlights":[]},{"document":{"id":"1370","name":"My + name is 1370"},"highlight":{},"highlights":[]},{"document":{"id":"1369","name":"My + name is 1369"},"highlight":{},"highlights":[]},{"document":{"id":"1368","name":"My + name is 1368"},"highlight":{},"highlights":[]},{"document":{"id":"1367","name":"My + name is 1367"},"highlight":{},"highlights":[]},{"document":{"id":"1366","name":"My + name is 1366"},"highlight":{},"highlights":[]},{"document":{"id":"1365","name":"My + name is 1365"},"highlight":{},"highlights":[]},{"document":{"id":"1364","name":"My + name is 1364"},"highlight":{},"highlights":[]},{"document":{"id":"1363","name":"My + name is 1363"},"highlight":{},"highlights":[]},{"document":{"id":"1362","name":"My + name is 1362"},"highlight":{},"highlights":[]},{"document":{"id":"1361","name":"My + name is 1361"},"highlight":{},"highlights":[]},{"document":{"id":"1360","name":"My + name is 1360"},"highlight":{},"highlights":[]},{"document":{"id":"1359","name":"My + name is 1359"},"highlight":{},"highlights":[]},{"document":{"id":"1358","name":"My + name is 1358"},"highlight":{},"highlights":[]},{"document":{"id":"1357","name":"My + name is 1357"},"highlight":{},"highlights":[]},{"document":{"id":"1356","name":"My + name is 1356"},"highlight":{},"highlights":[]},{"document":{"id":"1355","name":"My + name is 1355"},"highlight":{},"highlights":[]},{"document":{"id":"1354","name":"My + name is 1354"},"highlight":{},"highlights":[]},{"document":{"id":"1353","name":"My + name is 1353"},"highlight":{},"highlights":[]},{"document":{"id":"1352","name":"My + name is 1352"},"highlight":{},"highlights":[]},{"document":{"id":"1351","name":"My + name is 1351"},"highlight":{},"highlights":[]},{"document":{"id":"1350","name":"My + name is 1350"},"highlight":{},"highlights":[]},{"document":{"id":"1349","name":"My + name is 1349"},"highlight":{},"highlights":[]},{"document":{"id":"1348","name":"My + name is 1348"},"highlight":{},"highlights":[]},{"document":{"id":"1347","name":"My + name is 1347"},"highlight":{},"highlights":[]},{"document":{"id":"1346","name":"My + name is 1346"},"highlight":{},"highlights":[]},{"document":{"id":"1345","name":"My + name is 1345"},"highlight":{},"highlights":[]},{"document":{"id":"1344","name":"My + name is 1344"},"highlight":{},"highlights":[]},{"document":{"id":"1343","name":"My + name is 1343"},"highlight":{},"highlights":[]},{"document":{"id":"1342","name":"My + name is 1342"},"highlight":{},"highlights":[]},{"document":{"id":"1341","name":"My + name is 1341"},"highlight":{},"highlights":[]},{"document":{"id":"1340","name":"My + name is 1340"},"highlight":{},"highlights":[]},{"document":{"id":"1339","name":"My + name is 1339"},"highlight":{},"highlights":[]},{"document":{"id":"1338","name":"My + name is 1338"},"highlight":{},"highlights":[]},{"document":{"id":"1337","name":"My + name is 1337"},"highlight":{},"highlights":[]},{"document":{"id":"1336","name":"My + name is 1336"},"highlight":{},"highlights":[]},{"document":{"id":"1335","name":"My + name is 1335"},"highlight":{},"highlights":[]},{"document":{"id":"1334","name":"My + name is 1334"},"highlight":{},"highlights":[]},{"document":{"id":"1333","name":"My + name is 1333"},"highlight":{},"highlights":[]},{"document":{"id":"1332","name":"My + name is 1332"},"highlight":{},"highlights":[]},{"document":{"id":"1331","name":"My + name is 1331"},"highlight":{},"highlights":[]},{"document":{"id":"1330","name":"My + name is 1330"},"highlight":{},"highlights":[]},{"document":{"id":"1329","name":"My + name is 1329"},"highlight":{},"highlights":[]},{"document":{"id":"1328","name":"My + name is 1328"},"highlight":{},"highlights":[]},{"document":{"id":"1327","name":"My + name is 1327"},"highlight":{},"highlights":[]},{"document":{"id":"1326","name":"My + name is 1326"},"highlight":{},"highlights":[]},{"document":{"id":"1325","name":"My + name is 1325"},"highlight":{},"highlights":[]},{"document":{"id":"1324","name":"My + name is 1324"},"highlight":{},"highlights":[]},{"document":{"id":"1323","name":"My + name is 1323"},"highlight":{},"highlights":[]},{"document":{"id":"1322","name":"My + name is 1322"},"highlight":{},"highlights":[]},{"document":{"id":"1321","name":"My + name is 1321"},"highlight":{},"highlights":[]},{"document":{"id":"1320","name":"My + name is 1320"},"highlight":{},"highlights":[]},{"document":{"id":"1319","name":"My + name is 1319"},"highlight":{},"highlights":[]},{"document":{"id":"1318","name":"My + name is 1318"},"highlight":{},"highlights":[]},{"document":{"id":"1317","name":"My + name is 1317"},"highlight":{},"highlights":[]},{"document":{"id":"1316","name":"My + name is 1316"},"highlight":{},"highlights":[]},{"document":{"id":"1315","name":"My + name is 1315"},"highlight":{},"highlights":[]},{"document":{"id":"1314","name":"My + name is 1314"},"highlight":{},"highlights":[]},{"document":{"id":"1313","name":"My + name is 1313"},"highlight":{},"highlights":[]},{"document":{"id":"1312","name":"My + name is 1312"},"highlight":{},"highlights":[]},{"document":{"id":"1311","name":"My + name is 1311"},"highlight":{},"highlights":[]},{"document":{"id":"1310","name":"My + name is 1310"},"highlight":{},"highlights":[]},{"document":{"id":"1309","name":"My + name is 1309"},"highlight":{},"highlights":[]},{"document":{"id":"1308","name":"My + name is 1308"},"highlight":{},"highlights":[]},{"document":{"id":"1307","name":"My + name is 1307"},"highlight":{},"highlights":[]},{"document":{"id":"1306","name":"My + name is 1306"},"highlight":{},"highlights":[]},{"document":{"id":"1305","name":"My + name is 1305"},"highlight":{},"highlights":[]},{"document":{"id":"1304","name":"My + name is 1304"},"highlight":{},"highlights":[]},{"document":{"id":"1303","name":"My + name is 1303"},"highlight":{},"highlights":[]},{"document":{"id":"1302","name":"My + name is 1302"},"highlight":{},"highlights":[]},{"document":{"id":"1301","name":"My + name is 1301"},"highlight":{},"highlights":[]},{"document":{"id":"1300","name":"My + name is 1300"},"highlight":{},"highlights":[]},{"document":{"id":"1299","name":"My + name is 1299"},"highlight":{},"highlights":[]},{"document":{"id":"1298","name":"My + name is 1298"},"highlight":{},"highlights":[]},{"document":{"id":"1297","name":"My + name is 1297"},"highlight":{},"highlights":[]},{"document":{"id":"1296","name":"My + name is 1296"},"highlight":{},"highlights":[]},{"document":{"id":"1295","name":"My + name is 1295"},"highlight":{},"highlights":[]},{"document":{"id":"1294","name":"My + name is 1294"},"highlight":{},"highlights":[]},{"document":{"id":"1293","name":"My + name is 1293"},"highlight":{},"highlights":[]},{"document":{"id":"1292","name":"My + name is 1292"},"highlight":{},"highlights":[]},{"document":{"id":"1291","name":"My + name is 1291"},"highlight":{},"highlights":[]},{"document":{"id":"1290","name":"My + name is 1290"},"highlight":{},"highlights":[]},{"document":{"id":"1289","name":"My + name is 1289"},"highlight":{},"highlights":[]},{"document":{"id":"1288","name":"My + name is 1288"},"highlight":{},"highlights":[]},{"document":{"id":"1287","name":"My + name is 1287"},"highlight":{},"highlights":[]},{"document":{"id":"1286","name":"My + name is 1286"},"highlight":{},"highlights":[]},{"document":{"id":"1285","name":"My + name is 1285"},"highlight":{},"highlights":[]},{"document":{"id":"1284","name":"My + name is 1284"},"highlight":{},"highlights":[]},{"document":{"id":"1283","name":"My + name is 1283"},"highlight":{},"highlights":[]},{"document":{"id":"1282","name":"My + name is 1282"},"highlight":{},"highlights":[]},{"document":{"id":"1281","name":"My + name is 1281"},"highlight":{},"highlights":[]},{"document":{"id":"1280","name":"My + name is 1280"},"highlight":{},"highlights":[]},{"document":{"id":"1279","name":"My + name is 1279"},"highlight":{},"highlights":[]},{"document":{"id":"1278","name":"My + name is 1278"},"highlight":{},"highlights":[]},{"document":{"id":"1277","name":"My + name is 1277"},"highlight":{},"highlights":[]},{"document":{"id":"1276","name":"My + name is 1276"},"highlight":{},"highlights":[]},{"document":{"id":"1275","name":"My + name is 1275"},"highlight":{},"highlights":[]},{"document":{"id":"1274","name":"My + name is 1274"},"highlight":{},"highlights":[]},{"document":{"id":"1273","name":"My + name is 1273"},"highlight":{},"highlights":[]},{"document":{"id":"1272","name":"My + name is 1272"},"highlight":{},"highlights":[]},{"document":{"id":"1271","name":"My + name is 1271"},"highlight":{},"highlights":[]},{"document":{"id":"1270","name":"My + name is 1270"},"highlight":{},"highlights":[]},{"document":{"id":"1269","name":"My + name is 1269"},"highlight":{},"highlights":[]},{"document":{"id":"1268","name":"My + name is 1268"},"highlight":{},"highlights":[]},{"document":{"id":"1267","name":"My + name is 1267"},"highlight":{},"highlights":[]},{"document":{"id":"1266","name":"My + name is 1266"},"highlight":{},"highlights":[]},{"document":{"id":"1265","name":"My + name is 1265"},"highlight":{},"highlights":[]},{"document":{"id":"1264","name":"My + name is 1264"},"highlight":{},"highlights":[]},{"document":{"id":"1263","name":"My + name is 1263"},"highlight":{},"highlights":[]},{"document":{"id":"1262","name":"My + name is 1262"},"highlight":{},"highlights":[]},{"document":{"id":"1261","name":"My + name is 1261"},"highlight":{},"highlights":[]},{"document":{"id":"1260","name":"My + name is 1260"},"highlight":{},"highlights":[]},{"document":{"id":"1259","name":"My + name is 1259"},"highlight":{},"highlights":[]},{"document":{"id":"1258","name":"My + name is 1258"},"highlight":{},"highlights":[]},{"document":{"id":"1257","name":"My + name is 1257"},"highlight":{},"highlights":[]},{"document":{"id":"1256","name":"My + name is 1256"},"highlight":{},"highlights":[]},{"document":{"id":"1255","name":"My + name is 1255"},"highlight":{},"highlights":[]},{"document":{"id":"1254","name":"My + name is 1254"},"highlight":{},"highlights":[]},{"document":{"id":"1253","name":"My + name is 1253"},"highlight":{},"highlights":[]},{"document":{"id":"1252","name":"My + name is 1252"},"highlight":{},"highlights":[]},{"document":{"id":"1251","name":"My + name is 1251"},"highlight":{},"highlights":[]},{"document":{"id":"1250","name":"My + name is 1250"},"highlight":{},"highlights":[]}],"out_of":1999,"page":3,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":1}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20968' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=4 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"1249","name":"My + name is 1249"},"highlight":{},"highlights":[]},{"document":{"id":"1248","name":"My + name is 1248"},"highlight":{},"highlights":[]},{"document":{"id":"1247","name":"My + name is 1247"},"highlight":{},"highlights":[]},{"document":{"id":"1246","name":"My + name is 1246"},"highlight":{},"highlights":[]},{"document":{"id":"1245","name":"My + name is 1245"},"highlight":{},"highlights":[]},{"document":{"id":"1244","name":"My + name is 1244"},"highlight":{},"highlights":[]},{"document":{"id":"1243","name":"My + name is 1243"},"highlight":{},"highlights":[]},{"document":{"id":"1242","name":"My + name is 1242"},"highlight":{},"highlights":[]},{"document":{"id":"1241","name":"My + name is 1241"},"highlight":{},"highlights":[]},{"document":{"id":"1240","name":"My + name is 1240"},"highlight":{},"highlights":[]},{"document":{"id":"1239","name":"My + name is 1239"},"highlight":{},"highlights":[]},{"document":{"id":"1238","name":"My + name is 1238"},"highlight":{},"highlights":[]},{"document":{"id":"1237","name":"My + name is 1237"},"highlight":{},"highlights":[]},{"document":{"id":"1236","name":"My + name is 1236"},"highlight":{},"highlights":[]},{"document":{"id":"1235","name":"My + name is 1235"},"highlight":{},"highlights":[]},{"document":{"id":"1234","name":"My + name is 1234"},"highlight":{},"highlights":[]},{"document":{"id":"1233","name":"My + name is 1233"},"highlight":{},"highlights":[]},{"document":{"id":"1232","name":"My + name is 1232"},"highlight":{},"highlights":[]},{"document":{"id":"1231","name":"My + name is 1231"},"highlight":{},"highlights":[]},{"document":{"id":"1230","name":"My + name is 1230"},"highlight":{},"highlights":[]},{"document":{"id":"1229","name":"My + name is 1229"},"highlight":{},"highlights":[]},{"document":{"id":"1228","name":"My + name is 1228"},"highlight":{},"highlights":[]},{"document":{"id":"1227","name":"My + name is 1227"},"highlight":{},"highlights":[]},{"document":{"id":"1226","name":"My + name is 1226"},"highlight":{},"highlights":[]},{"document":{"id":"1225","name":"My + name is 1225"},"highlight":{},"highlights":[]},{"document":{"id":"1224","name":"My + name is 1224"},"highlight":{},"highlights":[]},{"document":{"id":"1223","name":"My + name is 1223"},"highlight":{},"highlights":[]},{"document":{"id":"1222","name":"My + name is 1222"},"highlight":{},"highlights":[]},{"document":{"id":"1221","name":"My + name is 1221"},"highlight":{},"highlights":[]},{"document":{"id":"1220","name":"My + name is 1220"},"highlight":{},"highlights":[]},{"document":{"id":"1219","name":"My + name is 1219"},"highlight":{},"highlights":[]},{"document":{"id":"1218","name":"My + name is 1218"},"highlight":{},"highlights":[]},{"document":{"id":"1217","name":"My + name is 1217"},"highlight":{},"highlights":[]},{"document":{"id":"1216","name":"My + name is 1216"},"highlight":{},"highlights":[]},{"document":{"id":"1215","name":"My + name is 1215"},"highlight":{},"highlights":[]},{"document":{"id":"1214","name":"My + name is 1214"},"highlight":{},"highlights":[]},{"document":{"id":"1213","name":"My + name is 1213"},"highlight":{},"highlights":[]},{"document":{"id":"1212","name":"My + name is 1212"},"highlight":{},"highlights":[]},{"document":{"id":"1211","name":"My + name is 1211"},"highlight":{},"highlights":[]},{"document":{"id":"1210","name":"My + name is 1210"},"highlight":{},"highlights":[]},{"document":{"id":"1209","name":"My + name is 1209"},"highlight":{},"highlights":[]},{"document":{"id":"1208","name":"My + name is 1208"},"highlight":{},"highlights":[]},{"document":{"id":"1207","name":"My + name is 1207"},"highlight":{},"highlights":[]},{"document":{"id":"1206","name":"My + name is 1206"},"highlight":{},"highlights":[]},{"document":{"id":"1205","name":"My + name is 1205"},"highlight":{},"highlights":[]},{"document":{"id":"1204","name":"My + name is 1204"},"highlight":{},"highlights":[]},{"document":{"id":"1203","name":"My + name is 1203"},"highlight":{},"highlights":[]},{"document":{"id":"1202","name":"My + name is 1202"},"highlight":{},"highlights":[]},{"document":{"id":"1201","name":"My + name is 1201"},"highlight":{},"highlights":[]},{"document":{"id":"1200","name":"My + name is 1200"},"highlight":{},"highlights":[]},{"document":{"id":"1199","name":"My + name is 1199"},"highlight":{},"highlights":[]},{"document":{"id":"1198","name":"My + name is 1198"},"highlight":{},"highlights":[]},{"document":{"id":"1197","name":"My + name is 1197"},"highlight":{},"highlights":[]},{"document":{"id":"1196","name":"My + name is 1196"},"highlight":{},"highlights":[]},{"document":{"id":"1195","name":"My + name is 1195"},"highlight":{},"highlights":[]},{"document":{"id":"1194","name":"My + name is 1194"},"highlight":{},"highlights":[]},{"document":{"id":"1193","name":"My + name is 1193"},"highlight":{},"highlights":[]},{"document":{"id":"1192","name":"My + name is 1192"},"highlight":{},"highlights":[]},{"document":{"id":"1191","name":"My + name is 1191"},"highlight":{},"highlights":[]},{"document":{"id":"1190","name":"My + name is 1190"},"highlight":{},"highlights":[]},{"document":{"id":"1189","name":"My + name is 1189"},"highlight":{},"highlights":[]},{"document":{"id":"1188","name":"My + name is 1188"},"highlight":{},"highlights":[]},{"document":{"id":"1187","name":"My + name is 1187"},"highlight":{},"highlights":[]},{"document":{"id":"1186","name":"My + name is 1186"},"highlight":{},"highlights":[]},{"document":{"id":"1185","name":"My + name is 1185"},"highlight":{},"highlights":[]},{"document":{"id":"1184","name":"My + name is 1184"},"highlight":{},"highlights":[]},{"document":{"id":"1183","name":"My + name is 1183"},"highlight":{},"highlights":[]},{"document":{"id":"1182","name":"My + name is 1182"},"highlight":{},"highlights":[]},{"document":{"id":"1181","name":"My + name is 1181"},"highlight":{},"highlights":[]},{"document":{"id":"1180","name":"My + name is 1180"},"highlight":{},"highlights":[]},{"document":{"id":"1179","name":"My + name is 1179"},"highlight":{},"highlights":[]},{"document":{"id":"1178","name":"My + name is 1178"},"highlight":{},"highlights":[]},{"document":{"id":"1177","name":"My + name is 1177"},"highlight":{},"highlights":[]},{"document":{"id":"1176","name":"My + name is 1176"},"highlight":{},"highlights":[]},{"document":{"id":"1175","name":"My + name is 1175"},"highlight":{},"highlights":[]},{"document":{"id":"1174","name":"My + name is 1174"},"highlight":{},"highlights":[]},{"document":{"id":"1173","name":"My + name is 1173"},"highlight":{},"highlights":[]},{"document":{"id":"1172","name":"My + name is 1172"},"highlight":{},"highlights":[]},{"document":{"id":"1171","name":"My + name is 1171"},"highlight":{},"highlights":[]},{"document":{"id":"1170","name":"My + name is 1170"},"highlight":{},"highlights":[]},{"document":{"id":"1169","name":"My + name is 1169"},"highlight":{},"highlights":[]},{"document":{"id":"1168","name":"My + name is 1168"},"highlight":{},"highlights":[]},{"document":{"id":"1167","name":"My + name is 1167"},"highlight":{},"highlights":[]},{"document":{"id":"1166","name":"My + name is 1166"},"highlight":{},"highlights":[]},{"document":{"id":"1165","name":"My + name is 1165"},"highlight":{},"highlights":[]},{"document":{"id":"1164","name":"My + name is 1164"},"highlight":{},"highlights":[]},{"document":{"id":"1163","name":"My + name is 1163"},"highlight":{},"highlights":[]},{"document":{"id":"1162","name":"My + name is 1162"},"highlight":{},"highlights":[]},{"document":{"id":"1161","name":"My + name is 1161"},"highlight":{},"highlights":[]},{"document":{"id":"1160","name":"My + name is 1160"},"highlight":{},"highlights":[]},{"document":{"id":"1159","name":"My + name is 1159"},"highlight":{},"highlights":[]},{"document":{"id":"1158","name":"My + name is 1158"},"highlight":{},"highlights":[]},{"document":{"id":"1157","name":"My + name is 1157"},"highlight":{},"highlights":[]},{"document":{"id":"1156","name":"My + name is 1156"},"highlight":{},"highlights":[]},{"document":{"id":"1155","name":"My + name is 1155"},"highlight":{},"highlights":[]},{"document":{"id":"1154","name":"My + name is 1154"},"highlight":{},"highlights":[]},{"document":{"id":"1153","name":"My + name is 1153"},"highlight":{},"highlights":[]},{"document":{"id":"1152","name":"My + name is 1152"},"highlight":{},"highlights":[]},{"document":{"id":"1151","name":"My + name is 1151"},"highlight":{},"highlights":[]},{"document":{"id":"1150","name":"My + name is 1150"},"highlight":{},"highlights":[]},{"document":{"id":"1149","name":"My + name is 1149"},"highlight":{},"highlights":[]},{"document":{"id":"1148","name":"My + name is 1148"},"highlight":{},"highlights":[]},{"document":{"id":"1147","name":"My + name is 1147"},"highlight":{},"highlights":[]},{"document":{"id":"1146","name":"My + name is 1146"},"highlight":{},"highlights":[]},{"document":{"id":"1145","name":"My + name is 1145"},"highlight":{},"highlights":[]},{"document":{"id":"1144","name":"My + name is 1144"},"highlight":{},"highlights":[]},{"document":{"id":"1143","name":"My + name is 1143"},"highlight":{},"highlights":[]},{"document":{"id":"1142","name":"My + name is 1142"},"highlight":{},"highlights":[]},{"document":{"id":"1141","name":"My + name is 1141"},"highlight":{},"highlights":[]},{"document":{"id":"1140","name":"My + name is 1140"},"highlight":{},"highlights":[]},{"document":{"id":"1139","name":"My + name is 1139"},"highlight":{},"highlights":[]},{"document":{"id":"1138","name":"My + name is 1138"},"highlight":{},"highlights":[]},{"document":{"id":"1137","name":"My + name is 1137"},"highlight":{},"highlights":[]},{"document":{"id":"1136","name":"My + name is 1136"},"highlight":{},"highlights":[]},{"document":{"id":"1135","name":"My + name is 1135"},"highlight":{},"highlights":[]},{"document":{"id":"1134","name":"My + name is 1134"},"highlight":{},"highlights":[]},{"document":{"id":"1133","name":"My + name is 1133"},"highlight":{},"highlights":[]},{"document":{"id":"1132","name":"My + name is 1132"},"highlight":{},"highlights":[]},{"document":{"id":"1131","name":"My + name is 1131"},"highlight":{},"highlights":[]},{"document":{"id":"1130","name":"My + name is 1130"},"highlight":{},"highlights":[]},{"document":{"id":"1129","name":"My + name is 1129"},"highlight":{},"highlights":[]},{"document":{"id":"1128","name":"My + name is 1128"},"highlight":{},"highlights":[]},{"document":{"id":"1127","name":"My + name is 1127"},"highlight":{},"highlights":[]},{"document":{"id":"1126","name":"My + name is 1126"},"highlight":{},"highlights":[]},{"document":{"id":"1125","name":"My + name is 1125"},"highlight":{},"highlights":[]},{"document":{"id":"1124","name":"My + name is 1124"},"highlight":{},"highlights":[]},{"document":{"id":"1123","name":"My + name is 1123"},"highlight":{},"highlights":[]},{"document":{"id":"1122","name":"My + name is 1122"},"highlight":{},"highlights":[]},{"document":{"id":"1121","name":"My + name is 1121"},"highlight":{},"highlights":[]},{"document":{"id":"1120","name":"My + name is 1120"},"highlight":{},"highlights":[]},{"document":{"id":"1119","name":"My + name is 1119"},"highlight":{},"highlights":[]},{"document":{"id":"1118","name":"My + name is 1118"},"highlight":{},"highlights":[]},{"document":{"id":"1117","name":"My + name is 1117"},"highlight":{},"highlights":[]},{"document":{"id":"1116","name":"My + name is 1116"},"highlight":{},"highlights":[]},{"document":{"id":"1115","name":"My + name is 1115"},"highlight":{},"highlights":[]},{"document":{"id":"1114","name":"My + name is 1114"},"highlight":{},"highlights":[]},{"document":{"id":"1113","name":"My + name is 1113"},"highlight":{},"highlights":[]},{"document":{"id":"1112","name":"My + name is 1112"},"highlight":{},"highlights":[]},{"document":{"id":"1111","name":"My + name is 1111"},"highlight":{},"highlights":[]},{"document":{"id":"1110","name":"My + name is 1110"},"highlight":{},"highlights":[]},{"document":{"id":"1109","name":"My + name is 1109"},"highlight":{},"highlights":[]},{"document":{"id":"1108","name":"My + name is 1108"},"highlight":{},"highlights":[]},{"document":{"id":"1107","name":"My + name is 1107"},"highlight":{},"highlights":[]},{"document":{"id":"1106","name":"My + name is 1106"},"highlight":{},"highlights":[]},{"document":{"id":"1105","name":"My + name is 1105"},"highlight":{},"highlights":[]},{"document":{"id":"1104","name":"My + name is 1104"},"highlight":{},"highlights":[]},{"document":{"id":"1103","name":"My + name is 1103"},"highlight":{},"highlights":[]},{"document":{"id":"1102","name":"My + name is 1102"},"highlight":{},"highlights":[]},{"document":{"id":"1101","name":"My + name is 1101"},"highlight":{},"highlights":[]},{"document":{"id":"1100","name":"My + name is 1100"},"highlight":{},"highlights":[]},{"document":{"id":"1099","name":"My + name is 1099"},"highlight":{},"highlights":[]},{"document":{"id":"1098","name":"My + name is 1098"},"highlight":{},"highlights":[]},{"document":{"id":"1097","name":"My + name is 1097"},"highlight":{},"highlights":[]},{"document":{"id":"1096","name":"My + name is 1096"},"highlight":{},"highlights":[]},{"document":{"id":"1095","name":"My + name is 1095"},"highlight":{},"highlights":[]},{"document":{"id":"1094","name":"My + name is 1094"},"highlight":{},"highlights":[]},{"document":{"id":"1093","name":"My + name is 1093"},"highlight":{},"highlights":[]},{"document":{"id":"1092","name":"My + name is 1092"},"highlight":{},"highlights":[]},{"document":{"id":"1091","name":"My + name is 1091"},"highlight":{},"highlights":[]},{"document":{"id":"1090","name":"My + name is 1090"},"highlight":{},"highlights":[]},{"document":{"id":"1089","name":"My + name is 1089"},"highlight":{},"highlights":[]},{"document":{"id":"1088","name":"My + name is 1088"},"highlight":{},"highlights":[]},{"document":{"id":"1087","name":"My + name is 1087"},"highlight":{},"highlights":[]},{"document":{"id":"1086","name":"My + name is 1086"},"highlight":{},"highlights":[]},{"document":{"id":"1085","name":"My + name is 1085"},"highlight":{},"highlights":[]},{"document":{"id":"1084","name":"My + name is 1084"},"highlight":{},"highlights":[]},{"document":{"id":"1083","name":"My + name is 1083"},"highlight":{},"highlights":[]},{"document":{"id":"1082","name":"My + name is 1082"},"highlight":{},"highlights":[]},{"document":{"id":"1081","name":"My + name is 1081"},"highlight":{},"highlights":[]},{"document":{"id":"1080","name":"My + name is 1080"},"highlight":{},"highlights":[]},{"document":{"id":"1079","name":"My + name is 1079"},"highlight":{},"highlights":[]},{"document":{"id":"1078","name":"My + name is 1078"},"highlight":{},"highlights":[]},{"document":{"id":"1077","name":"My + name is 1077"},"highlight":{},"highlights":[]},{"document":{"id":"1076","name":"My + name is 1076"},"highlight":{},"highlights":[]},{"document":{"id":"1075","name":"My + name is 1075"},"highlight":{},"highlights":[]},{"document":{"id":"1074","name":"My + name is 1074"},"highlight":{},"highlights":[]},{"document":{"id":"1073","name":"My + name is 1073"},"highlight":{},"highlights":[]},{"document":{"id":"1072","name":"My + name is 1072"},"highlight":{},"highlights":[]},{"document":{"id":"1071","name":"My + name is 1071"},"highlight":{},"highlights":[]},{"document":{"id":"1070","name":"My + name is 1070"},"highlight":{},"highlights":[]},{"document":{"id":"1069","name":"My + name is 1069"},"highlight":{},"highlights":[]},{"document":{"id":"1068","name":"My + name is 1068"},"highlight":{},"highlights":[]},{"document":{"id":"1067","name":"My + name is 1067"},"highlight":{},"highlights":[]},{"document":{"id":"1066","name":"My + name is 1066"},"highlight":{},"highlights":[]},{"document":{"id":"1065","name":"My + name is 1065"},"highlight":{},"highlights":[]},{"document":{"id":"1064","name":"My + name is 1064"},"highlight":{},"highlights":[]},{"document":{"id":"1063","name":"My + name is 1063"},"highlight":{},"highlights":[]},{"document":{"id":"1062","name":"My + name is 1062"},"highlight":{},"highlights":[]},{"document":{"id":"1061","name":"My + name is 1061"},"highlight":{},"highlights":[]},{"document":{"id":"1060","name":"My + name is 1060"},"highlight":{},"highlights":[]},{"document":{"id":"1059","name":"My + name is 1059"},"highlight":{},"highlights":[]},{"document":{"id":"1058","name":"My + name is 1058"},"highlight":{},"highlights":[]},{"document":{"id":"1057","name":"My + name is 1057"},"highlight":{},"highlights":[]},{"document":{"id":"1056","name":"My + name is 1056"},"highlight":{},"highlights":[]},{"document":{"id":"1055","name":"My + name is 1055"},"highlight":{},"highlights":[]},{"document":{"id":"1054","name":"My + name is 1054"},"highlight":{},"highlights":[]},{"document":{"id":"1053","name":"My + name is 1053"},"highlight":{},"highlights":[]},{"document":{"id":"1052","name":"My + name is 1052"},"highlight":{},"highlights":[]},{"document":{"id":"1051","name":"My + name is 1051"},"highlight":{},"highlights":[]},{"document":{"id":"1050","name":"My + name is 1050"},"highlight":{},"highlights":[]},{"document":{"id":"1049","name":"My + name is 1049"},"highlight":{},"highlights":[]},{"document":{"id":"1048","name":"My + name is 1048"},"highlight":{},"highlights":[]},{"document":{"id":"1047","name":"My + name is 1047"},"highlight":{},"highlights":[]},{"document":{"id":"1046","name":"My + name is 1046"},"highlight":{},"highlights":[]},{"document":{"id":"1045","name":"My + name is 1045"},"highlight":{},"highlights":[]},{"document":{"id":"1044","name":"My + name is 1044"},"highlight":{},"highlights":[]},{"document":{"id":"1043","name":"My + name is 1043"},"highlight":{},"highlights":[]},{"document":{"id":"1042","name":"My + name is 1042"},"highlight":{},"highlights":[]},{"document":{"id":"1041","name":"My + name is 1041"},"highlight":{},"highlights":[]},{"document":{"id":"1040","name":"My + name is 1040"},"highlight":{},"highlights":[]},{"document":{"id":"1039","name":"My + name is 1039"},"highlight":{},"highlights":[]},{"document":{"id":"1038","name":"My + name is 1038"},"highlight":{},"highlights":[]},{"document":{"id":"1037","name":"My + name is 1037"},"highlight":{},"highlights":[]},{"document":{"id":"1036","name":"My + name is 1036"},"highlight":{},"highlights":[]},{"document":{"id":"1035","name":"My + name is 1035"},"highlight":{},"highlights":[]},{"document":{"id":"1034","name":"My + name is 1034"},"highlight":{},"highlights":[]},{"document":{"id":"1033","name":"My + name is 1033"},"highlight":{},"highlights":[]},{"document":{"id":"1032","name":"My + name is 1032"},"highlight":{},"highlights":[]},{"document":{"id":"1031","name":"My + name is 1031"},"highlight":{},"highlights":[]},{"document":{"id":"1030","name":"My + name is 1030"},"highlight":{},"highlights":[]},{"document":{"id":"1029","name":"My + name is 1029"},"highlight":{},"highlights":[]},{"document":{"id":"1028","name":"My + name is 1028"},"highlight":{},"highlights":[]},{"document":{"id":"1027","name":"My + name is 1027"},"highlight":{},"highlights":[]},{"document":{"id":"1026","name":"My + name is 1026"},"highlight":{},"highlights":[]},{"document":{"id":"1025","name":"My + name is 1025"},"highlight":{},"highlights":[]},{"document":{"id":"1024","name":"My + name is 1024"},"highlight":{},"highlights":[]},{"document":{"id":"1023","name":"My + name is 1023"},"highlight":{},"highlights":[]},{"document":{"id":"1022","name":"My + name is 1022"},"highlight":{},"highlights":[]},{"document":{"id":"1021","name":"My + name is 1021"},"highlight":{},"highlights":[]},{"document":{"id":"1020","name":"My + name is 1020"},"highlight":{},"highlights":[]},{"document":{"id":"1019","name":"My + name is 1019"},"highlight":{},"highlights":[]},{"document":{"id":"1018","name":"My + name is 1018"},"highlight":{},"highlights":[]},{"document":{"id":"1017","name":"My + name is 1017"},"highlight":{},"highlights":[]},{"document":{"id":"1016","name":"My + name is 1016"},"highlight":{},"highlights":[]},{"document":{"id":"1015","name":"My + name is 1015"},"highlight":{},"highlights":[]},{"document":{"id":"1014","name":"My + name is 1014"},"highlight":{},"highlights":[]},{"document":{"id":"1013","name":"My + name is 1013"},"highlight":{},"highlights":[]},{"document":{"id":"1012","name":"My + name is 1012"},"highlight":{},"highlights":[]},{"document":{"id":"1011","name":"My + name is 1011"},"highlight":{},"highlights":[]},{"document":{"id":"1010","name":"My + name is 1010"},"highlight":{},"highlights":[]},{"document":{"id":"1009","name":"My + name is 1009"},"highlight":{},"highlights":[]},{"document":{"id":"1008","name":"My + name is 1008"},"highlight":{},"highlights":[]},{"document":{"id":"1007","name":"My + name is 1007"},"highlight":{},"highlights":[]},{"document":{"id":"1006","name":"My + name is 1006"},"highlight":{},"highlights":[]},{"document":{"id":"1005","name":"My + name is 1005"},"highlight":{},"highlights":[]},{"document":{"id":"1004","name":"My + name is 1004"},"highlight":{},"highlights":[]},{"document":{"id":"1003","name":"My + name is 1003"},"highlight":{},"highlights":[]},{"document":{"id":"1002","name":"My + name is 1002"},"highlight":{},"highlights":[]},{"document":{"id":"1001","name":"My + name is 1001"},"highlight":{},"highlights":[]},{"document":{"id":"1000","name":"My + name is 1000"},"highlight":{},"highlights":[]}],"out_of":1999,"page":4,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":1}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20968' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=5 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"999","name":"My + name is 999"},"highlight":{},"highlights":[]},{"document":{"id":"998","name":"My + name is 998"},"highlight":{},"highlights":[]},{"document":{"id":"997","name":"My + name is 997"},"highlight":{},"highlights":[]},{"document":{"id":"996","name":"My + name is 996"},"highlight":{},"highlights":[]},{"document":{"id":"995","name":"My + name is 995"},"highlight":{},"highlights":[]},{"document":{"id":"994","name":"My + name is 994"},"highlight":{},"highlights":[]},{"document":{"id":"993","name":"My + name is 993"},"highlight":{},"highlights":[]},{"document":{"id":"992","name":"My + name is 992"},"highlight":{},"highlights":[]},{"document":{"id":"991","name":"My + name is 991"},"highlight":{},"highlights":[]},{"document":{"id":"990","name":"My + name is 990"},"highlight":{},"highlights":[]},{"document":{"id":"989","name":"My + name is 989"},"highlight":{},"highlights":[]},{"document":{"id":"988","name":"My + name is 988"},"highlight":{},"highlights":[]},{"document":{"id":"987","name":"My + name is 987"},"highlight":{},"highlights":[]},{"document":{"id":"986","name":"My + name is 986"},"highlight":{},"highlights":[]},{"document":{"id":"985","name":"My + name is 985"},"highlight":{},"highlights":[]},{"document":{"id":"984","name":"My + name is 984"},"highlight":{},"highlights":[]},{"document":{"id":"983","name":"My + name is 983"},"highlight":{},"highlights":[]},{"document":{"id":"982","name":"My + name is 982"},"highlight":{},"highlights":[]},{"document":{"id":"981","name":"My + name is 981"},"highlight":{},"highlights":[]},{"document":{"id":"980","name":"My + name is 980"},"highlight":{},"highlights":[]},{"document":{"id":"979","name":"My + name is 979"},"highlight":{},"highlights":[]},{"document":{"id":"978","name":"My + name is 978"},"highlight":{},"highlights":[]},{"document":{"id":"977","name":"My + name is 977"},"highlight":{},"highlights":[]},{"document":{"id":"976","name":"My + name is 976"},"highlight":{},"highlights":[]},{"document":{"id":"975","name":"My + name is 975"},"highlight":{},"highlights":[]},{"document":{"id":"974","name":"My + name is 974"},"highlight":{},"highlights":[]},{"document":{"id":"973","name":"My + name is 973"},"highlight":{},"highlights":[]},{"document":{"id":"972","name":"My + name is 972"},"highlight":{},"highlights":[]},{"document":{"id":"971","name":"My + name is 971"},"highlight":{},"highlights":[]},{"document":{"id":"970","name":"My + name is 970"},"highlight":{},"highlights":[]},{"document":{"id":"969","name":"My + name is 969"},"highlight":{},"highlights":[]},{"document":{"id":"968","name":"My + name is 968"},"highlight":{},"highlights":[]},{"document":{"id":"967","name":"My + name is 967"},"highlight":{},"highlights":[]},{"document":{"id":"966","name":"My + name is 966"},"highlight":{},"highlights":[]},{"document":{"id":"965","name":"My + name is 965"},"highlight":{},"highlights":[]},{"document":{"id":"964","name":"My + name is 964"},"highlight":{},"highlights":[]},{"document":{"id":"963","name":"My + name is 963"},"highlight":{},"highlights":[]},{"document":{"id":"962","name":"My + name is 962"},"highlight":{},"highlights":[]},{"document":{"id":"961","name":"My + name is 961"},"highlight":{},"highlights":[]},{"document":{"id":"960","name":"My + name is 960"},"highlight":{},"highlights":[]},{"document":{"id":"959","name":"My + name is 959"},"highlight":{},"highlights":[]},{"document":{"id":"958","name":"My + name is 958"},"highlight":{},"highlights":[]},{"document":{"id":"957","name":"My + name is 957"},"highlight":{},"highlights":[]},{"document":{"id":"956","name":"My + name is 956"},"highlight":{},"highlights":[]},{"document":{"id":"955","name":"My + name is 955"},"highlight":{},"highlights":[]},{"document":{"id":"954","name":"My + name is 954"},"highlight":{},"highlights":[]},{"document":{"id":"953","name":"My + name is 953"},"highlight":{},"highlights":[]},{"document":{"id":"952","name":"My + name is 952"},"highlight":{},"highlights":[]},{"document":{"id":"951","name":"My + name is 951"},"highlight":{},"highlights":[]},{"document":{"id":"950","name":"My + name is 950"},"highlight":{},"highlights":[]},{"document":{"id":"949","name":"My + name is 949"},"highlight":{},"highlights":[]},{"document":{"id":"948","name":"My + name is 948"},"highlight":{},"highlights":[]},{"document":{"id":"947","name":"My + name is 947"},"highlight":{},"highlights":[]},{"document":{"id":"946","name":"My + name is 946"},"highlight":{},"highlights":[]},{"document":{"id":"945","name":"My + name is 945"},"highlight":{},"highlights":[]},{"document":{"id":"944","name":"My + name is 944"},"highlight":{},"highlights":[]},{"document":{"id":"943","name":"My + name is 943"},"highlight":{},"highlights":[]},{"document":{"id":"942","name":"My + name is 942"},"highlight":{},"highlights":[]},{"document":{"id":"941","name":"My + name is 941"},"highlight":{},"highlights":[]},{"document":{"id":"940","name":"My + name is 940"},"highlight":{},"highlights":[]},{"document":{"id":"939","name":"My + name is 939"},"highlight":{},"highlights":[]},{"document":{"id":"938","name":"My + name is 938"},"highlight":{},"highlights":[]},{"document":{"id":"937","name":"My + name is 937"},"highlight":{},"highlights":[]},{"document":{"id":"936","name":"My + name is 936"},"highlight":{},"highlights":[]},{"document":{"id":"935","name":"My + name is 935"},"highlight":{},"highlights":[]},{"document":{"id":"934","name":"My + name is 934"},"highlight":{},"highlights":[]},{"document":{"id":"933","name":"My + name is 933"},"highlight":{},"highlights":[]},{"document":{"id":"932","name":"My + name is 932"},"highlight":{},"highlights":[]},{"document":{"id":"931","name":"My + name is 931"},"highlight":{},"highlights":[]},{"document":{"id":"930","name":"My + name is 930"},"highlight":{},"highlights":[]},{"document":{"id":"929","name":"My + name is 929"},"highlight":{},"highlights":[]},{"document":{"id":"928","name":"My + name is 928"},"highlight":{},"highlights":[]},{"document":{"id":"927","name":"My + name is 927"},"highlight":{},"highlights":[]},{"document":{"id":"926","name":"My + name is 926"},"highlight":{},"highlights":[]},{"document":{"id":"925","name":"My + name is 925"},"highlight":{},"highlights":[]},{"document":{"id":"924","name":"My + name is 924"},"highlight":{},"highlights":[]},{"document":{"id":"923","name":"My + name is 923"},"highlight":{},"highlights":[]},{"document":{"id":"922","name":"My + name is 922"},"highlight":{},"highlights":[]},{"document":{"id":"921","name":"My + name is 921"},"highlight":{},"highlights":[]},{"document":{"id":"920","name":"My + name is 920"},"highlight":{},"highlights":[]},{"document":{"id":"919","name":"My + name is 919"},"highlight":{},"highlights":[]},{"document":{"id":"918","name":"My + name is 918"},"highlight":{},"highlights":[]},{"document":{"id":"917","name":"My + name is 917"},"highlight":{},"highlights":[]},{"document":{"id":"916","name":"My + name is 916"},"highlight":{},"highlights":[]},{"document":{"id":"915","name":"My + name is 915"},"highlight":{},"highlights":[]},{"document":{"id":"914","name":"My + name is 914"},"highlight":{},"highlights":[]},{"document":{"id":"913","name":"My + name is 913"},"highlight":{},"highlights":[]},{"document":{"id":"912","name":"My + name is 912"},"highlight":{},"highlights":[]},{"document":{"id":"911","name":"My + name is 911"},"highlight":{},"highlights":[]},{"document":{"id":"910","name":"My + name is 910"},"highlight":{},"highlights":[]},{"document":{"id":"909","name":"My + name is 909"},"highlight":{},"highlights":[]},{"document":{"id":"908","name":"My + name is 908"},"highlight":{},"highlights":[]},{"document":{"id":"907","name":"My + name is 907"},"highlight":{},"highlights":[]},{"document":{"id":"906","name":"My + name is 906"},"highlight":{},"highlights":[]},{"document":{"id":"905","name":"My + name is 905"},"highlight":{},"highlights":[]},{"document":{"id":"904","name":"My + name is 904"},"highlight":{},"highlights":[]},{"document":{"id":"903","name":"My + name is 903"},"highlight":{},"highlights":[]},{"document":{"id":"902","name":"My + name is 902"},"highlight":{},"highlights":[]},{"document":{"id":"901","name":"My + name is 901"},"highlight":{},"highlights":[]},{"document":{"id":"900","name":"My + name is 900"},"highlight":{},"highlights":[]},{"document":{"id":"899","name":"My + name is 899"},"highlight":{},"highlights":[]},{"document":{"id":"898","name":"My + name is 898"},"highlight":{},"highlights":[]},{"document":{"id":"897","name":"My + name is 897"},"highlight":{},"highlights":[]},{"document":{"id":"896","name":"My + name is 896"},"highlight":{},"highlights":[]},{"document":{"id":"895","name":"My + name is 895"},"highlight":{},"highlights":[]},{"document":{"id":"894","name":"My + name is 894"},"highlight":{},"highlights":[]},{"document":{"id":"893","name":"My + name is 893"},"highlight":{},"highlights":[]},{"document":{"id":"892","name":"My + name is 892"},"highlight":{},"highlights":[]},{"document":{"id":"891","name":"My + name is 891"},"highlight":{},"highlights":[]},{"document":{"id":"890","name":"My + name is 890"},"highlight":{},"highlights":[]},{"document":{"id":"889","name":"My + name is 889"},"highlight":{},"highlights":[]},{"document":{"id":"888","name":"My + name is 888"},"highlight":{},"highlights":[]},{"document":{"id":"887","name":"My + name is 887"},"highlight":{},"highlights":[]},{"document":{"id":"886","name":"My + name is 886"},"highlight":{},"highlights":[]},{"document":{"id":"885","name":"My + name is 885"},"highlight":{},"highlights":[]},{"document":{"id":"884","name":"My + name is 884"},"highlight":{},"highlights":[]},{"document":{"id":"883","name":"My + name is 883"},"highlight":{},"highlights":[]},{"document":{"id":"882","name":"My + name is 882"},"highlight":{},"highlights":[]},{"document":{"id":"881","name":"My + name is 881"},"highlight":{},"highlights":[]},{"document":{"id":"880","name":"My + name is 880"},"highlight":{},"highlights":[]},{"document":{"id":"879","name":"My + name is 879"},"highlight":{},"highlights":[]},{"document":{"id":"878","name":"My + name is 878"},"highlight":{},"highlights":[]},{"document":{"id":"877","name":"My + name is 877"},"highlight":{},"highlights":[]},{"document":{"id":"876","name":"My + name is 876"},"highlight":{},"highlights":[]},{"document":{"id":"875","name":"My + name is 875"},"highlight":{},"highlights":[]},{"document":{"id":"874","name":"My + name is 874"},"highlight":{},"highlights":[]},{"document":{"id":"873","name":"My + name is 873"},"highlight":{},"highlights":[]},{"document":{"id":"872","name":"My + name is 872"},"highlight":{},"highlights":[]},{"document":{"id":"871","name":"My + name is 871"},"highlight":{},"highlights":[]},{"document":{"id":"870","name":"My + name is 870"},"highlight":{},"highlights":[]},{"document":{"id":"869","name":"My + name is 869"},"highlight":{},"highlights":[]},{"document":{"id":"868","name":"My + name is 868"},"highlight":{},"highlights":[]},{"document":{"id":"867","name":"My + name is 867"},"highlight":{},"highlights":[]},{"document":{"id":"866","name":"My + name is 866"},"highlight":{},"highlights":[]},{"document":{"id":"865","name":"My + name is 865"},"highlight":{},"highlights":[]},{"document":{"id":"864","name":"My + name is 864"},"highlight":{},"highlights":[]},{"document":{"id":"863","name":"My + name is 863"},"highlight":{},"highlights":[]},{"document":{"id":"862","name":"My + name is 862"},"highlight":{},"highlights":[]},{"document":{"id":"861","name":"My + name is 861"},"highlight":{},"highlights":[]},{"document":{"id":"860","name":"My + name is 860"},"highlight":{},"highlights":[]},{"document":{"id":"859","name":"My + name is 859"},"highlight":{},"highlights":[]},{"document":{"id":"858","name":"My + name is 858"},"highlight":{},"highlights":[]},{"document":{"id":"857","name":"My + name is 857"},"highlight":{},"highlights":[]},{"document":{"id":"856","name":"My + name is 856"},"highlight":{},"highlights":[]},{"document":{"id":"855","name":"My + name is 855"},"highlight":{},"highlights":[]},{"document":{"id":"854","name":"My + name is 854"},"highlight":{},"highlights":[]},{"document":{"id":"853","name":"My + name is 853"},"highlight":{},"highlights":[]},{"document":{"id":"852","name":"My + name is 852"},"highlight":{},"highlights":[]},{"document":{"id":"851","name":"My + name is 851"},"highlight":{},"highlights":[]},{"document":{"id":"850","name":"My + name is 850"},"highlight":{},"highlights":[]},{"document":{"id":"849","name":"My + name is 849"},"highlight":{},"highlights":[]},{"document":{"id":"848","name":"My + name is 848"},"highlight":{},"highlights":[]},{"document":{"id":"847","name":"My + name is 847"},"highlight":{},"highlights":[]},{"document":{"id":"846","name":"My + name is 846"},"highlight":{},"highlights":[]},{"document":{"id":"845","name":"My + name is 845"},"highlight":{},"highlights":[]},{"document":{"id":"844","name":"My + name is 844"},"highlight":{},"highlights":[]},{"document":{"id":"843","name":"My + name is 843"},"highlight":{},"highlights":[]},{"document":{"id":"842","name":"My + name is 842"},"highlight":{},"highlights":[]},{"document":{"id":"841","name":"My + name is 841"},"highlight":{},"highlights":[]},{"document":{"id":"840","name":"My + name is 840"},"highlight":{},"highlights":[]},{"document":{"id":"839","name":"My + name is 839"},"highlight":{},"highlights":[]},{"document":{"id":"838","name":"My + name is 838"},"highlight":{},"highlights":[]},{"document":{"id":"837","name":"My + name is 837"},"highlight":{},"highlights":[]},{"document":{"id":"836","name":"My + name is 836"},"highlight":{},"highlights":[]},{"document":{"id":"835","name":"My + name is 835"},"highlight":{},"highlights":[]},{"document":{"id":"834","name":"My + name is 834"},"highlight":{},"highlights":[]},{"document":{"id":"833","name":"My + name is 833"},"highlight":{},"highlights":[]},{"document":{"id":"832","name":"My + name is 832"},"highlight":{},"highlights":[]},{"document":{"id":"831","name":"My + name is 831"},"highlight":{},"highlights":[]},{"document":{"id":"830","name":"My + name is 830"},"highlight":{},"highlights":[]},{"document":{"id":"829","name":"My + name is 829"},"highlight":{},"highlights":[]},{"document":{"id":"828","name":"My + name is 828"},"highlight":{},"highlights":[]},{"document":{"id":"827","name":"My + name is 827"},"highlight":{},"highlights":[]},{"document":{"id":"826","name":"My + name is 826"},"highlight":{},"highlights":[]},{"document":{"id":"825","name":"My + name is 825"},"highlight":{},"highlights":[]},{"document":{"id":"824","name":"My + name is 824"},"highlight":{},"highlights":[]},{"document":{"id":"823","name":"My + name is 823"},"highlight":{},"highlights":[]},{"document":{"id":"822","name":"My + name is 822"},"highlight":{},"highlights":[]},{"document":{"id":"821","name":"My + name is 821"},"highlight":{},"highlights":[]},{"document":{"id":"820","name":"My + name is 820"},"highlight":{},"highlights":[]},{"document":{"id":"819","name":"My + name is 819"},"highlight":{},"highlights":[]},{"document":{"id":"818","name":"My + name is 818"},"highlight":{},"highlights":[]},{"document":{"id":"817","name":"My + name is 817"},"highlight":{},"highlights":[]},{"document":{"id":"816","name":"My + name is 816"},"highlight":{},"highlights":[]},{"document":{"id":"815","name":"My + name is 815"},"highlight":{},"highlights":[]},{"document":{"id":"814","name":"My + name is 814"},"highlight":{},"highlights":[]},{"document":{"id":"813","name":"My + name is 813"},"highlight":{},"highlights":[]},{"document":{"id":"812","name":"My + name is 812"},"highlight":{},"highlights":[]},{"document":{"id":"811","name":"My + name is 811"},"highlight":{},"highlights":[]},{"document":{"id":"810","name":"My + name is 810"},"highlight":{},"highlights":[]},{"document":{"id":"809","name":"My + name is 809"},"highlight":{},"highlights":[]},{"document":{"id":"808","name":"My + name is 808"},"highlight":{},"highlights":[]},{"document":{"id":"807","name":"My + name is 807"},"highlight":{},"highlights":[]},{"document":{"id":"806","name":"My + name is 806"},"highlight":{},"highlights":[]},{"document":{"id":"805","name":"My + name is 805"},"highlight":{},"highlights":[]},{"document":{"id":"804","name":"My + name is 804"},"highlight":{},"highlights":[]},{"document":{"id":"803","name":"My + name is 803"},"highlight":{},"highlights":[]},{"document":{"id":"802","name":"My + name is 802"},"highlight":{},"highlights":[]},{"document":{"id":"801","name":"My + name is 801"},"highlight":{},"highlights":[]},{"document":{"id":"800","name":"My + name is 800"},"highlight":{},"highlights":[]},{"document":{"id":"799","name":"My + name is 799"},"highlight":{},"highlights":[]},{"document":{"id":"798","name":"My + name is 798"},"highlight":{},"highlights":[]},{"document":{"id":"797","name":"My + name is 797"},"highlight":{},"highlights":[]},{"document":{"id":"796","name":"My + name is 796"},"highlight":{},"highlights":[]},{"document":{"id":"795","name":"My + name is 795"},"highlight":{},"highlights":[]},{"document":{"id":"794","name":"My + name is 794"},"highlight":{},"highlights":[]},{"document":{"id":"793","name":"My + name is 793"},"highlight":{},"highlights":[]},{"document":{"id":"792","name":"My + name is 792"},"highlight":{},"highlights":[]},{"document":{"id":"791","name":"My + name is 791"},"highlight":{},"highlights":[]},{"document":{"id":"790","name":"My + name is 790"},"highlight":{},"highlights":[]},{"document":{"id":"789","name":"My + name is 789"},"highlight":{},"highlights":[]},{"document":{"id":"788","name":"My + name is 788"},"highlight":{},"highlights":[]},{"document":{"id":"787","name":"My + name is 787"},"highlight":{},"highlights":[]},{"document":{"id":"786","name":"My + name is 786"},"highlight":{},"highlights":[]},{"document":{"id":"785","name":"My + name is 785"},"highlight":{},"highlights":[]},{"document":{"id":"784","name":"My + name is 784"},"highlight":{},"highlights":[]},{"document":{"id":"783","name":"My + name is 783"},"highlight":{},"highlights":[]},{"document":{"id":"782","name":"My + name is 782"},"highlight":{},"highlights":[]},{"document":{"id":"781","name":"My + name is 781"},"highlight":{},"highlights":[]},{"document":{"id":"780","name":"My + name is 780"},"highlight":{},"highlights":[]},{"document":{"id":"779","name":"My + name is 779"},"highlight":{},"highlights":[]},{"document":{"id":"778","name":"My + name is 778"},"highlight":{},"highlights":[]},{"document":{"id":"777","name":"My + name is 777"},"highlight":{},"highlights":[]},{"document":{"id":"776","name":"My + name is 776"},"highlight":{},"highlights":[]},{"document":{"id":"775","name":"My + name is 775"},"highlight":{},"highlights":[]},{"document":{"id":"774","name":"My + name is 774"},"highlight":{},"highlights":[]},{"document":{"id":"773","name":"My + name is 773"},"highlight":{},"highlights":[]},{"document":{"id":"772","name":"My + name is 772"},"highlight":{},"highlights":[]},{"document":{"id":"771","name":"My + name is 771"},"highlight":{},"highlights":[]},{"document":{"id":"770","name":"My + name is 770"},"highlight":{},"highlights":[]},{"document":{"id":"769","name":"My + name is 769"},"highlight":{},"highlights":[]},{"document":{"id":"768","name":"My + name is 768"},"highlight":{},"highlights":[]},{"document":{"id":"767","name":"My + name is 767"},"highlight":{},"highlights":[]},{"document":{"id":"766","name":"My + name is 766"},"highlight":{},"highlights":[]},{"document":{"id":"765","name":"My + name is 765"},"highlight":{},"highlights":[]},{"document":{"id":"764","name":"My + name is 764"},"highlight":{},"highlights":[]},{"document":{"id":"763","name":"My + name is 763"},"highlight":{},"highlights":[]},{"document":{"id":"762","name":"My + name is 762"},"highlight":{},"highlights":[]},{"document":{"id":"761","name":"My + name is 761"},"highlight":{},"highlights":[]},{"document":{"id":"760","name":"My + name is 760"},"highlight":{},"highlights":[]},{"document":{"id":"759","name":"My + name is 759"},"highlight":{},"highlights":[]},{"document":{"id":"758","name":"My + name is 758"},"highlight":{},"highlights":[]},{"document":{"id":"757","name":"My + name is 757"},"highlight":{},"highlights":[]},{"document":{"id":"756","name":"My + name is 756"},"highlight":{},"highlights":[]},{"document":{"id":"755","name":"My + name is 755"},"highlight":{},"highlights":[]},{"document":{"id":"754","name":"My + name is 754"},"highlight":{},"highlights":[]},{"document":{"id":"753","name":"My + name is 753"},"highlight":{},"highlights":[]},{"document":{"id":"752","name":"My + name is 752"},"highlight":{},"highlights":[]},{"document":{"id":"751","name":"My + name is 751"},"highlight":{},"highlights":[]},{"document":{"id":"750","name":"My + name is 750"},"highlight":{},"highlights":[]}],"out_of":1999,"page":5,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":2}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20468' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=6 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"749","name":"My + name is 749"},"highlight":{},"highlights":[]},{"document":{"id":"748","name":"My + name is 748"},"highlight":{},"highlights":[]},{"document":{"id":"747","name":"My + name is 747"},"highlight":{},"highlights":[]},{"document":{"id":"746","name":"My + name is 746"},"highlight":{},"highlights":[]},{"document":{"id":"745","name":"My + name is 745"},"highlight":{},"highlights":[]},{"document":{"id":"744","name":"My + name is 744"},"highlight":{},"highlights":[]},{"document":{"id":"743","name":"My + name is 743"},"highlight":{},"highlights":[]},{"document":{"id":"742","name":"My + name is 742"},"highlight":{},"highlights":[]},{"document":{"id":"741","name":"My + name is 741"},"highlight":{},"highlights":[]},{"document":{"id":"740","name":"My + name is 740"},"highlight":{},"highlights":[]},{"document":{"id":"739","name":"My + name is 739"},"highlight":{},"highlights":[]},{"document":{"id":"738","name":"My + name is 738"},"highlight":{},"highlights":[]},{"document":{"id":"737","name":"My + name is 737"},"highlight":{},"highlights":[]},{"document":{"id":"736","name":"My + name is 736"},"highlight":{},"highlights":[]},{"document":{"id":"735","name":"My + name is 735"},"highlight":{},"highlights":[]},{"document":{"id":"734","name":"My + name is 734"},"highlight":{},"highlights":[]},{"document":{"id":"733","name":"My + name is 733"},"highlight":{},"highlights":[]},{"document":{"id":"732","name":"My + name is 732"},"highlight":{},"highlights":[]},{"document":{"id":"731","name":"My + name is 731"},"highlight":{},"highlights":[]},{"document":{"id":"730","name":"My + name is 730"},"highlight":{},"highlights":[]},{"document":{"id":"729","name":"My + name is 729"},"highlight":{},"highlights":[]},{"document":{"id":"728","name":"My + name is 728"},"highlight":{},"highlights":[]},{"document":{"id":"727","name":"My + name is 727"},"highlight":{},"highlights":[]},{"document":{"id":"726","name":"My + name is 726"},"highlight":{},"highlights":[]},{"document":{"id":"725","name":"My + name is 725"},"highlight":{},"highlights":[]},{"document":{"id":"724","name":"My + name is 724"},"highlight":{},"highlights":[]},{"document":{"id":"723","name":"My + name is 723"},"highlight":{},"highlights":[]},{"document":{"id":"722","name":"My + name is 722"},"highlight":{},"highlights":[]},{"document":{"id":"721","name":"My + name is 721"},"highlight":{},"highlights":[]},{"document":{"id":"720","name":"My + name is 720"},"highlight":{},"highlights":[]},{"document":{"id":"719","name":"My + name is 719"},"highlight":{},"highlights":[]},{"document":{"id":"718","name":"My + name is 718"},"highlight":{},"highlights":[]},{"document":{"id":"717","name":"My + name is 717"},"highlight":{},"highlights":[]},{"document":{"id":"716","name":"My + name is 716"},"highlight":{},"highlights":[]},{"document":{"id":"715","name":"My + name is 715"},"highlight":{},"highlights":[]},{"document":{"id":"714","name":"My + name is 714"},"highlight":{},"highlights":[]},{"document":{"id":"713","name":"My + name is 713"},"highlight":{},"highlights":[]},{"document":{"id":"712","name":"My + name is 712"},"highlight":{},"highlights":[]},{"document":{"id":"711","name":"My + name is 711"},"highlight":{},"highlights":[]},{"document":{"id":"710","name":"My + name is 710"},"highlight":{},"highlights":[]},{"document":{"id":"709","name":"My + name is 709"},"highlight":{},"highlights":[]},{"document":{"id":"708","name":"My + name is 708"},"highlight":{},"highlights":[]},{"document":{"id":"707","name":"My + name is 707"},"highlight":{},"highlights":[]},{"document":{"id":"706","name":"My + name is 706"},"highlight":{},"highlights":[]},{"document":{"id":"705","name":"My + name is 705"},"highlight":{},"highlights":[]},{"document":{"id":"704","name":"My + name is 704"},"highlight":{},"highlights":[]},{"document":{"id":"703","name":"My + name is 703"},"highlight":{},"highlights":[]},{"document":{"id":"702","name":"My + name is 702"},"highlight":{},"highlights":[]},{"document":{"id":"701","name":"My + name is 701"},"highlight":{},"highlights":[]},{"document":{"id":"700","name":"My + name is 700"},"highlight":{},"highlights":[]},{"document":{"id":"699","name":"My + name is 699"},"highlight":{},"highlights":[]},{"document":{"id":"698","name":"My + name is 698"},"highlight":{},"highlights":[]},{"document":{"id":"697","name":"My + name is 697"},"highlight":{},"highlights":[]},{"document":{"id":"696","name":"My + name is 696"},"highlight":{},"highlights":[]},{"document":{"id":"695","name":"My + name is 695"},"highlight":{},"highlights":[]},{"document":{"id":"694","name":"My + name is 694"},"highlight":{},"highlights":[]},{"document":{"id":"693","name":"My + name is 693"},"highlight":{},"highlights":[]},{"document":{"id":"692","name":"My + name is 692"},"highlight":{},"highlights":[]},{"document":{"id":"691","name":"My + name is 691"},"highlight":{},"highlights":[]},{"document":{"id":"690","name":"My + name is 690"},"highlight":{},"highlights":[]},{"document":{"id":"689","name":"My + name is 689"},"highlight":{},"highlights":[]},{"document":{"id":"688","name":"My + name is 688"},"highlight":{},"highlights":[]},{"document":{"id":"687","name":"My + name is 687"},"highlight":{},"highlights":[]},{"document":{"id":"686","name":"My + name is 686"},"highlight":{},"highlights":[]},{"document":{"id":"685","name":"My + name is 685"},"highlight":{},"highlights":[]},{"document":{"id":"684","name":"My + name is 684"},"highlight":{},"highlights":[]},{"document":{"id":"683","name":"My + name is 683"},"highlight":{},"highlights":[]},{"document":{"id":"682","name":"My + name is 682"},"highlight":{},"highlights":[]},{"document":{"id":"681","name":"My + name is 681"},"highlight":{},"highlights":[]},{"document":{"id":"680","name":"My + name is 680"},"highlight":{},"highlights":[]},{"document":{"id":"679","name":"My + name is 679"},"highlight":{},"highlights":[]},{"document":{"id":"678","name":"My + name is 678"},"highlight":{},"highlights":[]},{"document":{"id":"677","name":"My + name is 677"},"highlight":{},"highlights":[]},{"document":{"id":"676","name":"My + name is 676"},"highlight":{},"highlights":[]},{"document":{"id":"675","name":"My + name is 675"},"highlight":{},"highlights":[]},{"document":{"id":"674","name":"My + name is 674"},"highlight":{},"highlights":[]},{"document":{"id":"673","name":"My + name is 673"},"highlight":{},"highlights":[]},{"document":{"id":"672","name":"My + name is 672"},"highlight":{},"highlights":[]},{"document":{"id":"671","name":"My + name is 671"},"highlight":{},"highlights":[]},{"document":{"id":"670","name":"My + name is 670"},"highlight":{},"highlights":[]},{"document":{"id":"669","name":"My + name is 669"},"highlight":{},"highlights":[]},{"document":{"id":"668","name":"My + name is 668"},"highlight":{},"highlights":[]},{"document":{"id":"667","name":"My + name is 667"},"highlight":{},"highlights":[]},{"document":{"id":"666","name":"My + name is 666"},"highlight":{},"highlights":[]},{"document":{"id":"665","name":"My + name is 665"},"highlight":{},"highlights":[]},{"document":{"id":"664","name":"My + name is 664"},"highlight":{},"highlights":[]},{"document":{"id":"663","name":"My + name is 663"},"highlight":{},"highlights":[]},{"document":{"id":"662","name":"My + name is 662"},"highlight":{},"highlights":[]},{"document":{"id":"661","name":"My + name is 661"},"highlight":{},"highlights":[]},{"document":{"id":"660","name":"My + name is 660"},"highlight":{},"highlights":[]},{"document":{"id":"659","name":"My + name is 659"},"highlight":{},"highlights":[]},{"document":{"id":"658","name":"My + name is 658"},"highlight":{},"highlights":[]},{"document":{"id":"657","name":"My + name is 657"},"highlight":{},"highlights":[]},{"document":{"id":"656","name":"My + name is 656"},"highlight":{},"highlights":[]},{"document":{"id":"655","name":"My + name is 655"},"highlight":{},"highlights":[]},{"document":{"id":"654","name":"My + name is 654"},"highlight":{},"highlights":[]},{"document":{"id":"653","name":"My + name is 653"},"highlight":{},"highlights":[]},{"document":{"id":"652","name":"My + name is 652"},"highlight":{},"highlights":[]},{"document":{"id":"651","name":"My + name is 651"},"highlight":{},"highlights":[]},{"document":{"id":"650","name":"My + name is 650"},"highlight":{},"highlights":[]},{"document":{"id":"649","name":"My + name is 649"},"highlight":{},"highlights":[]},{"document":{"id":"648","name":"My + name is 648"},"highlight":{},"highlights":[]},{"document":{"id":"647","name":"My + name is 647"},"highlight":{},"highlights":[]},{"document":{"id":"646","name":"My + name is 646"},"highlight":{},"highlights":[]},{"document":{"id":"645","name":"My + name is 645"},"highlight":{},"highlights":[]},{"document":{"id":"644","name":"My + name is 644"},"highlight":{},"highlights":[]},{"document":{"id":"643","name":"My + name is 643"},"highlight":{},"highlights":[]},{"document":{"id":"642","name":"My + name is 642"},"highlight":{},"highlights":[]},{"document":{"id":"641","name":"My + name is 641"},"highlight":{},"highlights":[]},{"document":{"id":"640","name":"My + name is 640"},"highlight":{},"highlights":[]},{"document":{"id":"639","name":"My + name is 639"},"highlight":{},"highlights":[]},{"document":{"id":"638","name":"My + name is 638"},"highlight":{},"highlights":[]},{"document":{"id":"637","name":"My + name is 637"},"highlight":{},"highlights":[]},{"document":{"id":"636","name":"My + name is 636"},"highlight":{},"highlights":[]},{"document":{"id":"635","name":"My + name is 635"},"highlight":{},"highlights":[]},{"document":{"id":"634","name":"My + name is 634"},"highlight":{},"highlights":[]},{"document":{"id":"633","name":"My + name is 633"},"highlight":{},"highlights":[]},{"document":{"id":"632","name":"My + name is 632"},"highlight":{},"highlights":[]},{"document":{"id":"631","name":"My + name is 631"},"highlight":{},"highlights":[]},{"document":{"id":"630","name":"My + name is 630"},"highlight":{},"highlights":[]},{"document":{"id":"629","name":"My + name is 629"},"highlight":{},"highlights":[]},{"document":{"id":"628","name":"My + name is 628"},"highlight":{},"highlights":[]},{"document":{"id":"627","name":"My + name is 627"},"highlight":{},"highlights":[]},{"document":{"id":"626","name":"My + name is 626"},"highlight":{},"highlights":[]},{"document":{"id":"625","name":"My + name is 625"},"highlight":{},"highlights":[]},{"document":{"id":"624","name":"My + name is 624"},"highlight":{},"highlights":[]},{"document":{"id":"623","name":"My + name is 623"},"highlight":{},"highlights":[]},{"document":{"id":"622","name":"My + name is 622"},"highlight":{},"highlights":[]},{"document":{"id":"621","name":"My + name is 621"},"highlight":{},"highlights":[]},{"document":{"id":"620","name":"My + name is 620"},"highlight":{},"highlights":[]},{"document":{"id":"619","name":"My + name is 619"},"highlight":{},"highlights":[]},{"document":{"id":"618","name":"My + name is 618"},"highlight":{},"highlights":[]},{"document":{"id":"617","name":"My + name is 617"},"highlight":{},"highlights":[]},{"document":{"id":"616","name":"My + name is 616"},"highlight":{},"highlights":[]},{"document":{"id":"615","name":"My + name is 615"},"highlight":{},"highlights":[]},{"document":{"id":"614","name":"My + name is 614"},"highlight":{},"highlights":[]},{"document":{"id":"613","name":"My + name is 613"},"highlight":{},"highlights":[]},{"document":{"id":"612","name":"My + name is 612"},"highlight":{},"highlights":[]},{"document":{"id":"611","name":"My + name is 611"},"highlight":{},"highlights":[]},{"document":{"id":"610","name":"My + name is 610"},"highlight":{},"highlights":[]},{"document":{"id":"609","name":"My + name is 609"},"highlight":{},"highlights":[]},{"document":{"id":"608","name":"My + name is 608"},"highlight":{},"highlights":[]},{"document":{"id":"607","name":"My + name is 607"},"highlight":{},"highlights":[]},{"document":{"id":"606","name":"My + name is 606"},"highlight":{},"highlights":[]},{"document":{"id":"605","name":"My + name is 605"},"highlight":{},"highlights":[]},{"document":{"id":"604","name":"My + name is 604"},"highlight":{},"highlights":[]},{"document":{"id":"603","name":"My + name is 603"},"highlight":{},"highlights":[]},{"document":{"id":"602","name":"My + name is 602"},"highlight":{},"highlights":[]},{"document":{"id":"601","name":"My + name is 601"},"highlight":{},"highlights":[]},{"document":{"id":"600","name":"My + name is 600"},"highlight":{},"highlights":[]},{"document":{"id":"599","name":"My + name is 599"},"highlight":{},"highlights":[]},{"document":{"id":"598","name":"My + name is 598"},"highlight":{},"highlights":[]},{"document":{"id":"597","name":"My + name is 597"},"highlight":{},"highlights":[]},{"document":{"id":"596","name":"My + name is 596"},"highlight":{},"highlights":[]},{"document":{"id":"595","name":"My + name is 595"},"highlight":{},"highlights":[]},{"document":{"id":"594","name":"My + name is 594"},"highlight":{},"highlights":[]},{"document":{"id":"593","name":"My + name is 593"},"highlight":{},"highlights":[]},{"document":{"id":"592","name":"My + name is 592"},"highlight":{},"highlights":[]},{"document":{"id":"591","name":"My + name is 591"},"highlight":{},"highlights":[]},{"document":{"id":"590","name":"My + name is 590"},"highlight":{},"highlights":[]},{"document":{"id":"589","name":"My + name is 589"},"highlight":{},"highlights":[]},{"document":{"id":"588","name":"My + name is 588"},"highlight":{},"highlights":[]},{"document":{"id":"587","name":"My + name is 587"},"highlight":{},"highlights":[]},{"document":{"id":"586","name":"My + name is 586"},"highlight":{},"highlights":[]},{"document":{"id":"585","name":"My + name is 585"},"highlight":{},"highlights":[]},{"document":{"id":"584","name":"My + name is 584"},"highlight":{},"highlights":[]},{"document":{"id":"583","name":"My + name is 583"},"highlight":{},"highlights":[]},{"document":{"id":"582","name":"My + name is 582"},"highlight":{},"highlights":[]},{"document":{"id":"581","name":"My + name is 581"},"highlight":{},"highlights":[]},{"document":{"id":"580","name":"My + name is 580"},"highlight":{},"highlights":[]},{"document":{"id":"579","name":"My + name is 579"},"highlight":{},"highlights":[]},{"document":{"id":"578","name":"My + name is 578"},"highlight":{},"highlights":[]},{"document":{"id":"577","name":"My + name is 577"},"highlight":{},"highlights":[]},{"document":{"id":"576","name":"My + name is 576"},"highlight":{},"highlights":[]},{"document":{"id":"575","name":"My + name is 575"},"highlight":{},"highlights":[]},{"document":{"id":"574","name":"My + name is 574"},"highlight":{},"highlights":[]},{"document":{"id":"573","name":"My + name is 573"},"highlight":{},"highlights":[]},{"document":{"id":"572","name":"My + name is 572"},"highlight":{},"highlights":[]},{"document":{"id":"571","name":"My + name is 571"},"highlight":{},"highlights":[]},{"document":{"id":"570","name":"My + name is 570"},"highlight":{},"highlights":[]},{"document":{"id":"569","name":"My + name is 569"},"highlight":{},"highlights":[]},{"document":{"id":"568","name":"My + name is 568"},"highlight":{},"highlights":[]},{"document":{"id":"567","name":"My + name is 567"},"highlight":{},"highlights":[]},{"document":{"id":"566","name":"My + name is 566"},"highlight":{},"highlights":[]},{"document":{"id":"565","name":"My + name is 565"},"highlight":{},"highlights":[]},{"document":{"id":"564","name":"My + name is 564"},"highlight":{},"highlights":[]},{"document":{"id":"563","name":"My + name is 563"},"highlight":{},"highlights":[]},{"document":{"id":"562","name":"My + name is 562"},"highlight":{},"highlights":[]},{"document":{"id":"561","name":"My + name is 561"},"highlight":{},"highlights":[]},{"document":{"id":"560","name":"My + name is 560"},"highlight":{},"highlights":[]},{"document":{"id":"559","name":"My + name is 559"},"highlight":{},"highlights":[]},{"document":{"id":"558","name":"My + name is 558"},"highlight":{},"highlights":[]},{"document":{"id":"557","name":"My + name is 557"},"highlight":{},"highlights":[]},{"document":{"id":"556","name":"My + name is 556"},"highlight":{},"highlights":[]},{"document":{"id":"555","name":"My + name is 555"},"highlight":{},"highlights":[]},{"document":{"id":"554","name":"My + name is 554"},"highlight":{},"highlights":[]},{"document":{"id":"553","name":"My + name is 553"},"highlight":{},"highlights":[]},{"document":{"id":"552","name":"My + name is 552"},"highlight":{},"highlights":[]},{"document":{"id":"551","name":"My + name is 551"},"highlight":{},"highlights":[]},{"document":{"id":"550","name":"My + name is 550"},"highlight":{},"highlights":[]},{"document":{"id":"549","name":"My + name is 549"},"highlight":{},"highlights":[]},{"document":{"id":"548","name":"My + name is 548"},"highlight":{},"highlights":[]},{"document":{"id":"547","name":"My + name is 547"},"highlight":{},"highlights":[]},{"document":{"id":"546","name":"My + name is 546"},"highlight":{},"highlights":[]},{"document":{"id":"545","name":"My + name is 545"},"highlight":{},"highlights":[]},{"document":{"id":"544","name":"My + name is 544"},"highlight":{},"highlights":[]},{"document":{"id":"543","name":"My + name is 543"},"highlight":{},"highlights":[]},{"document":{"id":"542","name":"My + name is 542"},"highlight":{},"highlights":[]},{"document":{"id":"541","name":"My + name is 541"},"highlight":{},"highlights":[]},{"document":{"id":"540","name":"My + name is 540"},"highlight":{},"highlights":[]},{"document":{"id":"539","name":"My + name is 539"},"highlight":{},"highlights":[]},{"document":{"id":"538","name":"My + name is 538"},"highlight":{},"highlights":[]},{"document":{"id":"537","name":"My + name is 537"},"highlight":{},"highlights":[]},{"document":{"id":"536","name":"My + name is 536"},"highlight":{},"highlights":[]},{"document":{"id":"535","name":"My + name is 535"},"highlight":{},"highlights":[]},{"document":{"id":"534","name":"My + name is 534"},"highlight":{},"highlights":[]},{"document":{"id":"533","name":"My + name is 533"},"highlight":{},"highlights":[]},{"document":{"id":"532","name":"My + name is 532"},"highlight":{},"highlights":[]},{"document":{"id":"531","name":"My + name is 531"},"highlight":{},"highlights":[]},{"document":{"id":"530","name":"My + name is 530"},"highlight":{},"highlights":[]},{"document":{"id":"529","name":"My + name is 529"},"highlight":{},"highlights":[]},{"document":{"id":"528","name":"My + name is 528"},"highlight":{},"highlights":[]},{"document":{"id":"527","name":"My + name is 527"},"highlight":{},"highlights":[]},{"document":{"id":"526","name":"My + name is 526"},"highlight":{},"highlights":[]},{"document":{"id":"525","name":"My + name is 525"},"highlight":{},"highlights":[]},{"document":{"id":"524","name":"My + name is 524"},"highlight":{},"highlights":[]},{"document":{"id":"523","name":"My + name is 523"},"highlight":{},"highlights":[]},{"document":{"id":"522","name":"My + name is 522"},"highlight":{},"highlights":[]},{"document":{"id":"521","name":"My + name is 521"},"highlight":{},"highlights":[]},{"document":{"id":"520","name":"My + name is 520"},"highlight":{},"highlights":[]},{"document":{"id":"519","name":"My + name is 519"},"highlight":{},"highlights":[]},{"document":{"id":"518","name":"My + name is 518"},"highlight":{},"highlights":[]},{"document":{"id":"517","name":"My + name is 517"},"highlight":{},"highlights":[]},{"document":{"id":"516","name":"My + name is 516"},"highlight":{},"highlights":[]},{"document":{"id":"515","name":"My + name is 515"},"highlight":{},"highlights":[]},{"document":{"id":"514","name":"My + name is 514"},"highlight":{},"highlights":[]},{"document":{"id":"513","name":"My + name is 513"},"highlight":{},"highlights":[]},{"document":{"id":"512","name":"My + name is 512"},"highlight":{},"highlights":[]},{"document":{"id":"511","name":"My + name is 511"},"highlight":{},"highlights":[]},{"document":{"id":"510","name":"My + name is 510"},"highlight":{},"highlights":[]},{"document":{"id":"509","name":"My + name is 509"},"highlight":{},"highlights":[]},{"document":{"id":"508","name":"My + name is 508"},"highlight":{},"highlights":[]},{"document":{"id":"507","name":"My + name is 507"},"highlight":{},"highlights":[]},{"document":{"id":"506","name":"My + name is 506"},"highlight":{},"highlights":[]},{"document":{"id":"505","name":"My + name is 505"},"highlight":{},"highlights":[]},{"document":{"id":"504","name":"My + name is 504"},"highlight":{},"highlights":[]},{"document":{"id":"503","name":"My + name is 503"},"highlight":{},"highlights":[]},{"document":{"id":"502","name":"My + name is 502"},"highlight":{},"highlights":[]},{"document":{"id":"501","name":"My + name is 501"},"highlight":{},"highlights":[]},{"document":{"id":"500","name":"My + name is 500"},"highlight":{},"highlights":[]}],"out_of":1999,"page":6,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":2}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20468' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=7 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"499","name":"My + name is 499"},"highlight":{},"highlights":[]},{"document":{"id":"498","name":"My + name is 498"},"highlight":{},"highlights":[]},{"document":{"id":"497","name":"My + name is 497"},"highlight":{},"highlights":[]},{"document":{"id":"496","name":"My + name is 496"},"highlight":{},"highlights":[]},{"document":{"id":"495","name":"My + name is 495"},"highlight":{},"highlights":[]},{"document":{"id":"494","name":"My + name is 494"},"highlight":{},"highlights":[]},{"document":{"id":"493","name":"My + name is 493"},"highlight":{},"highlights":[]},{"document":{"id":"492","name":"My + name is 492"},"highlight":{},"highlights":[]},{"document":{"id":"491","name":"My + name is 491"},"highlight":{},"highlights":[]},{"document":{"id":"490","name":"My + name is 490"},"highlight":{},"highlights":[]},{"document":{"id":"489","name":"My + name is 489"},"highlight":{},"highlights":[]},{"document":{"id":"488","name":"My + name is 488"},"highlight":{},"highlights":[]},{"document":{"id":"487","name":"My + name is 487"},"highlight":{},"highlights":[]},{"document":{"id":"486","name":"My + name is 486"},"highlight":{},"highlights":[]},{"document":{"id":"485","name":"My + name is 485"},"highlight":{},"highlights":[]},{"document":{"id":"484","name":"My + name is 484"},"highlight":{},"highlights":[]},{"document":{"id":"483","name":"My + name is 483"},"highlight":{},"highlights":[]},{"document":{"id":"482","name":"My + name is 482"},"highlight":{},"highlights":[]},{"document":{"id":"481","name":"My + name is 481"},"highlight":{},"highlights":[]},{"document":{"id":"480","name":"My + name is 480"},"highlight":{},"highlights":[]},{"document":{"id":"479","name":"My + name is 479"},"highlight":{},"highlights":[]},{"document":{"id":"478","name":"My + name is 478"},"highlight":{},"highlights":[]},{"document":{"id":"477","name":"My + name is 477"},"highlight":{},"highlights":[]},{"document":{"id":"476","name":"My + name is 476"},"highlight":{},"highlights":[]},{"document":{"id":"475","name":"My + name is 475"},"highlight":{},"highlights":[]},{"document":{"id":"474","name":"My + name is 474"},"highlight":{},"highlights":[]},{"document":{"id":"473","name":"My + name is 473"},"highlight":{},"highlights":[]},{"document":{"id":"472","name":"My + name is 472"},"highlight":{},"highlights":[]},{"document":{"id":"471","name":"My + name is 471"},"highlight":{},"highlights":[]},{"document":{"id":"470","name":"My + name is 470"},"highlight":{},"highlights":[]},{"document":{"id":"469","name":"My + name is 469"},"highlight":{},"highlights":[]},{"document":{"id":"468","name":"My + name is 468"},"highlight":{},"highlights":[]},{"document":{"id":"467","name":"My + name is 467"},"highlight":{},"highlights":[]},{"document":{"id":"466","name":"My + name is 466"},"highlight":{},"highlights":[]},{"document":{"id":"465","name":"My + name is 465"},"highlight":{},"highlights":[]},{"document":{"id":"464","name":"My + name is 464"},"highlight":{},"highlights":[]},{"document":{"id":"463","name":"My + name is 463"},"highlight":{},"highlights":[]},{"document":{"id":"462","name":"My + name is 462"},"highlight":{},"highlights":[]},{"document":{"id":"461","name":"My + name is 461"},"highlight":{},"highlights":[]},{"document":{"id":"460","name":"My + name is 460"},"highlight":{},"highlights":[]},{"document":{"id":"459","name":"My + name is 459"},"highlight":{},"highlights":[]},{"document":{"id":"458","name":"My + name is 458"},"highlight":{},"highlights":[]},{"document":{"id":"457","name":"My + name is 457"},"highlight":{},"highlights":[]},{"document":{"id":"456","name":"My + name is 456"},"highlight":{},"highlights":[]},{"document":{"id":"455","name":"My + name is 455"},"highlight":{},"highlights":[]},{"document":{"id":"454","name":"My + name is 454"},"highlight":{},"highlights":[]},{"document":{"id":"453","name":"My + name is 453"},"highlight":{},"highlights":[]},{"document":{"id":"452","name":"My + name is 452"},"highlight":{},"highlights":[]},{"document":{"id":"451","name":"My + name is 451"},"highlight":{},"highlights":[]},{"document":{"id":"450","name":"My + name is 450"},"highlight":{},"highlights":[]},{"document":{"id":"449","name":"My + name is 449"},"highlight":{},"highlights":[]},{"document":{"id":"448","name":"My + name is 448"},"highlight":{},"highlights":[]},{"document":{"id":"447","name":"My + name is 447"},"highlight":{},"highlights":[]},{"document":{"id":"446","name":"My + name is 446"},"highlight":{},"highlights":[]},{"document":{"id":"445","name":"My + name is 445"},"highlight":{},"highlights":[]},{"document":{"id":"444","name":"My + name is 444"},"highlight":{},"highlights":[]},{"document":{"id":"443","name":"My + name is 443"},"highlight":{},"highlights":[]},{"document":{"id":"442","name":"My + name is 442"},"highlight":{},"highlights":[]},{"document":{"id":"441","name":"My + name is 441"},"highlight":{},"highlights":[]},{"document":{"id":"440","name":"My + name is 440"},"highlight":{},"highlights":[]},{"document":{"id":"439","name":"My + name is 439"},"highlight":{},"highlights":[]},{"document":{"id":"438","name":"My + name is 438"},"highlight":{},"highlights":[]},{"document":{"id":"437","name":"My + name is 437"},"highlight":{},"highlights":[]},{"document":{"id":"436","name":"My + name is 436"},"highlight":{},"highlights":[]},{"document":{"id":"435","name":"My + name is 435"},"highlight":{},"highlights":[]},{"document":{"id":"434","name":"My + name is 434"},"highlight":{},"highlights":[]},{"document":{"id":"433","name":"My + name is 433"},"highlight":{},"highlights":[]},{"document":{"id":"432","name":"My + name is 432"},"highlight":{},"highlights":[]},{"document":{"id":"431","name":"My + name is 431"},"highlight":{},"highlights":[]},{"document":{"id":"430","name":"My + name is 430"},"highlight":{},"highlights":[]},{"document":{"id":"429","name":"My + name is 429"},"highlight":{},"highlights":[]},{"document":{"id":"428","name":"My + name is 428"},"highlight":{},"highlights":[]},{"document":{"id":"427","name":"My + name is 427"},"highlight":{},"highlights":[]},{"document":{"id":"426","name":"My + name is 426"},"highlight":{},"highlights":[]},{"document":{"id":"425","name":"My + name is 425"},"highlight":{},"highlights":[]},{"document":{"id":"424","name":"My + name is 424"},"highlight":{},"highlights":[]},{"document":{"id":"423","name":"My + name is 423"},"highlight":{},"highlights":[]},{"document":{"id":"422","name":"My + name is 422"},"highlight":{},"highlights":[]},{"document":{"id":"421","name":"My + name is 421"},"highlight":{},"highlights":[]},{"document":{"id":"420","name":"My + name is 420"},"highlight":{},"highlights":[]},{"document":{"id":"419","name":"My + name is 419"},"highlight":{},"highlights":[]},{"document":{"id":"418","name":"My + name is 418"},"highlight":{},"highlights":[]},{"document":{"id":"417","name":"My + name is 417"},"highlight":{},"highlights":[]},{"document":{"id":"416","name":"My + name is 416"},"highlight":{},"highlights":[]},{"document":{"id":"415","name":"My + name is 415"},"highlight":{},"highlights":[]},{"document":{"id":"414","name":"My + name is 414"},"highlight":{},"highlights":[]},{"document":{"id":"413","name":"My + name is 413"},"highlight":{},"highlights":[]},{"document":{"id":"412","name":"My + name is 412"},"highlight":{},"highlights":[]},{"document":{"id":"411","name":"My + name is 411"},"highlight":{},"highlights":[]},{"document":{"id":"410","name":"My + name is 410"},"highlight":{},"highlights":[]},{"document":{"id":"409","name":"My + name is 409"},"highlight":{},"highlights":[]},{"document":{"id":"408","name":"My + name is 408"},"highlight":{},"highlights":[]},{"document":{"id":"407","name":"My + name is 407"},"highlight":{},"highlights":[]},{"document":{"id":"406","name":"My + name is 406"},"highlight":{},"highlights":[]},{"document":{"id":"405","name":"My + name is 405"},"highlight":{},"highlights":[]},{"document":{"id":"404","name":"My + name is 404"},"highlight":{},"highlights":[]},{"document":{"id":"403","name":"My + name is 403"},"highlight":{},"highlights":[]},{"document":{"id":"402","name":"My + name is 402"},"highlight":{},"highlights":[]},{"document":{"id":"401","name":"My + name is 401"},"highlight":{},"highlights":[]},{"document":{"id":"400","name":"My + name is 400"},"highlight":{},"highlights":[]},{"document":{"id":"399","name":"My + name is 399"},"highlight":{},"highlights":[]},{"document":{"id":"398","name":"My + name is 398"},"highlight":{},"highlights":[]},{"document":{"id":"397","name":"My + name is 397"},"highlight":{},"highlights":[]},{"document":{"id":"396","name":"My + name is 396"},"highlight":{},"highlights":[]},{"document":{"id":"395","name":"My + name is 395"},"highlight":{},"highlights":[]},{"document":{"id":"394","name":"My + name is 394"},"highlight":{},"highlights":[]},{"document":{"id":"393","name":"My + name is 393"},"highlight":{},"highlights":[]},{"document":{"id":"392","name":"My + name is 392"},"highlight":{},"highlights":[]},{"document":{"id":"391","name":"My + name is 391"},"highlight":{},"highlights":[]},{"document":{"id":"390","name":"My + name is 390"},"highlight":{},"highlights":[]},{"document":{"id":"389","name":"My + name is 389"},"highlight":{},"highlights":[]},{"document":{"id":"388","name":"My + name is 388"},"highlight":{},"highlights":[]},{"document":{"id":"387","name":"My + name is 387"},"highlight":{},"highlights":[]},{"document":{"id":"386","name":"My + name is 386"},"highlight":{},"highlights":[]},{"document":{"id":"385","name":"My + name is 385"},"highlight":{},"highlights":[]},{"document":{"id":"384","name":"My + name is 384"},"highlight":{},"highlights":[]},{"document":{"id":"383","name":"My + name is 383"},"highlight":{},"highlights":[]},{"document":{"id":"382","name":"My + name is 382"},"highlight":{},"highlights":[]},{"document":{"id":"381","name":"My + name is 381"},"highlight":{},"highlights":[]},{"document":{"id":"380","name":"My + name is 380"},"highlight":{},"highlights":[]},{"document":{"id":"379","name":"My + name is 379"},"highlight":{},"highlights":[]},{"document":{"id":"378","name":"My + name is 378"},"highlight":{},"highlights":[]},{"document":{"id":"377","name":"My + name is 377"},"highlight":{},"highlights":[]},{"document":{"id":"376","name":"My + name is 376"},"highlight":{},"highlights":[]},{"document":{"id":"375","name":"My + name is 375"},"highlight":{},"highlights":[]},{"document":{"id":"374","name":"My + name is 374"},"highlight":{},"highlights":[]},{"document":{"id":"373","name":"My + name is 373"},"highlight":{},"highlights":[]},{"document":{"id":"372","name":"My + name is 372"},"highlight":{},"highlights":[]},{"document":{"id":"371","name":"My + name is 371"},"highlight":{},"highlights":[]},{"document":{"id":"370","name":"My + name is 370"},"highlight":{},"highlights":[]},{"document":{"id":"369","name":"My + name is 369"},"highlight":{},"highlights":[]},{"document":{"id":"368","name":"My + name is 368"},"highlight":{},"highlights":[]},{"document":{"id":"367","name":"My + name is 367"},"highlight":{},"highlights":[]},{"document":{"id":"366","name":"My + name is 366"},"highlight":{},"highlights":[]},{"document":{"id":"365","name":"My + name is 365"},"highlight":{},"highlights":[]},{"document":{"id":"364","name":"My + name is 364"},"highlight":{},"highlights":[]},{"document":{"id":"363","name":"My + name is 363"},"highlight":{},"highlights":[]},{"document":{"id":"362","name":"My + name is 362"},"highlight":{},"highlights":[]},{"document":{"id":"361","name":"My + name is 361"},"highlight":{},"highlights":[]},{"document":{"id":"360","name":"My + name is 360"},"highlight":{},"highlights":[]},{"document":{"id":"359","name":"My + name is 359"},"highlight":{},"highlights":[]},{"document":{"id":"358","name":"My + name is 358"},"highlight":{},"highlights":[]},{"document":{"id":"357","name":"My + name is 357"},"highlight":{},"highlights":[]},{"document":{"id":"356","name":"My + name is 356"},"highlight":{},"highlights":[]},{"document":{"id":"355","name":"My + name is 355"},"highlight":{},"highlights":[]},{"document":{"id":"354","name":"My + name is 354"},"highlight":{},"highlights":[]},{"document":{"id":"353","name":"My + name is 353"},"highlight":{},"highlights":[]},{"document":{"id":"352","name":"My + name is 352"},"highlight":{},"highlights":[]},{"document":{"id":"351","name":"My + name is 351"},"highlight":{},"highlights":[]},{"document":{"id":"350","name":"My + name is 350"},"highlight":{},"highlights":[]},{"document":{"id":"349","name":"My + name is 349"},"highlight":{},"highlights":[]},{"document":{"id":"348","name":"My + name is 348"},"highlight":{},"highlights":[]},{"document":{"id":"347","name":"My + name is 347"},"highlight":{},"highlights":[]},{"document":{"id":"346","name":"My + name is 346"},"highlight":{},"highlights":[]},{"document":{"id":"345","name":"My + name is 345"},"highlight":{},"highlights":[]},{"document":{"id":"344","name":"My + name is 344"},"highlight":{},"highlights":[]},{"document":{"id":"343","name":"My + name is 343"},"highlight":{},"highlights":[]},{"document":{"id":"342","name":"My + name is 342"},"highlight":{},"highlights":[]},{"document":{"id":"341","name":"My + name is 341"},"highlight":{},"highlights":[]},{"document":{"id":"340","name":"My + name is 340"},"highlight":{},"highlights":[]},{"document":{"id":"339","name":"My + name is 339"},"highlight":{},"highlights":[]},{"document":{"id":"338","name":"My + name is 338"},"highlight":{},"highlights":[]},{"document":{"id":"337","name":"My + name is 337"},"highlight":{},"highlights":[]},{"document":{"id":"336","name":"My + name is 336"},"highlight":{},"highlights":[]},{"document":{"id":"335","name":"My + name is 335"},"highlight":{},"highlights":[]},{"document":{"id":"334","name":"My + name is 334"},"highlight":{},"highlights":[]},{"document":{"id":"333","name":"My + name is 333"},"highlight":{},"highlights":[]},{"document":{"id":"332","name":"My + name is 332"},"highlight":{},"highlights":[]},{"document":{"id":"331","name":"My + name is 331"},"highlight":{},"highlights":[]},{"document":{"id":"330","name":"My + name is 330"},"highlight":{},"highlights":[]},{"document":{"id":"329","name":"My + name is 329"},"highlight":{},"highlights":[]},{"document":{"id":"328","name":"My + name is 328"},"highlight":{},"highlights":[]},{"document":{"id":"327","name":"My + name is 327"},"highlight":{},"highlights":[]},{"document":{"id":"326","name":"My + name is 326"},"highlight":{},"highlights":[]},{"document":{"id":"325","name":"My + name is 325"},"highlight":{},"highlights":[]},{"document":{"id":"324","name":"My + name is 324"},"highlight":{},"highlights":[]},{"document":{"id":"323","name":"My + name is 323"},"highlight":{},"highlights":[]},{"document":{"id":"322","name":"My + name is 322"},"highlight":{},"highlights":[]},{"document":{"id":"321","name":"My + name is 321"},"highlight":{},"highlights":[]},{"document":{"id":"320","name":"My + name is 320"},"highlight":{},"highlights":[]},{"document":{"id":"319","name":"My + name is 319"},"highlight":{},"highlights":[]},{"document":{"id":"318","name":"My + name is 318"},"highlight":{},"highlights":[]},{"document":{"id":"317","name":"My + name is 317"},"highlight":{},"highlights":[]},{"document":{"id":"316","name":"My + name is 316"},"highlight":{},"highlights":[]},{"document":{"id":"315","name":"My + name is 315"},"highlight":{},"highlights":[]},{"document":{"id":"314","name":"My + name is 314"},"highlight":{},"highlights":[]},{"document":{"id":"313","name":"My + name is 313"},"highlight":{},"highlights":[]},{"document":{"id":"312","name":"My + name is 312"},"highlight":{},"highlights":[]},{"document":{"id":"311","name":"My + name is 311"},"highlight":{},"highlights":[]},{"document":{"id":"310","name":"My + name is 310"},"highlight":{},"highlights":[]},{"document":{"id":"309","name":"My + name is 309"},"highlight":{},"highlights":[]},{"document":{"id":"308","name":"My + name is 308"},"highlight":{},"highlights":[]},{"document":{"id":"307","name":"My + name is 307"},"highlight":{},"highlights":[]},{"document":{"id":"306","name":"My + name is 306"},"highlight":{},"highlights":[]},{"document":{"id":"305","name":"My + name is 305"},"highlight":{},"highlights":[]},{"document":{"id":"304","name":"My + name is 304"},"highlight":{},"highlights":[]},{"document":{"id":"303","name":"My + name is 303"},"highlight":{},"highlights":[]},{"document":{"id":"302","name":"My + name is 302"},"highlight":{},"highlights":[]},{"document":{"id":"301","name":"My + name is 301"},"highlight":{},"highlights":[]},{"document":{"id":"300","name":"My + name is 300"},"highlight":{},"highlights":[]},{"document":{"id":"299","name":"My + name is 299"},"highlight":{},"highlights":[]},{"document":{"id":"298","name":"My + name is 298"},"highlight":{},"highlights":[]},{"document":{"id":"297","name":"My + name is 297"},"highlight":{},"highlights":[]},{"document":{"id":"296","name":"My + name is 296"},"highlight":{},"highlights":[]},{"document":{"id":"295","name":"My + name is 295"},"highlight":{},"highlights":[]},{"document":{"id":"294","name":"My + name is 294"},"highlight":{},"highlights":[]},{"document":{"id":"293","name":"My + name is 293"},"highlight":{},"highlights":[]},{"document":{"id":"292","name":"My + name is 292"},"highlight":{},"highlights":[]},{"document":{"id":"291","name":"My + name is 291"},"highlight":{},"highlights":[]},{"document":{"id":"290","name":"My + name is 290"},"highlight":{},"highlights":[]},{"document":{"id":"289","name":"My + name is 289"},"highlight":{},"highlights":[]},{"document":{"id":"288","name":"My + name is 288"},"highlight":{},"highlights":[]},{"document":{"id":"287","name":"My + name is 287"},"highlight":{},"highlights":[]},{"document":{"id":"286","name":"My + name is 286"},"highlight":{},"highlights":[]},{"document":{"id":"285","name":"My + name is 285"},"highlight":{},"highlights":[]},{"document":{"id":"284","name":"My + name is 284"},"highlight":{},"highlights":[]},{"document":{"id":"283","name":"My + name is 283"},"highlight":{},"highlights":[]},{"document":{"id":"282","name":"My + name is 282"},"highlight":{},"highlights":[]},{"document":{"id":"281","name":"My + name is 281"},"highlight":{},"highlights":[]},{"document":{"id":"280","name":"My + name is 280"},"highlight":{},"highlights":[]},{"document":{"id":"279","name":"My + name is 279"},"highlight":{},"highlights":[]},{"document":{"id":"278","name":"My + name is 278"},"highlight":{},"highlights":[]},{"document":{"id":"277","name":"My + name is 277"},"highlight":{},"highlights":[]},{"document":{"id":"276","name":"My + name is 276"},"highlight":{},"highlights":[]},{"document":{"id":"275","name":"My + name is 275"},"highlight":{},"highlights":[]},{"document":{"id":"274","name":"My + name is 274"},"highlight":{},"highlights":[]},{"document":{"id":"273","name":"My + name is 273"},"highlight":{},"highlights":[]},{"document":{"id":"272","name":"My + name is 272"},"highlight":{},"highlights":[]},{"document":{"id":"271","name":"My + name is 271"},"highlight":{},"highlights":[]},{"document":{"id":"270","name":"My + name is 270"},"highlight":{},"highlights":[]},{"document":{"id":"269","name":"My + name is 269"},"highlight":{},"highlights":[]},{"document":{"id":"268","name":"My + name is 268"},"highlight":{},"highlights":[]},{"document":{"id":"267","name":"My + name is 267"},"highlight":{},"highlights":[]},{"document":{"id":"266","name":"My + name is 266"},"highlight":{},"highlights":[]},{"document":{"id":"265","name":"My + name is 265"},"highlight":{},"highlights":[]},{"document":{"id":"264","name":"My + name is 264"},"highlight":{},"highlights":[]},{"document":{"id":"263","name":"My + name is 263"},"highlight":{},"highlights":[]},{"document":{"id":"262","name":"My + name is 262"},"highlight":{},"highlights":[]},{"document":{"id":"261","name":"My + name is 261"},"highlight":{},"highlights":[]},{"document":{"id":"260","name":"My + name is 260"},"highlight":{},"highlights":[]},{"document":{"id":"259","name":"My + name is 259"},"highlight":{},"highlights":[]},{"document":{"id":"258","name":"My + name is 258"},"highlight":{},"highlights":[]},{"document":{"id":"257","name":"My + name is 257"},"highlight":{},"highlights":[]},{"document":{"id":"256","name":"My + name is 256"},"highlight":{},"highlights":[]},{"document":{"id":"255","name":"My + name is 255"},"highlight":{},"highlights":[]},{"document":{"id":"254","name":"My + name is 254"},"highlight":{},"highlights":[]},{"document":{"id":"253","name":"My + name is 253"},"highlight":{},"highlights":[]},{"document":{"id":"252","name":"My + name is 252"},"highlight":{},"highlights":[]},{"document":{"id":"251","name":"My + name is 251"},"highlight":{},"highlights":[]},{"document":{"id":"250","name":"My + name is 250"},"highlight":{},"highlights":[]}],"out_of":1999,"page":7,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":4}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20468' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us/documents/search?per_page=250&q=%2A&page=8 + response: + body: + string: '{"facet_counts":[],"found":1999,"hits":[{"document":{"id":"249","name":"My + name is 249"},"highlight":{},"highlights":[]},{"document":{"id":"248","name":"My + name is 248"},"highlight":{},"highlights":[]},{"document":{"id":"247","name":"My + name is 247"},"highlight":{},"highlights":[]},{"document":{"id":"246","name":"My + name is 246"},"highlight":{},"highlights":[]},{"document":{"id":"245","name":"My + name is 245"},"highlight":{},"highlights":[]},{"document":{"id":"244","name":"My + name is 244"},"highlight":{},"highlights":[]},{"document":{"id":"243","name":"My + name is 243"},"highlight":{},"highlights":[]},{"document":{"id":"242","name":"My + name is 242"},"highlight":{},"highlights":[]},{"document":{"id":"241","name":"My + name is 241"},"highlight":{},"highlights":[]},{"document":{"id":"240","name":"My + name is 240"},"highlight":{},"highlights":[]},{"document":{"id":"239","name":"My + name is 239"},"highlight":{},"highlights":[]},{"document":{"id":"238","name":"My + name is 238"},"highlight":{},"highlights":[]},{"document":{"id":"237","name":"My + name is 237"},"highlight":{},"highlights":[]},{"document":{"id":"236","name":"My + name is 236"},"highlight":{},"highlights":[]},{"document":{"id":"235","name":"My + name is 235"},"highlight":{},"highlights":[]},{"document":{"id":"234","name":"My + name is 234"},"highlight":{},"highlights":[]},{"document":{"id":"233","name":"My + name is 233"},"highlight":{},"highlights":[]},{"document":{"id":"232","name":"My + name is 232"},"highlight":{},"highlights":[]},{"document":{"id":"231","name":"My + name is 231"},"highlight":{},"highlights":[]},{"document":{"id":"230","name":"My + name is 230"},"highlight":{},"highlights":[]},{"document":{"id":"229","name":"My + name is 229"},"highlight":{},"highlights":[]},{"document":{"id":"228","name":"My + name is 228"},"highlight":{},"highlights":[]},{"document":{"id":"227","name":"My + name is 227"},"highlight":{},"highlights":[]},{"document":{"id":"226","name":"My + name is 226"},"highlight":{},"highlights":[]},{"document":{"id":"225","name":"My + name is 225"},"highlight":{},"highlights":[]},{"document":{"id":"224","name":"My + name is 224"},"highlight":{},"highlights":[]},{"document":{"id":"223","name":"My + name is 223"},"highlight":{},"highlights":[]},{"document":{"id":"222","name":"My + name is 222"},"highlight":{},"highlights":[]},{"document":{"id":"221","name":"My + name is 221"},"highlight":{},"highlights":[]},{"document":{"id":"220","name":"My + name is 220"},"highlight":{},"highlights":[]},{"document":{"id":"219","name":"My + name is 219"},"highlight":{},"highlights":[]},{"document":{"id":"218","name":"My + name is 218"},"highlight":{},"highlights":[]},{"document":{"id":"217","name":"My + name is 217"},"highlight":{},"highlights":[]},{"document":{"id":"216","name":"My + name is 216"},"highlight":{},"highlights":[]},{"document":{"id":"215","name":"My + name is 215"},"highlight":{},"highlights":[]},{"document":{"id":"214","name":"My + name is 214"},"highlight":{},"highlights":[]},{"document":{"id":"213","name":"My + name is 213"},"highlight":{},"highlights":[]},{"document":{"id":"212","name":"My + name is 212"},"highlight":{},"highlights":[]},{"document":{"id":"211","name":"My + name is 211"},"highlight":{},"highlights":[]},{"document":{"id":"210","name":"My + name is 210"},"highlight":{},"highlights":[]},{"document":{"id":"209","name":"My + name is 209"},"highlight":{},"highlights":[]},{"document":{"id":"208","name":"My + name is 208"},"highlight":{},"highlights":[]},{"document":{"id":"207","name":"My + name is 207"},"highlight":{},"highlights":[]},{"document":{"id":"206","name":"My + name is 206"},"highlight":{},"highlights":[]},{"document":{"id":"205","name":"My + name is 205"},"highlight":{},"highlights":[]},{"document":{"id":"204","name":"My + name is 204"},"highlight":{},"highlights":[]},{"document":{"id":"203","name":"My + name is 203"},"highlight":{},"highlights":[]},{"document":{"id":"202","name":"My + name is 202"},"highlight":{},"highlights":[]},{"document":{"id":"201","name":"My + name is 201"},"highlight":{},"highlights":[]},{"document":{"id":"200","name":"My + name is 200"},"highlight":{},"highlights":[]},{"document":{"id":"199","name":"My + name is 199"},"highlight":{},"highlights":[]},{"document":{"id":"198","name":"My + name is 198"},"highlight":{},"highlights":[]},{"document":{"id":"197","name":"My + name is 197"},"highlight":{},"highlights":[]},{"document":{"id":"196","name":"My + name is 196"},"highlight":{},"highlights":[]},{"document":{"id":"195","name":"My + name is 195"},"highlight":{},"highlights":[]},{"document":{"id":"194","name":"My + name is 194"},"highlight":{},"highlights":[]},{"document":{"id":"193","name":"My + name is 193"},"highlight":{},"highlights":[]},{"document":{"id":"192","name":"My + name is 192"},"highlight":{},"highlights":[]},{"document":{"id":"191","name":"My + name is 191"},"highlight":{},"highlights":[]},{"document":{"id":"190","name":"My + name is 190"},"highlight":{},"highlights":[]},{"document":{"id":"189","name":"My + name is 189"},"highlight":{},"highlights":[]},{"document":{"id":"188","name":"My + name is 188"},"highlight":{},"highlights":[]},{"document":{"id":"187","name":"My + name is 187"},"highlight":{},"highlights":[]},{"document":{"id":"186","name":"My + name is 186"},"highlight":{},"highlights":[]},{"document":{"id":"185","name":"My + name is 185"},"highlight":{},"highlights":[]},{"document":{"id":"184","name":"My + name is 184"},"highlight":{},"highlights":[]},{"document":{"id":"183","name":"My + name is 183"},"highlight":{},"highlights":[]},{"document":{"id":"182","name":"My + name is 182"},"highlight":{},"highlights":[]},{"document":{"id":"181","name":"My + name is 181"},"highlight":{},"highlights":[]},{"document":{"id":"180","name":"My + name is 180"},"highlight":{},"highlights":[]},{"document":{"id":"179","name":"My + name is 179"},"highlight":{},"highlights":[]},{"document":{"id":"178","name":"My + name is 178"},"highlight":{},"highlights":[]},{"document":{"id":"177","name":"My + name is 177"},"highlight":{},"highlights":[]},{"document":{"id":"176","name":"My + name is 176"},"highlight":{},"highlights":[]},{"document":{"id":"175","name":"My + name is 175"},"highlight":{},"highlights":[]},{"document":{"id":"174","name":"My + name is 174"},"highlight":{},"highlights":[]},{"document":{"id":"173","name":"My + name is 173"},"highlight":{},"highlights":[]},{"document":{"id":"172","name":"My + name is 172"},"highlight":{},"highlights":[]},{"document":{"id":"171","name":"My + name is 171"},"highlight":{},"highlights":[]},{"document":{"id":"170","name":"My + name is 170"},"highlight":{},"highlights":[]},{"document":{"id":"169","name":"My + name is 169"},"highlight":{},"highlights":[]},{"document":{"id":"168","name":"My + name is 168"},"highlight":{},"highlights":[]},{"document":{"id":"167","name":"My + name is 167"},"highlight":{},"highlights":[]},{"document":{"id":"166","name":"My + name is 166"},"highlight":{},"highlights":[]},{"document":{"id":"165","name":"My + name is 165"},"highlight":{},"highlights":[]},{"document":{"id":"164","name":"My + name is 164"},"highlight":{},"highlights":[]},{"document":{"id":"163","name":"My + name is 163"},"highlight":{},"highlights":[]},{"document":{"id":"162","name":"My + name is 162"},"highlight":{},"highlights":[]},{"document":{"id":"161","name":"My + name is 161"},"highlight":{},"highlights":[]},{"document":{"id":"160","name":"My + name is 160"},"highlight":{},"highlights":[]},{"document":{"id":"159","name":"My + name is 159"},"highlight":{},"highlights":[]},{"document":{"id":"158","name":"My + name is 158"},"highlight":{},"highlights":[]},{"document":{"id":"157","name":"My + name is 157"},"highlight":{},"highlights":[]},{"document":{"id":"156","name":"My + name is 156"},"highlight":{},"highlights":[]},{"document":{"id":"155","name":"My + name is 155"},"highlight":{},"highlights":[]},{"document":{"id":"154","name":"My + name is 154"},"highlight":{},"highlights":[]},{"document":{"id":"153","name":"My + name is 153"},"highlight":{},"highlights":[]},{"document":{"id":"152","name":"My + name is 152"},"highlight":{},"highlights":[]},{"document":{"id":"151","name":"My + name is 151"},"highlight":{},"highlights":[]},{"document":{"id":"150","name":"My + name is 150"},"highlight":{},"highlights":[]},{"document":{"id":"149","name":"My + name is 149"},"highlight":{},"highlights":[]},{"document":{"id":"148","name":"My + name is 148"},"highlight":{},"highlights":[]},{"document":{"id":"147","name":"My + name is 147"},"highlight":{},"highlights":[]},{"document":{"id":"146","name":"My + name is 146"},"highlight":{},"highlights":[]},{"document":{"id":"145","name":"My + name is 145"},"highlight":{},"highlights":[]},{"document":{"id":"144","name":"My + name is 144"},"highlight":{},"highlights":[]},{"document":{"id":"143","name":"My + name is 143"},"highlight":{},"highlights":[]},{"document":{"id":"142","name":"My + name is 142"},"highlight":{},"highlights":[]},{"document":{"id":"141","name":"My + name is 141"},"highlight":{},"highlights":[]},{"document":{"id":"140","name":"My + name is 140"},"highlight":{},"highlights":[]},{"document":{"id":"139","name":"My + name is 139"},"highlight":{},"highlights":[]},{"document":{"id":"138","name":"My + name is 138"},"highlight":{},"highlights":[]},{"document":{"id":"137","name":"My + name is 137"},"highlight":{},"highlights":[]},{"document":{"id":"136","name":"My + name is 136"},"highlight":{},"highlights":[]},{"document":{"id":"135","name":"My + name is 135"},"highlight":{},"highlights":[]},{"document":{"id":"134","name":"My + name is 134"},"highlight":{},"highlights":[]},{"document":{"id":"133","name":"My + name is 133"},"highlight":{},"highlights":[]},{"document":{"id":"132","name":"My + name is 132"},"highlight":{},"highlights":[]},{"document":{"id":"131","name":"My + name is 131"},"highlight":{},"highlights":[]},{"document":{"id":"130","name":"My + name is 130"},"highlight":{},"highlights":[]},{"document":{"id":"129","name":"My + name is 129"},"highlight":{},"highlights":[]},{"document":{"id":"128","name":"My + name is 128"},"highlight":{},"highlights":[]},{"document":{"id":"127","name":"My + name is 127"},"highlight":{},"highlights":[]},{"document":{"id":"126","name":"My + name is 126"},"highlight":{},"highlights":[]},{"document":{"id":"125","name":"My + name is 125"},"highlight":{},"highlights":[]},{"document":{"id":"124","name":"My + name is 124"},"highlight":{},"highlights":[]},{"document":{"id":"123","name":"My + name is 123"},"highlight":{},"highlights":[]},{"document":{"id":"122","name":"My + name is 122"},"highlight":{},"highlights":[]},{"document":{"id":"121","name":"My + name is 121"},"highlight":{},"highlights":[]},{"document":{"id":"120","name":"My + name is 120"},"highlight":{},"highlights":[]},{"document":{"id":"119","name":"My + name is 119"},"highlight":{},"highlights":[]},{"document":{"id":"118","name":"My + name is 118"},"highlight":{},"highlights":[]},{"document":{"id":"117","name":"My + name is 117"},"highlight":{},"highlights":[]},{"document":{"id":"116","name":"My + name is 116"},"highlight":{},"highlights":[]},{"document":{"id":"115","name":"My + name is 115"},"highlight":{},"highlights":[]},{"document":{"id":"114","name":"My + name is 114"},"highlight":{},"highlights":[]},{"document":{"id":"113","name":"My + name is 113"},"highlight":{},"highlights":[]},{"document":{"id":"112","name":"My + name is 112"},"highlight":{},"highlights":[]},{"document":{"id":"111","name":"My + name is 111"},"highlight":{},"highlights":[]},{"document":{"id":"110","name":"My + name is 110"},"highlight":{},"highlights":[]},{"document":{"id":"109","name":"My + name is 109"},"highlight":{},"highlights":[]},{"document":{"id":"108","name":"My + name is 108"},"highlight":{},"highlights":[]},{"document":{"id":"107","name":"My + name is 107"},"highlight":{},"highlights":[]},{"document":{"id":"106","name":"My + name is 106"},"highlight":{},"highlights":[]},{"document":{"id":"105","name":"My + name is 105"},"highlight":{},"highlights":[]},{"document":{"id":"104","name":"My + name is 104"},"highlight":{},"highlights":[]},{"document":{"id":"103","name":"My + name is 103"},"highlight":{},"highlights":[]},{"document":{"id":"102","name":"My + name is 102"},"highlight":{},"highlights":[]},{"document":{"id":"101","name":"My + name is 101"},"highlight":{},"highlights":[]},{"document":{"id":"100","name":"My + name is 100"},"highlight":{},"highlights":[]},{"document":{"id":"99","name":"My + name is 99"},"highlight":{},"highlights":[]},{"document":{"id":"98","name":"My + name is 98"},"highlight":{},"highlights":[]},{"document":{"id":"97","name":"My + name is 97"},"highlight":{},"highlights":[]},{"document":{"id":"96","name":"My + name is 96"},"highlight":{},"highlights":[]},{"document":{"id":"95","name":"My + name is 95"},"highlight":{},"highlights":[]},{"document":{"id":"94","name":"My + name is 94"},"highlight":{},"highlights":[]},{"document":{"id":"93","name":"My + name is 93"},"highlight":{},"highlights":[]},{"document":{"id":"92","name":"My + name is 92"},"highlight":{},"highlights":[]},{"document":{"id":"91","name":"My + name is 91"},"highlight":{},"highlights":[]},{"document":{"id":"90","name":"My + name is 90"},"highlight":{},"highlights":[]},{"document":{"id":"89","name":"My + name is 89"},"highlight":{},"highlights":[]},{"document":{"id":"88","name":"My + name is 88"},"highlight":{},"highlights":[]},{"document":{"id":"87","name":"My + name is 87"},"highlight":{},"highlights":[]},{"document":{"id":"86","name":"My + name is 86"},"highlight":{},"highlights":[]},{"document":{"id":"85","name":"My + name is 85"},"highlight":{},"highlights":[]},{"document":{"id":"84","name":"My + name is 84"},"highlight":{},"highlights":[]},{"document":{"id":"83","name":"My + name is 83"},"highlight":{},"highlights":[]},{"document":{"id":"82","name":"My + name is 82"},"highlight":{},"highlights":[]},{"document":{"id":"81","name":"My + name is 81"},"highlight":{},"highlights":[]},{"document":{"id":"80","name":"My + name is 80"},"highlight":{},"highlights":[]},{"document":{"id":"79","name":"My + name is 79"},"highlight":{},"highlights":[]},{"document":{"id":"78","name":"My + name is 78"},"highlight":{},"highlights":[]},{"document":{"id":"77","name":"My + name is 77"},"highlight":{},"highlights":[]},{"document":{"id":"76","name":"My + name is 76"},"highlight":{},"highlights":[]},{"document":{"id":"75","name":"My + name is 75"},"highlight":{},"highlights":[]},{"document":{"id":"74","name":"My + name is 74"},"highlight":{},"highlights":[]},{"document":{"id":"73","name":"My + name is 73"},"highlight":{},"highlights":[]},{"document":{"id":"72","name":"My + name is 72"},"highlight":{},"highlights":[]},{"document":{"id":"71","name":"My + name is 71"},"highlight":{},"highlights":[]},{"document":{"id":"70","name":"My + name is 70"},"highlight":{},"highlights":[]},{"document":{"id":"69","name":"My + name is 69"},"highlight":{},"highlights":[]},{"document":{"id":"68","name":"My + name is 68"},"highlight":{},"highlights":[]},{"document":{"id":"67","name":"My + name is 67"},"highlight":{},"highlights":[]},{"document":{"id":"66","name":"My + name is 66"},"highlight":{},"highlights":[]},{"document":{"id":"65","name":"My + name is 65"},"highlight":{},"highlights":[]},{"document":{"id":"64","name":"My + name is 64"},"highlight":{},"highlights":[]},{"document":{"id":"63","name":"My + name is 63"},"highlight":{},"highlights":[]},{"document":{"id":"62","name":"My + name is 62"},"highlight":{},"highlights":[]},{"document":{"id":"61","name":"My + name is 61"},"highlight":{},"highlights":[]},{"document":{"id":"60","name":"My + name is 60"},"highlight":{},"highlights":[]},{"document":{"id":"59","name":"My + name is 59"},"highlight":{},"highlights":[]},{"document":{"id":"58","name":"My + name is 58"},"highlight":{},"highlights":[]},{"document":{"id":"57","name":"My + name is 57"},"highlight":{},"highlights":[]},{"document":{"id":"56","name":"My + name is 56"},"highlight":{},"highlights":[]},{"document":{"id":"55","name":"My + name is 55"},"highlight":{},"highlights":[]},{"document":{"id":"54","name":"My + name is 54"},"highlight":{},"highlights":[]},{"document":{"id":"53","name":"My + name is 53"},"highlight":{},"highlights":[]},{"document":{"id":"52","name":"My + name is 52"},"highlight":{},"highlights":[]},{"document":{"id":"51","name":"My + name is 51"},"highlight":{},"highlights":[]},{"document":{"id":"50","name":"My + name is 50"},"highlight":{},"highlights":[]},{"document":{"id":"49","name":"My + name is 49"},"highlight":{},"highlights":[]},{"document":{"id":"48","name":"My + name is 48"},"highlight":{},"highlights":[]},{"document":{"id":"47","name":"My + name is 47"},"highlight":{},"highlights":[]},{"document":{"id":"46","name":"My + name is 46"},"highlight":{},"highlights":[]},{"document":{"id":"45","name":"My + name is 45"},"highlight":{},"highlights":[]},{"document":{"id":"44","name":"My + name is 44"},"highlight":{},"highlights":[]},{"document":{"id":"43","name":"My + name is 43"},"highlight":{},"highlights":[]},{"document":{"id":"42","name":"My + name is 42"},"highlight":{},"highlights":[]},{"document":{"id":"41","name":"My + name is 41"},"highlight":{},"highlights":[]},{"document":{"id":"40","name":"My + name is 40"},"highlight":{},"highlights":[]},{"document":{"id":"39","name":"My + name is 39"},"highlight":{},"highlights":[]},{"document":{"id":"38","name":"My + name is 38"},"highlight":{},"highlights":[]},{"document":{"id":"37","name":"My + name is 37"},"highlight":{},"highlights":[]},{"document":{"id":"36","name":"My + name is 36"},"highlight":{},"highlights":[]},{"document":{"id":"35","name":"My + name is 35"},"highlight":{},"highlights":[]},{"document":{"id":"34","name":"My + name is 34"},"highlight":{},"highlights":[]},{"document":{"id":"33","name":"My + name is 33"},"highlight":{},"highlights":[]},{"document":{"id":"32","name":"My + name is 32"},"highlight":{},"highlights":[]},{"document":{"id":"31","name":"My + name is 31"},"highlight":{},"highlights":[]},{"document":{"id":"30","name":"My + name is 30"},"highlight":{},"highlights":[]},{"document":{"id":"29","name":"My + name is 29"},"highlight":{},"highlights":[]},{"document":{"id":"28","name":"My + name is 28"},"highlight":{},"highlights":[]},{"document":{"id":"27","name":"My + name is 27"},"highlight":{},"highlights":[]},{"document":{"id":"26","name":"My + name is 26"},"highlight":{},"highlights":[]},{"document":{"id":"25","name":"My + name is 25"},"highlight":{},"highlights":[]},{"document":{"id":"24","name":"My + name is 24"},"highlight":{},"highlights":[]},{"document":{"id":"23","name":"My + name is 23"},"highlight":{},"highlights":[]},{"document":{"id":"22","name":"My + name is 22"},"highlight":{},"highlights":[]},{"document":{"id":"21","name":"My + name is 21"},"highlight":{},"highlights":[]},{"document":{"id":"20","name":"My + name is 20"},"highlight":{},"highlights":[]},{"document":{"id":"19","name":"My + name is 19"},"highlight":{},"highlights":[]},{"document":{"id":"18","name":"My + name is 18"},"highlight":{},"highlights":[]},{"document":{"id":"17","name":"My + name is 17"},"highlight":{},"highlights":[]},{"document":{"id":"16","name":"My + name is 16"},"highlight":{},"highlights":[]},{"document":{"id":"15","name":"My + name is 15"},"highlight":{},"highlights":[]},{"document":{"id":"14","name":"My + name is 14"},"highlight":{},"highlights":[]},{"document":{"id":"13","name":"My + name is 13"},"highlight":{},"highlights":[]},{"document":{"id":"12","name":"My + name is 12"},"highlight":{},"highlights":[]},{"document":{"id":"11","name":"My + name is 11"},"highlight":{},"highlights":[]},{"document":{"id":"10","name":"My + name is 10"},"highlight":{},"highlights":[]},{"document":{"id":"9","name":"My + name is 9"},"highlight":{},"highlights":[]},{"document":{"id":"8","name":"My + name is 8"},"highlight":{},"highlights":[]},{"document":{"id":"7","name":"My + name is 7"},"highlight":{},"highlights":[]},{"document":{"id":"6","name":"My + name is 6"},"highlight":{},"highlights":[]},{"document":{"id":"5","name":"My + name is 5"},"highlight":{},"highlights":[]},{"document":{"id":"4","name":"My + name is 4"},"highlight":{},"highlights":[]},{"document":{"id":"3","name":"My + name is 3"},"highlight":{},"highlights":[]},{"document":{"id":"2","name":"My + name is 2"},"highlight":{},"highlights":[]},{"document":{"id":"1","name":"My + name is 1"},"highlight":{},"highlights":[]}],"out_of":1999,"page":8,"request_params":{"collection_name":"demo_typesense_backend_contact_en_us","first_q":"*","per_page":250,"q":"*"},"search_cutoff":false,"search_time_ms":2}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '20171' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +version: 1 diff --git a/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_reindex.yaml b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_reindex.yaml new file mode 100644 index 00000000..95c00def --- /dev/null +++ b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_index_adapter_reindex.yaml @@ -0,0 +1,102 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219771,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":1999,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '365' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"message": "Not Found"}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 404 + message: Not Found +- request: + body: '{"fields": [{"name": "name", "type": "string"}], "name": "demo_typesense_backend_contact_en_us"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 201 + message: Created +version: 1 diff --git a/connector_typesense/tests/cassettes/TestConnectorTypesense.test_update_schema.yaml b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_update_schema.yaml new file mode 100644 index 00000000..0fbacbba --- /dev/null +++ b/connector_typesense/tests/cassettes/TestConnectorTypesense.test_update_schema.yaml @@ -0,0 +1,284 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: DELETE + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '362' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"message": "Not Found"}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 404 + message: Not Found +- request: + body: '{"fields": [{"name": "name", "type": "string"}], "name": "demo_typesense_backend_contact_en_us"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: POST + uri: http://typesense:8108/collections + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + access-control-allow-origin: + - '*' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '362' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '362' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '362' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: '{"fields": [{"name": "title", "type": "string"}]}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '49' + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: PATCH + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"fields":[{"async_reference":false,"embed":null,"facet":false,"hnsw_params":{"M":16,"ef_construction":200},"index":true,"infix":false,"locale":"","name":"title","nested":false,"nested_array":0,"num_dim":0,"optional":false,"range_index":false,"reference":"","sort":false,"stem":false,"stem_dictionary":"","store":true,"symbols_to_index":[],"token_separators":[],"type":"string","vec_dist":"cosine"}]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '400' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + X-TYPESENSE-API-KEY: + - xyz + method: GET + uri: http://typesense:8108/collections/demo_typesense_backend_contact_en_us + response: + body: + string: '{"created_at":1749219773,"default_sorting_field":"","enable_nested_fields":false,"fields":[{"facet":false,"index":true,"infix":false,"locale":"","name":"name","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"},{"facet":false,"index":true,"infix":false,"locale":"","name":"title","optional":false,"sort":false,"stem":false,"stem_dictionary":"","store":true,"type":"string"}],"name":"demo_typesense_backend_contact_en_us","num_documents":0,"symbols_to_index":[],"token_separators":[]}' + headers: + Connection: + - keep-alive + accept-ranges: + - none + access-control-allow-origin: + - '*' + content-length: + - '525' + content-type: + - application/json; charset=utf-8 + transfer-encoding: + - chunked + vary: + - accept-encoding + status: + code: 200 + message: OK +version: 1 diff --git a/connector_typesense/tests/test_connector_typesense.py b/connector_typesense/tests/test_connector_typesense.py new file mode 100644 index 00000000..b543eec3 --- /dev/null +++ b/connector_typesense/tests/test_connector_typesense.py @@ -0,0 +1,48 @@ +# Copyright 2025 Akretion (https://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.exceptions import UserError + +from odoo.addons.connector_search_engine.tests.common import ( + CommonTestAdapter, + TestBindingIndexBase, +) + +# NOTE: if you need to refresh tests, you can fire up an Typesense instance +# using `docker-compose.typesense.example.yml` in this same folder. +# If you are not running in a docker env, you'll need to add an alias +# in /etc/hosts to make "typesense" name point to 127.0.0.1 + + +class TestConnectorTypesense(CommonTestAdapter, TestBindingIndexBase): + _backend_xml_id = "connector_typesense.backend_1" + + @classmethod + def _se_index_config(cls): + return { + "name": "my_config", + "body": {"fields": [{"name": "name", "type": "string"}]}, + } + + def _update_schema(self, fields): + self.se_index.config_id.write({"body": {"fields": fields}}) + self.adapter.settings() + + def _assert_fields_in_schema(self, expected_fields): + res = self.adapter._ts_client.collections[self.adapter._index_name].retrieve() + fields = [x["name"] for x in res["fields"]] + fields.sort() + expected_fields.sort() + self.assertEqual(expected_fields, fields) + + def test_update_schema(self): + self.adapter.settings() + self._assert_fields_in_schema(["name"]) + + self._update_schema([{"name": "title", "type": "string"}]) + # Only adding field are supported so the name is still here + self._assert_fields_in_schema(["title", "name"]) + + def test_index_adapter_reindex(self): + with self.assertRaisesRegex(UserError, "not needed"): + self.adapter.reindex() diff --git a/connector_typesense/tools/adapter.py b/connector_typesense/tools/adapter.py index 5ce6a718..f7d5e0ff 100644 --- a/connector_typesense/tools/adapter.py +++ b/connector_typesense/tools/adapter.py @@ -1,7 +1,6 @@ # Copyright 2024 Derico # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import json import logging from typing import Any, Iterator @@ -21,12 +20,6 @@ _logger.debug("Can not import typesense") -# def _is_delete_nonexistent_documents(elastic_exception): -# """True iff all errors in this exception are deleting a nonexisting document.""" -# b = lambda d: "delete" in d and d["delete"]["status"] == 404 # noqa -# return all(b(error) for error in elastic_exception.errors) - - class TypesenseAdapter(SearchEngineAdapter): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -43,8 +36,8 @@ def _ts_client(self): return self.__ts_client @property - def _index_config(self): - return self.index_record.config_id.body + def _collections(self): + return self._ts_client.collections def _get_ts_client(self): backend = self.backend_record @@ -57,15 +50,14 @@ def _get_ts_client(self): "protocol": backend.ts_server_protocol, } ], - "api_key": backend.api_key, + "api_key": backend.ts_api_key, "connection_timeout_seconds": int(backend.ts_server_timeout) or 300, } ) def test_connection(self): - ts = self._ts_client try: - ts.collections.retrieve() + self._collections.retrieve() except typesense.exceptions.ObjectNotFound as exc: raise UserError( _("Not Found - The requested resource is not found.") @@ -80,23 +72,30 @@ def test_connection(self): ) from exc def index(self, records) -> None: - ts = self._ts_client - records_for_bulk = "" + # With typesense id must be a string so we have to convert + # the id into a string + items = [] for record in records: - if "id" in record: - record["id"] = str(record["id"]) - records_for_bulk += f"{json.dumps(record)}\n" + item = record.copy() + item["id"] = str(item["id"]) + items.append(item) + try: + res = self._collections[self._index_name].documents.import_( + items, {"action": "upsert"} + ) + except typesense.exceptions.ObjectNotFound as e: + _logger.warning( + f"{self._index_name} not found, creating a new index (collection)!" + f" and index records\n\n{e}" + ) + self.settings() + self.index(items) - _logger.info(f"Bulk import records into {self._index_name}'...") - res = ts.collections[self._index_name].documents.import_( - records_for_bulk, {"action": "emplace"} - ) - res = res.split("\n") - # checks if number of indexed object and object in records are equal - if not len(res) == len(records): - raise SystemError( + errors = len([item for item in res if not item.get("success")]) + if errors: + raise UserError( _( - "Unable to index all records. (indexed: %(indexed)s, " + "Unable to index all records. (nbr errors: %(errors)s, " "total: %(total)s)\n%(result)s", indexed=len(res), total=len(records), @@ -105,146 +104,75 @@ def index(self, records) -> None: ) def delete(self, binding_ids) -> None: - ts = self._ts_client - ts.collections[self._index_name].documents.delete( + self._collections[self._index_name].documents.delete( {"filter_by": f"id:{binding_ids}"} ) def clear(self) -> None: - ts = self._ts_client - index_name = self._get_current_aliased_index_name() or self._index_name - ts.collections[index_name].delete() - self.settings() - - def each(self) -> Iterator[dict[str, Any]]: - ts = self._ts_client - res = ts.collections[self._index_name].documents.search( - { - "q": "*", - } - ) - if not res: - # eg: empty index - return - hits = res["hits"]["documents"] - for hit in hits: - yield hit - - def settings(self) -> None: - ts = self._ts_client try: - ts.collections[self._index_name].retrieve() + self._collections[self._index_name].delete() except typesense.exceptions.ObjectNotFound: - client = self._ts_client - # To allow rolling updates, we work with index aliases - aliased_index_name = self._get_next_aliased_index_name() - # index_name / collection_name is part of the schema defined in - # self._index_config - index_config = self._index_config - index_config.update( - { - "name": aliased_index_name, - } + _logger.debug( + "Index %s do not exist, no need to clear it" % self._index_name ) - _logger.info(f"Create aliased_index_name '{aliased_index_name}'...") - client.collections.create(index_config) - _logger.info( - f"Set collection alias '{self._index_name}' >> aliased_index_name " - f"'{aliased_index_name}'." - ) - client.aliases.upsert( - self._index_name, {"collection_name": aliased_index_name} - ) - - def _get_current_aliased_index_name(self) -> str: - """Get the current aliased index name if any""" - current_aliased_index_name = None - alias = self._ts_client.aliases[self._index_name].retrieve() - if "collection_name" in alias: - current_aliased_index_name = alias["collection_name"] - return current_aliased_index_name - - def _get_next_aliased_index_name( - self, aliased_index_name: str | None = None - ) -> str: - """Get the next aliased index name - - The next aliased index name is based on the current aliased index name. - It's the current aliased index name incremented by 1. + self.settings() - :param aliased_index_name: the current aliased index name - :return: the next aliased index name + def each(self, fetch_fields=None) -> Iterator[dict[str, Any]]: + params = {"per_page": 250, "q": "*", "page": 1} + if fetch_fields: + params["include_fields"] = fetch_fields + res = self._collections[self._index_name].documents.search(params) + while True: + for hit in res["hits"]: + try: + hit["document"]["id"] = int(hit["document"]["id"]) + except ValueError: + _logger.warning( + "Fail to convert id %s into an integer" % hit["document"]["id"] + ) + # In that case there is something wrong + # normally we should only have integer + # let's the resynchronize mecanism fix it + yield hit["document"] + if len(res["hits"]) < 250: + break + params["page"] += 1 + res = self._collections[self._index_name].documents.search(params) + + def _prepare_params_for_new_config(self, new_config, current_config): + """We choose to have a simple implementation of update of the configuration + Typesense have a great UI https://github.com/bfritscher/typesense-dashboard + So the best is to manage advanced config their. + So we only support adding new field. No remove, no update + if you want to do it you can inherit this method """ - next_version = 1 - if aliased_index_name: - next_version = int(aliased_index_name.split("-")[-1]) + 1 - return f"{self._index_name}-{next_version}" + existing_fields = {field["name"] for field in current_config["fields"]} + fields_to_add = [ + field + for field in new_config["fields"] + if field["name"] not in existing_fields + ] + if fields_to_add: + return {"fields": fields_to_add} + else: + return {} - def reindex(self) -> None: - """Reindex records according to the current config - This method is useful to allows a rolling update of index - configuration. - This process is based on the following steps: - 1. export data from current aliased index - 2. create a new index (collection) with the current config - 3. import data into new aliased index (collection) - 4. Update the index alias to point to the new aliased index (collection) - 5. Drop the old index. - """ - client = self._ts_client - current_aliased_index_name = self._get_current_aliased_index_name() - data = client.collections[current_aliased_index_name].documents.export() - next_aliased_index_name = self._get_next_aliased_index_name( - current_aliased_index_name - ) + def settings(self) -> None: + config = self.index_record.config_id.body try: - client.collections[next_aliased_index_name].retrieve() + res = self._collections[self._index_name].retrieve() except typesense.exceptions.ObjectNotFound: - # To allow rolling updates, we work with index aliases - # index_name / collection_name is part of the schema defined - # in self._index_config - _logger.info( - f"Create new_aliased_index_name '{next_aliased_index_name}'..." - ) - index_config = self._index_config - index_config.update( - { - "name": next_aliased_index_name, - } - ) - client.collections.create(index_config) - _logger.info( - f"Import existing data into new_aliased_index_name " - f"'{next_aliased_index_name}'..." - ) - client.collections[next_aliased_index_name].documents.import_( - data.encode("utf-8"), {"action": "create"} - ) - - try: - client.collections[next_aliased_index_name].retrieve() - except typesense.exceptions.ObjectNotFound as e: - _logger.warning( - f"New aliased_index_name not found, skip updating alias and " - f"not removing old index (collection)!\n\n{e}" - ) - else: - _logger.info( - f"Set collection alias '{self._index_name}' >> " - f"new_aliased_index_name '{next_aliased_index_name}'." - ) - client.aliases.upsert( - self._index_name, {"collection_name": next_aliased_index_name} - ) - _logger.info( - f"Remove old aliased index (collection) " - f"'{current_aliased_index_name}'." - ) - client.collections[current_aliased_index_name].delete() - + config["name"] = self._index_name + self._collections.create(config) else: - _logger.warning( - f"next_aliased_index_name '{next_aliased_index_name}' " - f"already exists, skip!", - self._index_name, + config = self._prepare_params_for_new_config(config, res) + if config: + self._collections[self._index_name].update(config) + + def reindex(self) -> None: + raise UserError( + _( + "Reindexing is not needed with TypeSense, as schema can be updated. " + "So you just need to export the setting after changing them" ) + ) diff --git a/requirements.txt b/requirements.txt index b0a37f9c..0de4f22e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,6 @@ elasticsearch>=7.0.0,<=7.13.4 pydantic requests -typesense==1.0.3 +typesense>=1.1.0 typing-extensions unidecode