https://github.com/globus/searchable-files-demo
Searchable Files; a demo application using Globus Search
https://github.com/globus/searchable-files-demo
Last synced: 6 months ago
JSON representation
Searchable Files; a demo application using Globus Search
- Host: GitHub
- URL: https://github.com/globus/searchable-files-demo
- Owner: globus
- License: apache-2.0
- Created: 2021-04-30T20:59:19.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2026-01-19T18:59:47.000Z (6 months ago)
- Last Synced: 2026-01-20T00:54:27.530Z (6 months ago)
- Language: Python
- Size: 637 KB
- Stars: 5
- Watchers: 1
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: COPYING
Awesome Lists containing this project
README
# Searchable Files (demo)
This demo application shows how Globus Search can be used to build an index of
file metadata. Similar to the unix `find` command, it lets you search for files
in a directory.
Unlike `find`, however, the user searching the files does not need shell access
to the server where files are stored.
## Companion Doc
Globus provides a
[companion doc](https://docs.globus.org/api/search/guides/searchable_files/)
which expands upon the content in this demo.
The doc covers some of the motivation and background for this app, as well as
some ideas about ways in which the demo can be adapted or extended.
## Architecture
The demo app is broken up into four main components:
- the **Extractor** (`src/searchable_files/extractor.py`)
Parses file metadata and contents into chunks, and formats that data into JSON
files.
By default, this parses content in `data/files` and outputs to
`output/extracted/`.
- the **Assembler** (`src/searchable_files/assembler.py`)
Combines the output of the Extractor with visibility information
to produce ingest documents for Globus Search. An ingest document is data
formatted for submission to Globus Search, containing searchable data and
visibility information for who is allowed to search on and view different parts
of the data.
The visibility information and additional annotations used to augment the data from
the Extractor is loaded from configuration, located by default in
`data/config/assembler.yaml`.
By default, the Assembler reads data from `output/extracted/` and outputs to
`output/assembled/`.
- the **Submitter** (`src/searchable_files/submit.py`)
The Submitter sends ingest documents to the Search service.
By default, the Submitter reads data from `output/assembled/` and writes
information to `output/task_submit/`.
- the **Watcher** (`src/searchable_files/watcher.py`)
The Watcher monitors tasks in Globus Search and waits for completion or failure.
By default, the Watcher reads task IDs from `output/task_submit/` and outputs to
standard output the number of passing and failing
tasks (or only success if no tasks fail).
## Prerequisites
The following software is required in order to install and run the
Searchable Files app:
- python3.6+
- virtualenv
- pip
- make
## Download
To grab the latest version of the app, clone this repo or download it from
GitHub.
- [download searchable-files-demo-main.zip](https://github.com/globus/searchable-files-demo/archive/refs/heads/main.zip)
- [download searchable-files-demo-main.tar.gz](https://github.com/globus/searchable-files-demo/archive/refs/heads/main.tar.gz)
## Installation
Run
make install
This will create a virtualenv and install the necessary dependencies.
It will also create a script named `searchable-files`.
> **WARNING**: Always run `searchable-files` from the top level of the
> repository, unless you pass additional options. The script's defaults are all
> written as relative paths with respect to this directory.
### Setup
Before running other steps, run
./searchable-files create-index
This will create a new index for you to use with the Searchable Files demo app.
Its index ID will be stored by default in `data/index_info.json`.
To retrieve the index ID and other index information, run
./searchable-files show-index
### Running the Workflow
Each component of the Searchable Files app is run with a separate
subcommand. Each supports a `--help` option for full details on its
usage.
./searchable-files extract --help
./searchable-files assemble --help
./searchable-files submit --help
./searchable-files watch --help
The order of these commands matters, as each command's output is the input to
the next command.
The entire workflow can run in one line by simply running each command
back-to-back, thusly:
./searchable-files extract && ./searchable-files assemble && ./searchable-files submit && ./searchable-files watch
### Querying Results
The Searchable Files demo app includes a query command which you can use to
search your files. Search results will be output in the JSON format produced by
the Globus Search service.
See
./searchable-files query --help
for more details.
You can filter your search results. For example
./searchable-files query "foo" --types-or=text,png
will submit a query which matches `"foo"` and requires that the files matched
have either the `txt` or `png` type.
./searchable-files query "foo" --types=text,non-executable
will filter results to text files that are not executable.
#### Making Unauthenticated Queries
By default, queries are submitted as the logged-in user.
The query command supports a `--no-auth` flag, which will submit the
query without any credentials.
Unauthenticated queries return only results for which which the `visible_to`
field is set to `public`.
Using the example data, you should see a different result set between
./searchable-files query '*' --extensions=sh
and
./searchable-files query '*' --extensions=sh --no-auth
#### Dumping the Query
If you want to inspect the query which the `searchable-files` command
is generating instead of submitting the query, you can use
`--dump-query` to write the query to standard out, as in
./searchable-files query "foo" --types=tar --dump-query
### Logout
When you are done with the demo, you can log out with
./searchable-files logout
Please note that this will not delete your index. The index will still be available
and searchable.
## Next Steps
For a fully featured Globus Search client, you may want to install and explore the
[`globus-search-cli`](https://globus-search-cli.readthedocs.io/en/latest/overview.html).
You can also write your own python clients against the Search service by
using the
[`SearchClient` class from the Globus SDK](https://globus-sdk-python.readthedocs.io/en/stable/clients/search.html).
The full [Globus Search documentation](https://docs.globus.org/api/search/) offers a
great deal more detail about the service and reference documentation for all of
its supported methods and features.
### Customizing and Extending Searchable Files
This demo application is intentionally segmented into parts which you can
customize or replace to meet your needs.
#### Setup
The `login` and `create-index` commands create and store data in local files.
If you wish to use an alternative index ID, use the `set-index` command.
> [!NOTE]
> Explicitly running `login` is optional. The application will automatically
> log you in if you are not logged in.
#### Extractor
The Extractor examines a source for raw metadata and pulls out features which
it recognizes. In the simplest case, just pass the `--directory` option to read
a different source directory with the existing extractor. This can be run on
any directory without any special considerations.
#### Assembler
The Assembler takes the raw data from the Extractor and annotates it with
additional information from a secondary source. In the provided Assembler,
annotations are stored in some simple YAML files, but annotations could just as
easily come from a database, external API calls, or any other source.
A replacement Assembler still needs to incorporate that information with the
Extractor's data to produce valid documents for Globus Search. Note that the
Assembler included in the Searchable Files demo has special handling for the
string `"{current_user}"` in order to resolve this to the logged-in user's
primary identity ID. A custom Assembler could replicate this functionality
(requiring login) or omit support for this usage.
#### Submitter and Watcher
The Submitter and Watcher can be applied to any directory full of Globus Search
ingest documents (the format of data produced by the Assembler). Although you
may want to modify them to alter their outputs, combine them into a single
command, or make other minor changes, their main logic should probably be
left unmodified.
The only special consideration when modifying these components is that these
commands use the Index ID retrieved from `create-index`. If modifying or
replacing these commands, it may be necessary to replace the logic that
loads the `index_id` from storage.