diff --git a/.github/workflows/elasticsearch-image-builder.yml b/.github/workflows/elasticsearch-image-builder.yml new file mode 100644 index 00000000..6e04cce8 --- /dev/null +++ b/.github/workflows/elasticsearch-image-builder.yml @@ -0,0 +1,25 @@ +# name: Build Docker Images +# on: +# push: +# paths: +# - "images/elasticsearch/**" +# - ".github/workflows/**" +# jobs: +# build: +# if: github.ref == 'refs/heads/master' && needs.unit-tests.result == 'success' +# runs-on: ubuntu-22.04 +# strategy: +# matrix: +# elastic-version: +# - "7.17.15" +# env: +# DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} +# DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} +# steps: +# - uses: actions/checkout@v2 +# with: +# fetch-depth: 100 +# - name: "Build elasticsearch@${{ matrix.elastic-version }}" +# run: | +# cd images/elasticsearch/${{ matrix.elastic-version }} +# curl "https://raw.githubusercontent.com/pelias/ci-tools/master/build-docker-images.sh" | bash - diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2ba19099 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +projects/*/data +.DS_Store +node_modules +package-lock.json diff --git a/README.md b/README.md index fd4b1141..b2c50a0f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,30 @@ +

+ +

+

A modular, open-source search engine for our world.

+

Pelias is a geocoder powered completely by open data, available freely to everyone.

+

+ + + +

+

+ Local Installation · + Cloud Webservice · + Documentation · + Community Chat +

+
+What is Pelias? +
+Pelias is a search engine for places worldwide, powered by open data. It turns addresses and place names into geographic coordinates, and turns geographic coordinates into places and addresses. With Pelias, you’re able to turn your users’ place searches into actionable geodata and transform your geodata into real places. +

+We think open data, open source, and open strategy win over proprietary solutions at any part of the stack and we want to ensure the services we offer are in line with that vision. We believe that an open geocoder improves over the long-term only if the community can incorporate truly representative local knowledge. +
# Pelias in Docker -This repository contains a framework for downloading/preparing and building the [Pelias Geocoder](https://github.com/pelias/pelias) using Docker and [Docker Compose](https://github.com/docker/compose#docker-compose). +This repository contains a framework for downloading/preparing and building the [Pelias Geocoder](https://github.com/pelias/pelias) using Docker and [Docker Compose](https://github.com/docker/compose#docker-compose-v2). ## Projects @@ -13,10 +36,21 @@ Once you have successfully completed a small build you can use this as a base to ## Prerequisites -You will need to have a [modern version of `docker`](https://docs.docker.com/engine/release-notes/) and a [modern version of `docker-compose`](https://github.com/docker/compose/blob/master/CHANGELOG.md) installed before continuing. If you are not using the latest version, please mention that in any bugs reports. +You will need to have a [modern version of `docker`](https://docs.docker.com/engine/release-notes/) and a [modern version of `docker compose`](https://github.com/docker/compose/releases) installed before continuing. If you are not using the latest version, please mention that in any bugs reports. This project supports Linux and Mac OSX operatings systems. Windows is currently [not supported](https://github.com/pelias/docker/issues/124). +### Permissions + +In order to ensure security, Pelias docker containers, and the `pelias` helper script, will not run as a root user! + +Be sure you are running as a non-root user and that this user can execute `docker` commands. See the Docker documentation article [Manage Docker as a non-root user](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user) to do this. + +## Requirements for Linux +- Install `util-linux` using your distribution's package manager + - Alpine Linux: `sudo apk add util-linux` + - Debian/Ubuntu: `sudo apt-get install util-linux` + ## Requirements for Mac OSX - install GNU coreutils with [Homebrew](https://brew.sh/): `brew install coreutils`. - Max-out Docker computing resources( `Memory-RAM and CPUs-Cores` ) dedicated to Docker in `Docker > Preferences > Advanced`. @@ -27,36 +61,45 @@ Scripts can easily download tens of GB of geographic data, so ensure you have en At least 8GB RAM is required. +## How long will it take? + +You should be able to get started with the default Portland-metro area build in under an hour with a fast internet connection. + +On a machine with ~32 CPU cores, a full planet build can be done in under a day with the right settings. + +The interpolation build (`pelias prepare interpolation`), which is [single threaded](https://github.com/pelias/interpolation/issues/264) will take 6+ days +for the full planet. We generally recommend skipping it when you are first +getting started. + +For more info on time estimates and hardware requirements for large build see our [full planet considerations](https://github.com/pelias/documentation/blob/master/full_planet_considerations.md) documentation. + ## Quickstart build script The following shell script can be used to quickly get started with a Pelias build. -Feel free to modify the code and data locations to suit your needs. - ```bash #!/bin/bash set -x -# create directories -mkdir /code /data - -# set proper permissions. make sure the user matches your `DOCKER_USER` setting in `.env` -chown 1000:1000 /code /data +# change directory to the where you would like to install Pelias +# cd /path/to/install -# clone repo -cd /code -git clone https://github.com/pelias/docker.git -cd docker +# clone this repository +git clone https://github.com/pelias/docker.git && cd docker # install pelias script -ln -s "$(pwd)/pelias" /usr/local/bin/pelias +# this is the _only_ setup command that should require `sudo` +sudo ln -s "$(pwd)/pelias" /usr/local/bin/pelias -# cwd +# cd into the project directory cd projects/portland-metro -# configure environment +# create a directory to store Pelias data files +# see: https://github.com/pelias/docker#variable-data_dir +# note: use 'gsed' instead of 'sed' on a Mac +mkdir ./data sed -i '/DATA_DIR/d' .env -echo 'DATA_DIR=/data' >> .env +echo 'DATA_DIR=./data' >> .env # run build pelias compose pull @@ -72,7 +115,6 @@ pelias compose up pelias test run ``` - ## Installing the Pelias helper script This repository makes use of a helper script to make basic management of the Pelias Docker images easy. @@ -84,8 +126,14 @@ You can find the `pelias` file in the root of this repository. Advanced users may have a preference how this is done on their system, but a basic example would be to do something like: ```bash -git clone https://github.com/pelias/docker.git ~/pelias -ln -s ~/pelias/pelias /usr/local/bin/pelias +# change directory to the where you would like to install Pelias +# cd /path/to/install + +# clone this repository +git clone https://github.com/pelias/docker.git && cd docker + +# install pelias script +sudo ln -s "$(pwd)/pelias" /usr/local/bin/pelias ``` Once the command is correctly installed you should be able to run the following command to confirm the pelias command is available on your path: @@ -135,7 +183,6 @@ Then use your text editor to modify the `.env` file to reflect your new path, it ```bash COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias -DOCKER_USER=1000 ``` You can then list the environment variables to ensure they have been correctly set: @@ -152,9 +199,7 @@ Note: changing the `COMPOSE_PROJECT_NAME` variable is not advisable unless you k ### Variable: DOCKER_USER -All processes in Pelias containers are run as non-root users. By default, the UID of the processes will be `1000`, which is the first user ID on _most_ Linux systems and is likely to be a good option. However, if restricting file permissions in your data directory to a different user or group is important, this can be overridden by setting the `DOCKER_USER` variable. - -This variable can take just a UID or a UID:GID combination such as `1000:1000`. See the [docker-compose](https://docs.docker.com/compose/compose-file/#domainname-hostname-ipc-mac_address-privileged-read_only-shm_size-stdin_open-tty-user-working_dir) and [docker run](https://docs.docker.com/engine/reference/run/#user) documentation on controlling Docker container users for more information. +This variable is no longer used, and will be ignored. If you still have it in your `.env` file, you can safely remove it. ## CLI commands @@ -169,11 +214,11 @@ Usage: pelias [command] [action] [options] compose logs display container logs compose ps list containers compose top display the running processes of a container - compose exec execute an arbitrary docker-compose command - compose run execute a docker-compose run command - compose up start one or more docker-compose service(s) - compose kill kill one or more docker-compose service(s) - compose down stop all docker-compose service(s) + compose exec execute an arbitrary docker compose command + compose run execute a docker compose run command + compose up start one or more docker compose service(s) + compose kill kill one or more docker compose service(s) + compose down stop all docker compose service(s) download wof (re)download whosonfirst data download oa (re)download openaddresses data download osm (re)download openstreetmap data @@ -193,6 +238,7 @@ Usage: pelias [command] [action] [options] import osm (re)import openstreetmap data import polylines (re)import polylines data import transit (re)import transit data + import csv (re)import csv data import all (re)import all data prepare polylines export road network from openstreetmap into polylines format prepare interpolation build interpolation sqlite databases @@ -205,20 +251,20 @@ Usage: pelias [command] [action] [options] ### Compose commands -The compose commands are available as a shortcut to running `docker-compose` directly, they will also ensure that your environment is correctly configured. +The compose commands are available as a shortcut to running `docker compose` directly, they will also ensure that your environment is correctly configured. -See the docker-compose documentation for more info: https://docs.docker.com/compose/overview/ +See the docker compose documentation for more info: https://docs.docker.com/compose/overview/ ```bash pelias compose pull update all docker images pelias compose logs display container logs pelias compose ps list containers pelias compose top display the running processes of a container -pelias compose exec execute an arbitrary docker-compose command -pelias compose run execute a docker-compose run command -pelias compose up start one or more docker-compose service(s) -pelias compose kill kill one or more docker-compose service(s) -pelias compose down stop all docker-compose service(s) +pelias compose exec execute an arbitrary docker compose command +pelias compose run execute a docker compose run command +pelias compose up start one or more docker compose service(s) +pelias compose kill kill one or more docker compose service(s) +pelias compose down stop all docker compose service(s) ``` ### Download commands @@ -360,3 +406,7 @@ Once all the importers have completed and the Pelias services are running, you c ### Interpolation - http://localhost:4300/demo/#13/45.5465/-122.6351 + +### Libpostal + +- http://localhost:4400/parse?address=1730+ne+26th+ave,+portland,+or diff --git a/cmd/compose.js b/cmd/compose.js new file mode 100644 index 00000000..cdb17e91 --- /dev/null +++ b/cmd/compose.js @@ -0,0 +1,8 @@ +module.exports = { + command: 'compose ', + describe: 'shortcuts to running docker compose directly', + builder: (yargs) => yargs + .commandDir('compose') + .usage('$0 [args]') + .demandCommand(1, '') +} diff --git a/cmd/compose/down.js b/cmd/compose/down.js new file mode 100644 index 00000000..4157dab3 --- /dev/null +++ b/cmd/compose/down.js @@ -0,0 +1,10 @@ +const child = require('child_process') +const options = { stdio: 'inherit' } + +module.exports = { + command: 'down', + describe: 'stop all docker-compose service(s)', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), ['down'], options) + } +} diff --git a/cmd/compose/exec.js b/cmd/compose/exec.js new file mode 100644 index 00000000..3ea139d9 --- /dev/null +++ b/cmd/compose/exec.js @@ -0,0 +1,10 @@ +const child = require('child_process') +const options = { stdio: 'inherit', shell:true } + +module.exports = { + command: 'exec', + describe: 'execute an arbitrary docker-compose command', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), argv._.slice(1), options) + } +} diff --git a/cmd/compose/kill.js b/cmd/compose/kill.js new file mode 100644 index 00000000..60f836cb --- /dev/null +++ b/cmd/compose/kill.js @@ -0,0 +1,10 @@ +const child = require('child_process') +const options = { stdio: 'inherit' } + +module.exports = { + command: 'kill', + describe: 'kill one or more docker-compose service(s)', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), argv._.slice(1), options) + } +} diff --git a/cmd/compose/logs.js b/cmd/compose/logs.js new file mode 100644 index 00000000..736105ad --- /dev/null +++ b/cmd/compose/logs.js @@ -0,0 +1,11 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const options = { stdio: 'inherit' , shell: true} + +module.exports = { + command: 'logs', + describe: 'display container logs', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), argv._.slice(1), options) + } +} diff --git a/cmd/compose/oldOrNewCompose.js b/cmd/compose/oldOrNewCompose.js new file mode 100644 index 00000000..7fdf9ed4 --- /dev/null +++ b/cmd/compose/oldOrNewCompose.js @@ -0,0 +1,10 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const options = { stdio: 'ignore', shell:true } + +module.exports = function oldOrNewCompose(){ + if(child.spawnSync('docker compose version', options).status==0){ + return 'docker compose'; + } + return 'docker-compose' +} \ No newline at end of file diff --git a/cmd/compose/ps.js b/cmd/compose/ps.js new file mode 100644 index 00000000..b7fb39a0 --- /dev/null +++ b/cmd/compose/ps.js @@ -0,0 +1,11 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const options = { stdio: 'inherit' , shell: true} + +module.exports = { + command: 'ps', + describe: 'list containers', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), argv._.slice(1), options) + } +} \ No newline at end of file diff --git a/cmd/compose/pull.js b/cmd/compose/pull.js new file mode 100644 index 00000000..33052d8e --- /dev/null +++ b/cmd/compose/pull.js @@ -0,0 +1,11 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const options = { stdio: 'inherit' , shell: true} + +module.exports = { + command: 'pull', + describe: 'update all docker images', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), ['pull'], options) + } +} diff --git a/cmd/compose/run.js b/cmd/compose/run.js new file mode 100644 index 00000000..327d9a1b --- /dev/null +++ b/cmd/compose/run.js @@ -0,0 +1,18 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const env = require('../../lib/env')() +const options = { stdio: 'inherit' , shell: true} + +function net_init() { + const net = `${env.COMPOSE_PROJECT_NAME}_default` + child.spawnSync('docker', ['network', 'create', net], { stdio: 'ignore' }) +} + +module.exports = { + command: 'run', + describe: 'execute a docker-compose run command', + handler: (argv) => { + net_init() + child.spawnSync(oldOrNewCompose(), ['run', '--rm', ...argv._.slice(2)], options) + } +} diff --git a/cmd/compose/top.js b/cmd/compose/top.js new file mode 100644 index 00000000..a5184984 --- /dev/null +++ b/cmd/compose/top.js @@ -0,0 +1,11 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const options = { stdio: 'inherit' , shell: true} + +module.exports = { + command: 'top', + describe: 'display the running processes of a container', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), argv._.slice(1), options) + } +} diff --git a/cmd/compose/up.js b/cmd/compose/up.js new file mode 100644 index 00000000..1b6447a8 --- /dev/null +++ b/cmd/compose/up.js @@ -0,0 +1,11 @@ +const child = require('child_process') +const oldOrNewCompose = require('./oldOrNewCompose') +const options = { stdio: 'inherit', shell:true } + +module.exports = { + command: 'up', + describe: 'start one or more docker compose service(s)', + handler: (argv) => { + child.spawnSync(oldOrNewCompose(), ['up', '-d', ...argv._.slice(2)], options) + } +} diff --git a/cmd/docker.sh b/cmd/docker.sh deleted file mode 100644 index 83cc4c6e..00000000 --- a/cmd/docker.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -set -e; - -function net_init(){ - docker network create ${COMPOSE_PROJECT_NAME}_default &>/dev/null || true -} - -function compose_pull(){ compose_exec pull; } -register 'compose' 'pull' 'update all docker images' compose_pull - -function compose_logs(){ compose_exec logs $@; } -register 'compose' 'logs' 'display container logs' compose_logs - -function compose_ps(){ compose_exec ps $@; } -register 'compose' 'ps' 'list containers' compose_ps - -function compose_top(){ compose_exec top $@; } -register 'compose' 'top' 'display the running processes of a container' compose_top - -function compose_exec(){ docker-compose $@; } -register 'compose' 'exec' 'execute an arbitrary docker-compose command' compose_exec - -function compose_run(){ net_init; docker-compose run --rm $@; } -register 'compose' 'run' 'execute a docker-compose run command' compose_run - -function compose_up(){ docker-compose up -d $@; } -register 'compose' 'up' 'start one or more docker-compose service(s)' compose_up - -function compose_kill(){ docker-compose kill $@; } -register 'compose' 'kill' 'kill one or more docker-compose service(s)' compose_kill - -function compose_down(){ docker-compose down; } -register 'compose' 'down' 'stop all docker-compose service(s)' compose_down - diff --git a/cmd/download.js b/cmd/download.js new file mode 100644 index 00000000..419d980c --- /dev/null +++ b/cmd/download.js @@ -0,0 +1,8 @@ +module.exports = { + command: 'download ', + describe: 'fetch and update geographic data from source', + builder: (yargs) => yargs + .commandDir('download') + .usage('$0 [args]') + .demandCommand(1, '') +} diff --git a/cmd/download.sh b/cmd/download.sh deleted file mode 100644 index e16c30d1..00000000 --- a/cmd/download.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -set -e; - -# per-source downloads -function download_wof(){ compose_run 'whosonfirst' './bin/download'; } -function download_oa(){ compose_run 'openaddresses' './bin/download'; } -function download_osm(){ compose_run 'openstreetmap' './bin/download'; } -function download_geonames(){ compose_run 'geonames' './bin/download'; } -function download_tiger(){ compose_run 'interpolation' './bin/download-tiger'; } -function download_transit(){ compose_run 'transit' './bin/download'; } -function download_csv(){ compose_run 'csv-importer' './bin/download'; } - -register 'download' 'wof' '(re)download whosonfirst data' download_wof -register 'download' 'oa' '(re)download openaddresses data' download_oa -register 'download' 'osm' '(re)download openstreetmap data' download_osm -register 'download' 'geonames' '(re)download geonames data' download_geonames -register 'download' 'tiger' '(re)download TIGER data' download_tiger -register 'download' 'transit' '(re)download transit data' download_transit -register 'download' 'csv' '(re)download csv data' download_csv - -# download all the data to be used by imports -function download_all(){ - download_wof & - download_oa & - download_osm & - - if [[ "$ENABLE_GEONAMES" == "true" ]]; then - download_geonames & - fi - - download_tiger & - download_transit & - download_csv & - wait -} - -register 'download' 'all' '(re)download all data' download_all diff --git a/cmd/download/all.js b/cmd/download/all.js new file mode 100644 index 00000000..67762435 --- /dev/null +++ b/cmd/download/all.js @@ -0,0 +1,23 @@ +const env = require('../../lib/env')() + +module.exports = { + command: 'all', + describe: '(re)download all data', + handler: (argv) => { + + // @todo: make this parallel + // like it was with the bash script + + require('./wof').handler() + require('./oa').handler() + require('./osm').handler() + + if (env.ENABLE_GEONAMES === 'true'){ + require('./geonames').handler() + } + + require('./tiger').handler() + require('./transit').handler() + require('./csv').handler() + } +} diff --git a/cmd/download/csv.js b/cmd/download/csv.js new file mode 100644 index 00000000..21d58da0 --- /dev/null +++ b/cmd/download/csv.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'csv', + describe: '(re)download CSV data', + handler: (argv) => { + run({ _: ['compose', 'run', 'csv-importer', './bin/download'] }) + } +} diff --git a/cmd/download/geonames.js b/cmd/download/geonames.js new file mode 100644 index 00000000..70ddbfae --- /dev/null +++ b/cmd/download/geonames.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'geonames', + describe: '(re)download geonames data', + handler: (argv) => { + run({ _: ['compose', 'run', 'geonames', './bin/download'] }) + } +} diff --git a/cmd/download/oa.js b/cmd/download/oa.js new file mode 100644 index 00000000..90ae8036 --- /dev/null +++ b/cmd/download/oa.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'oa', + describe: '(re)download openaddresses data', + handler: (argv) => { + run({ _: ['compose', 'run', 'openaddresses', './bin/download'] }) + } +} diff --git a/cmd/download/osm.js b/cmd/download/osm.js new file mode 100644 index 00000000..bf2a911e --- /dev/null +++ b/cmd/download/osm.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'osm', + describe: '(re)download openstreetmap data', + handler: (argv) => { + run({ _: ['compose', 'run', 'openstreetmap', './bin/download'] }) + } +} diff --git a/cmd/download/tiger.js b/cmd/download/tiger.js new file mode 100644 index 00000000..f745363c --- /dev/null +++ b/cmd/download/tiger.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'tiger', + describe: '(re)download TIGER data', + handler: (argv) => { + run({ _: ['compose', 'run', 'interpolation', './bin/download-tiger'] }) + } +} diff --git a/cmd/download/transit.js b/cmd/download/transit.js new file mode 100644 index 00000000..41a29486 --- /dev/null +++ b/cmd/download/transit.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'transit', + describe: '(re)download transit data', + handler: (argv) => { + run({ _: ['compose', 'run', 'transit', './bin/download'] }) + } +} diff --git a/cmd/download/wof.js b/cmd/download/wof.js new file mode 100644 index 00000000..4f7499dd --- /dev/null +++ b/cmd/download/wof.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'wof', + describe: '(re)download whosonfirst data', + handler: (argv) => { + run({ _: ['compose', 'run', 'whosonfirst', './bin/download'] }) + } +} diff --git a/cmd/elastic.js b/cmd/elastic.js new file mode 100644 index 00000000..098e1d18 --- /dev/null +++ b/cmd/elastic.js @@ -0,0 +1,8 @@ +module.exports = { + command: 'elastic ', + describe: 'interact with the elastic database', + builder: (yargs) => yargs + .commandDir('elastic') + .usage('$0 [args]') + .demandCommand(1, '') +} diff --git a/cmd/elastic.sh b/cmd/elastic.sh deleted file mode 100644 index 701c19c9..00000000 --- a/cmd/elastic.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash -set -e; - -function elastic_schema_drop(){ compose_run 'schema' node scripts/drop_index "$@" || true; } -function elastic_schema_create(){ compose_run 'schema' ./bin/create_index; } -function elastic_start(){ - mkdir -p $DATA_DIR/elasticsearch - # attemp to set proper permissions if running as root - chown $DOCKER_USER $DATA_DIR/elasticsearch 2>/dev/null || true - compose_exec up -d elasticsearch -} - -function elastic_stop(){ compose_exec kill elasticsearch; } - -register 'elastic' 'drop' 'delete elasticsearch index & all data' elastic_schema_drop -register 'elastic' 'create' 'create elasticsearch index with pelias mapping' elastic_schema_create -register 'elastic' 'start' 'start elasticsearch server' elastic_start -register 'elastic' 'stop' 'stop elasticsearch server' elastic_stop - -# to use this function: -# if test $(elastic_status) -ne 200; then -function elastic_status(){ - curl \ - --output /dev/null \ - --silent \ - --write-out "%{http_code}" \ - "http://${ELASTIC_HOST:-localhost:9200}/_cluster/health?wait_for_status=yellow&timeout=1s" \ - || true; -} - -# the same function but with a trailing newline -function elastic_status_newline(){ echo $(elastic_status); } -register 'elastic' 'status' 'HTTP status code of the elasticsearch service' elastic_status_newline - -function elastic_wait(){ - echo 'waiting for elasticsearch service to come up'; - retry_count=30 - - i=1 - while [[ "$i" -le "$retry_count" ]]; do - if [[ $(elastic_status) -eq 200 ]]; then - echo "Elasticsearch up!" - exit 0 - elif [[ $(elastic_status) -eq 408 ]]; then - # 408 indicates the server is up but not yet yellow status - printf ":" - else - printf "." - fi - sleep 1 - i=$(($i + 1)) - done - - echo -e "\n" - echo "Elasticsearch did not come up, check configuration" - exit 1 -} - -register 'elastic' 'wait' 'wait for elasticsearch to start up' elastic_wait - -function elastic_info(){ curl -s "http://${ELASTIC_HOST:-localhost:9200}/"; } -register 'elastic' 'info' 'display elasticsearch version and build info' elastic_info - -function elastic_stats(){ - curl -s "http://${ELASTIC_HOST:-localhost:9200}/pelias/_search?request_cache=true&timeout=10s&pretty=true" \ - -H 'Content-Type: application/json' \ - -d '{ - "aggs": { - "sources": { - "terms": { - "field": "source", - "size": 100 - }, - "aggs": { - "layers": { - "terms": { - "field": "layer", - "size": 100 - } - } - } - } - }, - "size": 0 - }'; -} -register 'elastic' 'stats' 'display a summary of doc counts per source/layer' elastic_stats diff --git a/cmd/elastic/create.js b/cmd/elastic/create.js new file mode 100644 index 00000000..02b7690b --- /dev/null +++ b/cmd/elastic/create.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'create', + describe: 'create elasticsearch index with pelias mapping', + handler: () => { + run({ _: ['compose', 'run', 'schema', './bin/create_index'] }) + } +} \ No newline at end of file diff --git a/cmd/elastic/drop.js b/cmd/elastic/drop.js new file mode 100644 index 00000000..be6ca9ef --- /dev/null +++ b/cmd/elastic/drop.js @@ -0,0 +1,11 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'drop', + describe: 'delete elasticsearch index & all data', + handler: (argv) => { + console.debug(argv) + if(argv.f || argv.forceYes) + run({ _: ['compose', 'run', 'schema', 'node scripts/drop_index', '-f'] }) + } +} \ No newline at end of file diff --git a/cmd/elastic/info.js b/cmd/elastic/info.js new file mode 100644 index 00000000..989073f0 --- /dev/null +++ b/cmd/elastic/info.js @@ -0,0 +1,31 @@ +const http = require('http'); +const options = { + hostname: process.env.ELASTIC_HOST || 'localhost', + port: 9200, + path: '/', + method: 'GET' +}; +module.exports = { + command: 'info', + describe: 'display elasticsearch version and build info', + handler: () => { + const req = http.request(options, (res) => { + let body = ''; + + res.on('data', (chunk) => { + body += chunk; + }); + + res.on('end', () => { + console.log(body); + }); + + }); + req.on('error', (e) => { + //Differs from bash implementation. There a timeout would be silently ignored + console.error(`Problem with request: ${e.message}`); + }); + + req.end(); + } +}; \ No newline at end of file diff --git a/cmd/elastic/stats.js b/cmd/elastic/stats.js new file mode 100644 index 00000000..e96cb20e --- /dev/null +++ b/cmd/elastic/stats.js @@ -0,0 +1,60 @@ +const http = require('http'); + +const options = { + hostname: process.env.ELASTIC_HOST || 'localhost', + port: 9200, + path: `/${process.env.ELASTIC_INDEX || 'pelias'}/_search?request_cache=true&timeout=10s&pretty=true`, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, +}; + + +const data = JSON.stringify({ + aggs: { + sources: { + terms: { + field: 'source', + size: 100, + }, + aggs: { + layers: { + terms: { + field: 'layer', + size: 100, + }, + }, + }, + }, + }, + size: 0, +}); + + +module.exports = { + command: 'stats', + describe: 'display a summary of doc counts per source/layer', + handler: () => { + const req = http.request(options, (res) => { + let body = ''; + + res.on('data', (chunk) => { + body += chunk; + }); + + res.on('end', () => { + console.log(body); + }); + }); + + req.on('error', (e) => { + //Differs from bash implementation. There a timeout would be silently ignored + console.error(`Problem with request: ${e.message}`); + }); + + req.write(data); + + req.end(); + } +} diff --git a/cmd/elastic/status.js b/cmd/elastic/status.js new file mode 100644 index 00000000..02e9b3f0 --- /dev/null +++ b/cmd/elastic/status.js @@ -0,0 +1,17 @@ +const status_helper = require('./status_helper') + +module.exports = { + command: 'status', + describe: 'HTTP status code of the elasticsearch service', + handler: async () => { + let status = await status_helper.getStatus() + switch (status) { + case 200: + console.log("200"); + break; + default: + console.error(status.statusCode); + break; + } + } +} diff --git a/cmd/elastic/status_helper.js b/cmd/elastic/status_helper.js new file mode 100644 index 00000000..bdbf84de --- /dev/null +++ b/cmd/elastic/status_helper.js @@ -0,0 +1,32 @@ +const http = require('http'); +const options = { + //TODO: Allow custom values via System variable + host: 'localhost', + port: 9200, + path: '_cluster/health?wait_for_status=yellow&timeout=1s', + method: 'GET', + timeout: 1000 +}; +module.exports = { getStatus }; + +async function getStatus() { + return new Promise((resolve, reject) => { + const req = http.get(options, res => { + res.on('data', () => { }); + res.on('end', () => { + resolve({ "statusCode": res.statusCode }); + }); + }); + + req.on('error', (err) => { + //If we don't resolve the promise it will trigger the default help message from yargs + resolve({ "statusCode": '000' }); + }); + + req.on('timeout', () => { + req.destroy(); + //If we don't resolve the promise it will trigger the default help message from yargs + resolve({ "statusCode": '000' }); + }); + }); +} \ No newline at end of file diff --git a/cmd/elastic/wait.js b/cmd/elastic/wait.js new file mode 100644 index 00000000..77d34133 --- /dev/null +++ b/cmd/elastic/wait.js @@ -0,0 +1,31 @@ +const sleep = require('atomic-sleep'); +const status_helper = require('./status_helper') + +const retry_count = 30; + +module.exports = { + command: 'wait', + describe: 'wait for elasticsearch to start up', + handler: async () => { + console.log('waiting for elasticsearch service to come up'); + for (let i = 0; i < retry_count; i++) { + let status = await status_helper.getStatus(); + if (status.statusCode == 200) { + console.log('Elasticsearch up!'); + return; + } + //408 indicates the server is up but not yet yellow status + else if (status.statusCode === 408) { + //Use process.stdout to avoid a forced newline + process.stdout.write(':') + } + else { + process.stdout.write('.') + } + sleep(1000); + } + console.error("\nElasticsearch did not come up, check configuration"); + return; + + } +} \ No newline at end of file diff --git a/cmd/import.js b/cmd/import.js new file mode 100644 index 00000000..23101023 --- /dev/null +++ b/cmd/import.js @@ -0,0 +1,8 @@ +module.exports = { + command: 'import ', + describe: 'import source data into elasticsearch', + builder: (yargs) => yargs + .commandDir('import') + .usage('$0 [args]') + .demandCommand(1, '') +} diff --git a/cmd/import.sh b/cmd/import.sh deleted file mode 100644 index 0d5b93b0..00000000 --- a/cmd/import.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -set -e; - -# per-source imports -function import_wof(){ compose_run 'whosonfirst' './bin/start'; } -function import_oa(){ compose_run 'openaddresses' "./bin/parallel ${OPENADDRESSES_PARALLELISM:-1}"; } -function import_osm(){ compose_run 'openstreetmap' './bin/start'; } -function import_polylines(){ compose_run 'polylines' './bin/start'; } -function import_geonames(){ compose_run 'geonames' './bin/start'; } -function import_transit(){ compose_run 'transit' './bin/start'; } -function import_csv(){ compose_run 'csv-importer' './bin/start'; } - -register 'import' 'wof' '(re)import whosonfirst data' import_wof -register 'import' 'oa' '(re)import openaddresses data' import_oa -register 'import' 'osm' '(re)import openstreetmap data' import_osm -register 'import' 'polylines' '(re)import polylines data' import_polylines -register 'import' 'geonames' '(re)import geonames data' import_geonames -register 'import' 'transit' '(re)import transit data' import_transit -register 'import' 'csv' '(re)import csv data' import_csv - -# import all the data to be used by imports -# note: running importers in parallel can cause issues due to high CPU & RAM requirements. -function import_all(){ - import_wof - import_oa - import_osm - import_polylines - - if [[ "$ENABLE_GEONAMES" == "true" ]]; then - import_geonames - fi - - import_transit - import_csv -} - -register 'import' 'all' '(re)import all data' import_all diff --git a/cmd/import/all.js b/cmd/import/all.js new file mode 100644 index 00000000..7495a5cb --- /dev/null +++ b/cmd/import/all.js @@ -0,0 +1,20 @@ +const env = require('../../lib/env')() + +module.exports = { + command: 'all', + describe: '(re)import all data', + handler: (argv) => { + + require('./wof').handler() + require('./oa').handler() + require('./osm').handler() + require('./polylines').handler() + + if (env.ENABLE_GEONAMES === 'true'){ + require('./geonames').handler() + } + + require('./transit').handler() + require('./csv').handler() + } +} diff --git a/cmd/import/csv.js b/cmd/import/csv.js new file mode 100644 index 00000000..e58a7389 --- /dev/null +++ b/cmd/import/csv.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'csv', + describe: '(re)import CSV data', + handler: (argv) => { + run({ _: ['compose', 'run', 'csv-importer', './bin/start'] }) + } +} diff --git a/cmd/import/geonames.js b/cmd/import/geonames.js new file mode 100644 index 00000000..eca4a2e5 --- /dev/null +++ b/cmd/import/geonames.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'geonames', + describe: '(re)import geonames data', + handler: (argv) => { + run({ _: ['compose', 'run', 'geonames', './bin/start'] }) + } +} diff --git a/cmd/import/oa.js b/cmd/import/oa.js new file mode 100644 index 00000000..8ef52094 --- /dev/null +++ b/cmd/import/oa.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'oa', + describe: '(re)import openaddresses data', + handler: (argv) => { + run({ _: ['compose', 'run', 'openaddresses', './bin/start'] }) + } +} diff --git a/cmd/import/osm.js b/cmd/import/osm.js new file mode 100644 index 00000000..01a33faa --- /dev/null +++ b/cmd/import/osm.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'osm', + describe: '(re)import openstreetmap data', + handler: (argv) => { + run({ _: ['compose', 'run', 'openstreetmap', './bin/start'] }) + } +} diff --git a/cmd/import/polylines.js b/cmd/import/polylines.js new file mode 100644 index 00000000..f36208db --- /dev/null +++ b/cmd/import/polylines.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'polylines', + describe: '(re)import polylines data', + handler: (argv) => { + run({ _: ['compose', 'run', 'interpolation', './bin/start'] }) + } +} diff --git a/cmd/import/transit.js b/cmd/import/transit.js new file mode 100644 index 00000000..d687ba03 --- /dev/null +++ b/cmd/import/transit.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'transit', + describe: '(re)import transit data', + handler: (argv) => { + run({ _: ['compose', 'run', 'transit', './bin/start'] }) + } +} diff --git a/cmd/import/wof.js b/cmd/import/wof.js new file mode 100644 index 00000000..d3a78d8f --- /dev/null +++ b/cmd/import/wof.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'wof', + describe: '(re)import whosonfirst data', + handler: (argv) => { + run({ _: ['compose', 'run', 'whosonfirst', './bin/start'] }) + } +} diff --git a/cmd/prepare.js b/cmd/prepare.js new file mode 100644 index 00000000..fb33603c --- /dev/null +++ b/cmd/prepare.js @@ -0,0 +1,9 @@ +module.exports = { + command: 'prepare ', + describe: 'prepare source data before the import', + builder: (yargs) => yargs + .commandDir('prepare') + .usage('$0 [args]') + .demandCommand(1, '') + } + \ No newline at end of file diff --git a/cmd/prepare.sh b/cmd/prepare.sh deleted file mode 100644 index 5ac490e4..00000000 --- a/cmd/prepare.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -set -e; - -# per-source prepares -function prepare_polylines(){ compose_run 'polylines' bash ./docker_extract.sh; } -function prepare_interpolation(){ compose_run 'interpolation' bash ./docker_build.sh; } -function prepare_placeholder(){ - compose_run 'placeholder' ./cmd/extract.sh; - compose_run 'placeholder' ./cmd/build.sh; -} - -register 'prepare' 'polylines' 'export road network from openstreetmap into polylines format' prepare_polylines -register 'prepare' 'interpolation' 'build interpolation sqlite databases' prepare_interpolation -register 'prepare' 'placeholder' 'build placeholder sqlite databases' prepare_placeholder - -# prepare all the data to be used by imports -function prepare_all(){ - prepare_polylines & - prepare_placeholder & - wait - prepare_interpolation -} - -register 'prepare' 'all' 'build all services which have a prepare step' prepare_all diff --git a/cmd/prepare/all.js b/cmd/prepare/all.js new file mode 100644 index 00000000..8b09097c --- /dev/null +++ b/cmd/prepare/all.js @@ -0,0 +1,10 @@ + +module.exports = { + command: 'all', + describe: 'build all services which have a prepare step', + handler: () => { + require('./polylines').handler(); + require('./placeholder').handler(); + require('./interpolation').handler(); + } +} diff --git a/cmd/prepare/interpolation.js b/cmd/prepare/interpolation.js new file mode 100644 index 00000000..67035648 --- /dev/null +++ b/cmd/prepare/interpolation.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'interpolation', + describe: 'build interpolation sqlite databases', + handler: () => { + run({ _: ['compose', 'run', 'interpolation', 'bash', './docker_build.sh'] }) + } +} diff --git a/cmd/prepare/placeholder.js b/cmd/prepare/placeholder.js new file mode 100644 index 00000000..1494b0d5 --- /dev/null +++ b/cmd/prepare/placeholder.js @@ -0,0 +1,10 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'placeholder', + describe: 'build placeholder sqlite databases', + handler: () => { + run({ _: ['compose', 'run', 'placeholder', 'bash', './cmd/extract.sh'] }) + run({ _: ['compose', 'run', 'placeholder', 'bash', './cmd/build.sh'] }) + } +} diff --git a/cmd/prepare/polylines.js b/cmd/prepare/polylines.js new file mode 100644 index 00000000..8f5d8b99 --- /dev/null +++ b/cmd/prepare/polylines.js @@ -0,0 +1,9 @@ +const run = require('../compose/run').handler + +module.exports = { + command: 'polylines', + describe: 'export road network from openstreetmap into polylines format', + handler: () => { + run({ _: ['compose', 'run', 'polylines', 'bash', './docker_extract.sh'] }) + } +} diff --git a/cmd/system.js b/cmd/system.js new file mode 100644 index 00000000..4c2a2c1f --- /dev/null +++ b/cmd/system.js @@ -0,0 +1,9 @@ +module.exports = { + command: 'system ', + describe: 'run system commands', + builder: (yargs) => yargs + .commandDir('system') + .usage('$0 [args]') + .demandCommand(1, '') + } + \ No newline at end of file diff --git a/cmd/system.sh b/cmd/system.sh deleted file mode 100644 index 225e2726..00000000 --- a/cmd/system.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -set -e; - -function system_check(){ env_check; } -register 'system' 'check' 'ensure the system is correctly configured' system_check - -function system_env(){ env; } -register 'system' 'env' 'display environment variables' system_env - -function system_update(){ git -C $(dirname "${BASH_SOURCE[0]}") pull; } -register 'system' 'update' 'update the pelias command by pulling the latest version' system_update \ No newline at end of file diff --git a/cmd/system/check.js b/cmd/system/check.js new file mode 100644 index 00000000..19c2745a --- /dev/null +++ b/cmd/system/check.js @@ -0,0 +1,39 @@ +const platform = require('process').platform; +const { exec } = require('child_process'); +const env = require('../../lib/env'); +const fs = require('fs'); +module.exports = { + command: 'check', + describe: 'ensure the system is correctly configured', + handler: () => { + if (platform == "win32") { + exec('(net session >nul 2>&1 & echo %ERRORLEVEL%)', function (err, stdout) { + if(err||!stdout.includes("0")){ + console.error("You are running as root\nThis is insecure and not supported by Pelias.\nPlease try again as a non-root user.") + process.exit(1); + } + }); + } + //Assuming that ever other platform is *nix related + else { + exec('echo $(id -u ${SUDO_USER-${USER}}):$(id -g ${SUDO_USER-${USER}})', function (err, stdout, stderror) { + if (stdout == "0:0") { + console.error("You are running as root\nThis is insecure and not supported by Pelias.\nPlease try again as a non-root user.") + process.exit(1); + } + }) + } + if (!env().DATA_DIR) { + console.error("You must set the DATA_DIR env var to a valid directory on your local machine.\n"); + console.error("Edit the '.env' file in this repository, update the DATA_DIR to a valid path and try again.") + console.error("Alternatively, you can set the variable in your environment using a command such as 'export DATA_DIR=/tmp'.") + process.exit(1); + } + if (!fs.existsSync(env().DATA_DIR)) { + console.error(`The directory specified by DATA_DIR does not exist:\n ${env().DATA_DIR}`); + console.error("Edit the '.env' file in this repository, update the DATA_DIR to a valid path and try again."); + console.error("Alternatively, you can set the variable in your environment using a command such as 'export DATA_DIR=/tmp'."); + process.exit(1); + } + } +} \ No newline at end of file diff --git a/cmd/system/env.js b/cmd/system/env.js new file mode 100644 index 00000000..c9772ac9 --- /dev/null +++ b/cmd/system/env.js @@ -0,0 +1,11 @@ +module.exports = { + command: 'env', + describe: 'display environment variables', + handler: () => { + Object.entries(process.env).forEach(entry => { + //Mimic the default bash env return value + console.log(entry[0] + "=" + entry[1]); + }); + } + +} \ No newline at end of file diff --git a/cmd/system/update.js b/cmd/system/update.js new file mode 100644 index 00000000..40a6278f --- /dev/null +++ b/cmd/system/update.js @@ -0,0 +1,11 @@ +const path = require('path'); +const { exec } = require('child_process'); + +module.exports = { + command: 'update', + describe: 'update the pelias command by pulling the latest version', + handler: () => { + const peliasRoot = path.dirname(require.main.filename); + exec(`git -C ${peliasRoot} pull`) + } +} \ No newline at end of file diff --git a/cmd/test.js b/cmd/test.js new file mode 100644 index 00000000..bb6d712c --- /dev/null +++ b/cmd/test.js @@ -0,0 +1,9 @@ +module.exports = { + command: 'test ', + describe: 'run test scenarios', + builder: (yargs) => yargs + .commandDir('test') + .usage('$0 [args]') + .demandCommand(1, '') + } + \ No newline at end of file diff --git a/cmd/test.sh b/cmd/test.sh deleted file mode 100644 index 56e916a3..00000000 --- a/cmd/test.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -e; - -# run acceptance tests -function test_fuzzy(){ compose_run 'fuzzy-tester' -e 'docker' $@; } - -register 'test' 'run' 'run fuzzy-tester test cases' test_fuzzy \ No newline at end of file diff --git a/cmd/test/run.js b/cmd/test/run.js new file mode 100644 index 00000000..a7eb03f0 --- /dev/null +++ b/cmd/test/run.js @@ -0,0 +1,8 @@ +const run = require('../compose/run').handler +module.exports = { + command: 'run', + describe: 'run fuzzy-tester test cases', + handler: () => { + run({ _: ['compose', 'run', 'fuzzy-tester', '-e docker'] }) + } +} \ No newline at end of file diff --git a/images/elasticsearch/7.17.15/Dockerfile b/images/elasticsearch/7.17.15/Dockerfile new file mode 100644 index 00000000..9825ac65 --- /dev/null +++ b/images/elasticsearch/7.17.15/Dockerfile @@ -0,0 +1,41 @@ +# see: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html + +# base image +FROM docker.elastic.co/elasticsearch/elasticsearch:7.17.15 +USER root + +# environmental settings +ENV ES_JAVA_OPTS '-Xms512m -Xmx512m' +ENV cluster.name 'pelias-dev' +ENV discovery.type 'single-node' +ENV bootstrap.memory_lock 'true' +RUN echo 'vm.max_map_count=262144' >> /etc/sysctl.conf + +# configure plugins +RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu +RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install repository-s3 --batch + +# elasticsearch config +ADD elasticsearch.yml /usr/share/elasticsearch/config/ +RUN chown elasticsearch:elasticsearch config/elasticsearch.yml + +## set permissions so any user can run elasticsearch +# add read permissions to all files in dir +RUN chmod go+r /usr/share/elasticsearch -R + +# add write permissions to config, log & data dirs +RUN chmod go+w /usr/share/elasticsearch \ + /usr/share/elasticsearch/config \ + /usr/share/elasticsearch/logs \ + /usr/share/elasticsearch/data + +# add list permissions to directories +RUN chmod go+x /usr/share/elasticsearch \ + /usr/share/elasticsearch/config \ + /usr/share/elasticsearch/config/repository-s3 + +# add execute permissions to bins +RUN chmod go+x /usr/share/elasticsearch/bin/* + +# run as elasticsearch user +USER elasticsearch diff --git a/images/elasticsearch/7.17.15/elasticsearch.yml b/images/elasticsearch/7.17.15/elasticsearch.yml new file mode 100644 index 00000000..6086c701 --- /dev/null +++ b/images/elasticsearch/7.17.15/elasticsearch.yml @@ -0,0 +1,9 @@ +bootstrap.memory_lock: true +network.host: 0.0.0.0 +http.port: 9200 +node.master: true +node.data: true +thread_pool: + write: + queue_size: 1000 +indices.query.bool.max_clause_count: 4000 diff --git a/images/elasticsearch/7.5.1/elasticsearch.yml b/images/elasticsearch/7.5.1/elasticsearch.yml index 4f37ad08..6086c701 100644 --- a/images/elasticsearch/7.5.1/elasticsearch.yml +++ b/images/elasticsearch/7.5.1/elasticsearch.yml @@ -6,3 +6,4 @@ node.data: true thread_pool: write: queue_size: 1000 +indices.query.bool.max_clause_count: 4000 diff --git a/images/elasticsearch/8.12.2-beta/Dockerfile b/images/elasticsearch/8.12.2-beta/Dockerfile new file mode 100644 index 00000000..322e7708 --- /dev/null +++ b/images/elasticsearch/8.12.2-beta/Dockerfile @@ -0,0 +1,36 @@ +# see: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html + +# base image +FROM docker.elastic.co/elasticsearch/elasticsearch:8.12.2 +USER root + +# environmental settings +ENV ES_JAVA_OPTS '-Xms512m -Xmx512m' +ENV cluster.name 'pelias-dev' +ENV discovery.type 'single-node' +ENV bootstrap.memory_lock 'true' +RUN echo 'vm.max_map_count=262144' >> /etc/sysctl.conf + +# configure plugins +RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu +RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install repository-s3 --batch + +# elasticsearch config +ADD elasticsearch.yml /usr/share/elasticsearch/config/ +RUN chown elasticsearch:elasticsearch config/elasticsearch.yml + +## set permissions so any user can run elasticsearch +# add read permissions to all files in dir +RUN chmod go+r /usr/share/elasticsearch -R + +# add write permissions to config, log & data dirs +RUN chmod go+w /usr/share/elasticsearch \ + /usr/share/elasticsearch/config \ + /usr/share/elasticsearch/logs \ + /usr/share/elasticsearch/data + +# add execute permissions to bins +RUN chmod go+x /usr/share/elasticsearch/bin/* + +# run as elasticsearch user +USER elasticsearch diff --git a/images/elasticsearch/8.12.2-beta/elasticsearch.yml b/images/elasticsearch/8.12.2-beta/elasticsearch.yml new file mode 100644 index 00000000..fe9a6c62 --- /dev/null +++ b/images/elasticsearch/8.12.2-beta/elasticsearch.yml @@ -0,0 +1,9 @@ +bootstrap.memory_lock: true +network.host: 0.0.0.0 +http.port: 9200 +node.roles: [ master, data ] +thread_pool: + write: + queue_size: 1000 +indices.query.bool.max_clause_count: 4000 +xpack.security.enabled: false diff --git a/lib/cli.sh b/lib/cli.sh deleted file mode 100644 index a47fb0a8..00000000 --- a/lib/cli.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -set -e; - -declare -a commands -declare -a actions -declare -a hints -declare -a functions - -function register(){ - commands+=("$1") - actions+=("$2") - hints+=("$3") - functions+=("$4") -} - -function help(){ - printf 'Usage: %s [command] [action] [options]\n\n' ${0} - - for (( i = 0; i < ${#commands[@]}; ++i )); do - echo -e " ${commands[$i]}\t${actions[$i]}\t ${hints[$i]}" - done | column -ts $'\t' - - echo -} - -function cli(){ - cmd="${1}"; shift || true - action="${1}"; shift || true - valid_command=false - valid_action=false - - for (( i = 0; i < ${#commands[@]}; ++i )); do - if [ "${cmd}" = "${commands[$i]}" ]; then - valid_command=true - if [ "${action}" = "${actions[$i]}" ]; then - valid_action=true - "${functions[$i]}" "$@" - exit $? - fi - fi - done - echo - - [ -z "${cmd}" ] || [ "$valid_command" = true ] || printf 'invalid command "%s"\n\n' "${cmd}" - [ -z "${action}" ] || [ "$valid_action" = true ] || printf 'invalid action "%s"\n\n' "${action}" - help - - exit 1 -} diff --git a/lib/env.js b/lib/env.js new file mode 100644 index 00000000..2329c7b6 --- /dev/null +++ b/lib/env.js @@ -0,0 +1,9 @@ +const _ = require('lodash') +const dotenv = require('dotenv') + +module.exports = () => { + let env = Object.create(process.env) + _.extend(env, dotenv.config().parsed) + + return env +} diff --git a/lib/env.sh b/lib/env.sh deleted file mode 100644 index 1aaed543..00000000 --- a/lib/env.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -set -e; - -# disable verbose logging -ENV_DISPLAY_WARNINGS=false - -# ensure the user environment is correctly set up -function env_check(){ - if [ -z "${DATA_DIR}" ]; then - echo "You must set the DATA_DIR env var to a valid directory on your local machine." - echo - echo "Edit the '.env' file in this repository, update the DATA_DIR to a valid path and try again." - echo "Alternatively, you can set the variable in your environment using a command such as 'export DATA_DIR=/tmp'." - exit 1 - elif [ ! -d "${DATA_DIR}" ]; then - printf "The directory specified by DATA_DIR does not exist: %s\n" ${DATA_DIR} - echo - echo "Edit the '.env' file in this repository, update the DATA_DIR to a valid path and try again." - echo "Alternatively, you can set the variable in your environment using a command such as 'export DATA_DIR=/tmp'." - exit 1 - fi -} - -# loads environment vars from a stream (such as a file) -# example: env_load_stream < .env -function env_load_stream(){ - [[ -n $DATA_DIR ]] && printf "DATA_DIR is already set to '$DATA_DIR' - this may cause the DATA_DIR specified in the .env to be ignored\n" - while IFS='=' read -r key value; do - ([ -z $key ] || [ -z $value ]) && printf 'Invalid environment var "%s=%s"\n' $key $value && exit 1 - if [ -z ${!key} ]; then - export "${key}=${value}" - elif $ENV_DISPLAY_WARNINGS; then - printf '[warn] skip setting environment var "%s=%s", already set "%s=%s"\n' $key $value $key ${!key} - fi - done -} - -# ensure locale is correctly set? -# export LC_ALL=en_US.UTF-8 - -# load DATA_DIR and other vars from docker-compose .env file -# note: strips comments and empty lines -[ -f .env ] && env_load_stream < <(grep -v '^$\|^\s*$\#' .env) - -# use the default compose file unless one was specified -# if [ -z "${COMPOSE_FILE}" ]; then -# if [ ! -f "docker-compose.yml" ]; then -# export COMPOSE_FILE="${BASEDIR}/docker-compose.yml" -# fi -# fi - -# ensure the user env is correctly set up -env_check diff --git a/package.json b/package.json new file mode 100644 index 00000000..6b4f62e4 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "docker", + "version": "1.0.0", + "description": "This repository contains a framework for downloading/preparing and building the [Pelias Geocoder](https://github.com/pelias/pelias) using Docker and [Docker Compose](https://github.com/docker/compose#docker-compose).", + "main": "index.js", + "directories": { + "lib": "lib" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/pelias/docker.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/pelias/docker/issues" + }, + "homepage": "https://github.com/pelias/docker#readme", + "dependencies": { + "atomic-sleep": "^1.0.0", + "dotenv": "^8.2.0", + "lodash": "^4.17.15", + "yargs": "^17.7.2" + } +} diff --git a/pelias b/pelias index 0f383f55..6cd95086 100755 --- a/pelias +++ b/pelias @@ -1,22 +1,9 @@ -#!/bin/bash -set -e +#!/usr/bin/env node -# OSX comes bundled with versions of readlink, sed, parallel etc which are not -# compatible with the linux tools. Force OSX users to install the GNU -# compatible versions (prefixed with 'g', such as 'greadlink', 'gsed' etc.). -export CMD_READLINK='readlink' -if [[ "$OSTYPE" == "darwin"* ]]; then - if [ -x "$(command -v greadlink)" ]; then - CMD_READLINK='greadlink'; - else - 2>&1 echo 'OSX: you must install the gnu standard tooling using:' - 2>&1 echo 'brew install coreutils' - fi -fi - -# resolve path to this file (following symlinks) and load libs -BASEDIR=$( dirname $( ${CMD_READLINK} -f "${BASH_SOURCE[0]}" ) ) -for f in ${BASEDIR}/lib/* ${BASEDIR}/cmd/*; do source $f; done - -# cli runner -cli "$@" +require('yargs') + .scriptName('pelias') + .commandDir('cmd') + .showHelpOnFail(true) + .demandCommand(1, '') + .help() + .parse() diff --git a/projects/australia/.env b/projects/australia/.env index 5182d431..783d7326 100644 --- a/projects/australia/.env +++ b/projects/australia/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/australia -DOCKER_USER=1000 diff --git a/projects/australia/docker-compose.yml b/projects/australia/docker-compose.yml index 729f5026..3c484efa 100644 --- a/projects/australia/docker-compose.yml +++ b/projects/australia/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -59,6 +59,14 @@ services: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" - "./blacklist/:/data/blacklist" + geonames: + image: pelias/geonames:master + container_name: pelias_geonames + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" transit: image: pelias/transit:master container_name: pelias_transit @@ -87,7 +95,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -97,16 +105,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/australia/pelias.json b/projects/australia/pelias.json index dd4f7b14..45975ed3 100644 --- a/projects/australia/pelias.json +++ b/projects/australia/pelias.json @@ -61,7 +61,7 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, + "countryCode": "AU", "importPostalcodes": true, "importPlace": [ "85632793" diff --git a/projects/austria/.env b/projects/austria/.env new file mode 100644 index 00000000..532d0361 --- /dev/null +++ b/projects/austria/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/austria diff --git a/projects/austria/README.md b/projects/austria/README.md new file mode 100644 index 00000000..180cedef --- /dev/null +++ b/projects/austria/README.md @@ -0,0 +1,32 @@ +# Austrian area + +This project is configured to download/prepare/build a complete Pelias installation for Austria. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/austria/docker-compose.yml b/projects/austria/docker-compose.yml new file mode 100644 index 00000000..c0f50faa --- /dev/null +++ b/projects/austria/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/austria/elasticsearch.yml b/projects/austria/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/austria/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/austria/pelias.json b/projects/austria/pelias.json new file mode 100644 index 00000000..ab2e5d50 --- /dev/null +++ b/projects/austria/pelias.json @@ -0,0 +1,66 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + }, + "defaultParameters": { + "focus.point.lat": 50.85, + "focus.point.lon": 4.35 + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "AT" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/europe/austria-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "austria-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["at/31254.csv", "at/31255.csv", "at/31256.csv", "at/city_of_vienna.csv", "at/tirol.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "AT", + "importPostalcodes": true, + "importPlace": [ "85632785" ] + } + } +} diff --git a/projects/belgium/.env b/projects/belgium/.env index 73f54be2..b2c70f6c 100644 --- a/projects/belgium/.env +++ b/projects/belgium/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias -DOCKER_USER=1000 DATA_DIR=/tmp/pelias/belgium diff --git a/projects/belgium/docker-compose.yml b/projects/belgium/docker-compose.yml index 8ffc4b65..c0f50faa 100644 --- a/projects/belgium/docker-compose.yml +++ b/projects/belgium/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -77,7 +77,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,16 +87,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" diff --git a/projects/belgium/pelias.json b/projects/belgium/pelias.json index cf4b6da7..b33ea227 100644 --- a/projects/belgium/pelias.json +++ b/projects/belgium/pelias.json @@ -50,7 +50,7 @@ }, "openaddresses": { "datapath": "/data/openaddresses", - "files": ["be/bru/brussels-fr.csv", "be/bru/brussels-nl.csv", "be/flanders.csv", "be/wal/namur.csv"] + "files": ["be/bru/bosa-region-brussels-nl.csv", "be/bru/bosa-region-brussels-fr.csv", "be/vlg/bosa-region-flanders-nl.csv", "be/wal/bosa-region-wallonia-fr.csv"] }, "polyline": { "datapath": "/data/polylines", @@ -58,7 +58,7 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, + "countryCode": "BE", "importPostalcodes": true, "importPlace": [ "85632997" ] } diff --git a/projects/brazil/.env b/projects/brazil/.env index fb544e03..e9db727a 100644 --- a/projects/brazil/.env +++ b/projects/brazil/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/brazil -DOCKER_USER=1000 diff --git a/projects/brazil/docker-compose.yml b/projects/brazil/docker-compose.yml index 729f5026..ab4482e9 100644 --- a/projects/brazil/docker-compose.yml +++ b/projects/brazil/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,7 +87,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -97,16 +97,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/brazil/pelias.json b/projects/brazil/pelias.json index e2388ebc..975b8b03 100644 --- a/projects/brazil/pelias.json +++ b/projects/brazil/pelias.json @@ -87,7 +87,7 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": true, + "countryCode": "BR", "importPostalcodes": true, "importPlace": [ "85633009" diff --git a/projects/denmark/.env b/projects/denmark/.env new file mode 100644 index 00000000..c27c8edb --- /dev/null +++ b/projects/denmark/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=./data diff --git a/projects/denmark/README.md b/projects/denmark/README.md new file mode 100644 index 00000000..c857b72e --- /dev/null +++ b/projects/denmark/README.md @@ -0,0 +1,32 @@ +# Norway area + +This project is configured to download/prepare/build a complete Pelias installation for Norway. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/denmark/docker-compose.yml b/projects/denmark/docker-compose.yml new file mode 100644 index 00000000..c0f50faa --- /dev/null +++ b/projects/denmark/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/denmark/elasticsearch.yml b/projects/denmark/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/denmark/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/denmark/pelias.json b/projects/denmark/pelias.json new file mode 100644 index 00000000..7a172e4a --- /dev/null +++ b/projects/denmark/pelias.json @@ -0,0 +1,62 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "DK" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/europe/denmark-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "denmark-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["dk/countrywide.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "DK", + "importPostalcodes": true, + "importPlace": [ "85633121" ] + } + } +} diff --git a/projects/france/.env b/projects/france/.env index ef9e5643..532fc877 100644 --- a/projects/france/.env +++ b/projects/france/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/france -DOCKER_USER=1000 diff --git a/projects/france/docker-compose.yml b/projects/france/docker-compose.yml index 8ffc4b65..c0f50faa 100644 --- a/projects/france/docker-compose.yml +++ b/projects/france/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -77,7 +77,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,16 +87,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" diff --git a/projects/france/pelias.json b/projects/france/pelias.json index 0f4373e6..3e05c4b8 100644 --- a/projects/france/pelias.json +++ b/projects/france/pelias.json @@ -50,7 +50,7 @@ }, "openaddresses": { "datapath": "/data/openaddresses", - "files": ["fr/ain.csv", "fr/aisne.csv", "fr/allier.csv", "fr/alpes_de_haute_provence.csv", "fr/alpes_maritimes.csv", "fr/ardeche.csv", "fr/ardennes.csv", "fr/ariege.csv", "fr/aube.csv", "fr/aude.csv", "fr/aveyron.csv", "fr/bas_rhin.csv", "fr/bouches_du_rhone.csv", "fr/calvados.csv", "fr/cantal.csv", "fr/charente.csv", "fr/charente_maritime.csv", "fr/cher.csv", "fr/colmar.csv", "fr/correze.csv", "fr/corse_du_sud.csv", "fr/cote_dor.csv", "fr/cotes_darmor.csv", "fr/creuse.csv", "fr/deux_sevres.csv", "fr/dordogne.csv", "fr/doubs.csv", "fr/drome.csv", "fr/essonne.csv", "fr/eure.csv", "fr/eure_et_loir.csv", "fr/finistere.csv", "fr/gard.csv", "fr/gers.csv", "fr/gironde.csv", "fr/guadeloupe.csv", "fr/guyane.csv", "fr/haute_corse.csv", "fr/haute_garonne.csv", "fr/haute_loire.csv", "fr/haute_marne.csv", "fr/haute_rhin.csv", "fr/hautes_alpes.csv", "fr/haute_saone.csv", "fr/haute_savoie.csv", "fr/hautes_pyrenees.csv", "fr/haute_vienne.csv", "fr/hauts_de_seine.csv", "fr/herault.csv", "fr/ille_et_vilaine.csv", "fr/indre.csv", "fr/indre_et_loire.csv", "fr/isere.csv", "fr/jura.csv", "fr/landes.csv", "fr/la_reunion.csv", "fr/loire_atlantique.csv", "fr/loire.csv", "fr/loir_et_cher.csv", "fr/loiret.csv", "fr/lot.csv", "fr/lot_et_garonne.csv", "fr/lozere.csv", "fr/maine_et_loire.csv", "fr/manche.csv", "fr/marne.csv", "fr/martinique.csv", "fr/mayenne.csv", "fr/mayotte.csv", "fr/meurthe_et_moselle.csv", "fr/meuse.csv", "fr/montpellier.csv", "fr/morbihan.csv", "fr/moselle.csv", "fr/nievre.csv", "fr/nord.csv", "fr/oise.csv", "fr/orne.csv", "fr/paris.csv", "fr/pas_de_calais.csv", "fr/puy_de_dome.csv", "fr/pyrenees_atlantiques.csv", "fr/pyrenees_orientales.csv", "fr/rhone.csv", "fr/saone_et_loire.csv", "fr/sarthe.csv", "fr/savoie.csv", "fr/seine_et_marne.csv", "fr/seine_maritime.csv", "fr/seine_saint_denis.csv", "fr/somme.csv", "fr/tarn.csv", "fr/tarn_et_garonne.csv", "fr/territoire_de_belfort.csv", "fr/val_de_marne.csv", "fr/val_doise.csv", "fr/var.csv", "fr/vaucluse.csv", "fr/vendee.csv", "fr/vienne.csv", "fr/vosges.csv", "fr/yonne.csv", "fr/yvelines.csv"] + "files": ["fr/countrywide.csv"] }, "polyline": { "datapath": "/data/polylines", @@ -58,8 +58,8 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true, + "countryCode": "FR", "importPlace": [ "136253037", "85633147" ] } } diff --git a/projects/germany/.env b/projects/germany/.env new file mode 100644 index 00000000..c27c8edb --- /dev/null +++ b/projects/germany/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=./data diff --git a/projects/germany/README.md b/projects/germany/README.md new file mode 100644 index 00000000..68e78bdb --- /dev/null +++ b/projects/germany/README.md @@ -0,0 +1,34 @@ +# Germany + +This project is configured to download/prepare/build a complete Pelias installation for Germany. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +Given the coverage provided by OpenAddresses is somewhat sparse, it's worth examining the configuration and the OpenAddresses coverage to understand your queries. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/germany/docker-compose.yml b/projects/germany/docker-compose.yml new file mode 100644 index 00000000..c0f50faa --- /dev/null +++ b/projects/germany/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/germany/elasticsearch.yml b/projects/germany/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/germany/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/germany/pelias.json b/projects/germany/pelias.json new file mode 100644 index 00000000..b7b83957 --- /dev/null +++ b/projects/germany/pelias.json @@ -0,0 +1,59 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + } + }, + "imports": { + "geonames": { + "datapath": "/data/geonames", + "countryCode": "DE" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/europe/germany-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "germany-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["de/berlin.csv", "de/he/city_of_frankfurtammain.csv", "de/he/city_of_kassel.csv", "de/hh/statewide.csv", "de/ni/bentheim.csv", "de/nw/city_of_cologne.csv", "de/nw/city_of_wesel.csv", "de/nw/city_of_wuppertal.csv", "de/nw/kreis_viersen.csv", "de/nw/statewide.csv", "de/sn/statewide.csv", "de/th/statewide.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "DE", + "importPostalcodes": false, + "importPlace": [ "85633111" ] + } + } +} diff --git a/projects/israel/.env b/projects/israel/.env new file mode 100644 index 00000000..a88e82a3 --- /dev/null +++ b/projects/israel/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/israel diff --git a/projects/israel/README.md b/projects/israel/README.md new file mode 100644 index 00000000..eef958fb --- /dev/null +++ b/projects/israel/README.md @@ -0,0 +1,32 @@ +# Israel area + +This project is configured to download/prepare/build a complete Pelias installation for Israel. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/israel/blacklist/osm.txt b/projects/israel/blacklist/osm.txt new file mode 100644 index 00000000..e69de29b diff --git a/projects/israel/docker-compose.yml b/projects/israel/docker-compose.yml new file mode 100644 index 00000000..c0f50faa --- /dev/null +++ b/projects/israel/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/israel/elasticsearch.yml b/projects/israel/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/israel/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/israel/pelias.json b/projects/israel/pelias.json new file mode 100644 index 00000000..5e54f69b --- /dev/null +++ b/projects/israel/pelias.json @@ -0,0 +1,82 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { + "host": "elasticsearch" + } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { + "url": "http://pip:4200" + }, + "libpostal": { + "url": "http://libpostal:4400" + }, + "placeholder": { + "url": "http://placeholder:4100" + }, + "interpolation": { + "url": "http://interpolation:4300" + } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "IL" + }, + "openstreetmap": { + "download": [ + { + "sourceURL": "http://download.geofabrik.de/asia/israel-and-palestine-latest.osm.pbf" + } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [ + { + "filename": "israel-and-palestine-latest.osm.pbf" + } + ] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": [ + "il/city_of_tel_aviv.csv" + ] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ + "extract.0sv" + ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "IL", + "importPostalcodes": true, + "importPlace": [ + "85632315" + ] + } + } +} diff --git a/projects/italy/.env b/projects/italy/.env new file mode 100644 index 00000000..de671526 --- /dev/null +++ b/projects/italy/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/italy diff --git a/projects/italy/README.md b/projects/italy/README.md new file mode 100644 index 00000000..35a4092b --- /dev/null +++ b/projects/italy/README.md @@ -0,0 +1,32 @@ +# Italian area + +This project is configured to download/prepare/build a complete Pelias installation for Italy. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/italy/docker-compose.yml b/projects/italy/docker-compose.yml new file mode 100644 index 00000000..c0f50faa --- /dev/null +++ b/projects/italy/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/italy/elasticsearch.yml b/projects/italy/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/italy/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/italy/pelias.json b/projects/italy/pelias.json new file mode 100644 index 00000000..a04e9a5e --- /dev/null +++ b/projects/italy/pelias.json @@ -0,0 +1,66 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + }, + "defaultParameters": { + "focus.point.lat": 45.99, + "focus.point.lon": 12.63 + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "IT" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/europe/italy-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "italy-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["it/countrywide.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "IT", + "importPostalcodes": true, + "importPlace": [ "85633253" ] + } + } +} diff --git a/projects/jamaica/.env b/projects/jamaica/.env index 8f518082..3f2d2e1e 100644 --- a/projects/jamaica/.env +++ b/projects/jamaica/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/jamaica -DOCKER_USER=1000 diff --git a/projects/jamaica/docker-compose.yml b/projects/jamaica/docker-compose.yml index 729f5026..ab4482e9 100644 --- a/projects/jamaica/docker-compose.yml +++ b/projects/jamaica/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,7 +87,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -97,16 +97,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/jamaica/pelias.json b/projects/jamaica/pelias.json index 55c58b7c..bd2f4613 100644 --- a/projects/jamaica/pelias.json +++ b/projects/jamaica/pelias.json @@ -61,7 +61,7 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": true, + "countryCode": "JM", "importPostalcodes": true, "importPlace": [ "85632215" diff --git a/projects/kyrgyzstan/.env b/projects/kyrgyzstan/.env new file mode 100644 index 00000000..4b1c81de --- /dev/null +++ b/projects/kyrgyzstan/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/kyrgyzstan diff --git a/projects/kyrgyzstan/README.md b/projects/kyrgyzstan/README.md new file mode 100644 index 00000000..d6296c9f --- /dev/null +++ b/projects/kyrgyzstan/README.md @@ -0,0 +1,32 @@ +# Kyrgyzstan country + +This project is configured to download/prepare/build a complete Pelias installation for Kyrgyzstan. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/kyrgyzstan/docker-compose.yml b/projects/kyrgyzstan/docker-compose.yml new file mode 100644 index 00000000..8ffc4b65 --- /dev/null +++ b/projects/kyrgyzstan/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.5.1 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "9200:9200", "9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/kyrgyzstan/elasticsearch.yml b/projects/kyrgyzstan/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/kyrgyzstan/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/kyrgyzstan/pelias.json b/projects/kyrgyzstan/pelias.json new file mode 100644 index 00000000..7c86fd79 --- /dev/null +++ b/projects/kyrgyzstan/pelias.json @@ -0,0 +1,62 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "KG" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "https://download.geofabrik.de/asia/kyrgyzstan-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "kyrgyzstan-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["kg/countrywide.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "KG", + "importPostalcodes": true, + "importPlace": [ "85632761" ] + } + } +} diff --git a/projects/las-vegas-metro/.env b/projects/las-vegas-metro/.env new file mode 100644 index 00000000..136b49ab --- /dev/null +++ b/projects/las-vegas-metro/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/portland-metro diff --git a/projects/las-vegas-metro/README.md b/projects/las-vegas-metro/README.md new file mode 100644 index 00000000..1ead3486 --- /dev/null +++ b/projects/las-vegas-metro/README.md @@ -0,0 +1,36 @@ + +# Las Vegas Metro Area + +This project is configured to download/prepare/build a complete Pelias installation for Las Vegas, Nevada (and indeed Clark County as a whole). + +# Setup + +Please refer to the instructions at https://github.com/pelias/docker in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +This project requires about 7 GB of disk space. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +pelias test run +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + +http://localhost:4000/v1/search?text=Las%20Vegas diff --git a/projects/las-vegas-metro/docker-compose.yml b/projects/las-vegas-metro/docker-compose.yml new file mode 100644 index 00000000..ab4482e9 --- /dev/null +++ b/projects/las-vegas-metro/docker-compose.yml @@ -0,0 +1,128 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + transit: + image: pelias/transit:master + container_name: pelias_transit + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + fuzzy-tester: + image: pelias/fuzzy-tester:master + container_name: pelias_fuzzy_tester + user: "${DOCKER_USER}" + restart: "no" + command: "--help" + volumes: + - "./pelias.json:/code/pelias.json" + - "./test_cases:/code/pelias/fuzzy-tester/test_cases" diff --git a/projects/las-vegas-metro/pelias.json b/projects/las-vegas-metro/pelias.json new file mode 100644 index 00000000..46de5a16 --- /dev/null +++ b/projects/las-vegas-metro/pelias.json @@ -0,0 +1,107 @@ +{ + "logger": { + "level": "info", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "acceptance-tests": { + "endpoints": { + "docker": "http://api:4000/v1/" + } + }, + "api": { + "services": { + "placeholder": { "url": "http://placeholder:4100" }, + "pip": { "url": "http://pip:4200" }, + "interpolation": { "url": "http://interpolation:4300" }, + "libpostal": { "url": "http://libpostal:4400" } + }, + "defaultParameters": { + "focus.point.lat": 36.14737, + "focus.point.lon": -115.15546 + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "csv": { + "datapath": "/data/csv", + "files": [], + "download": [ + "https://raw.githubusercontent.com/pelias/csv-importer/master/data/example.csv" + ] + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "ALL" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "https://download.geofabrik.de/north-america/us/nevada-240702.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "nevada-240702.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": [ + "us/nv/clark.csv", + "us/nv/henderson.csv", + "us/nv/las_vegas.csv" + ] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "importPostalcodes": true, + "countryCode": "US", + "importPlace": [ + "85688531" + ] + }, + "transit": { + "datapath": "/data/transit", + "feeds": [ + { + "layerId": "stops", + "url": "https://developer.rtcsnv.com/transitData/google_transit.zip", + "filename": "stops.txt", + "agencyId": "RTCSNV", + "agencyName": "RTC Transit", + "layerName": "Stop" + } + ] + }, + "interpolation": { + "download": { + "tiger": { + "datapath": "/data/tiger", + "states": [ + { "state_code": 32, "county_code": 3, "name": "Clark County, NV" } + ] + } + } + } + } +} diff --git a/projects/las-vegas-metro/synonyms/custom_name.txt b/projects/las-vegas-metro/synonyms/custom_name.txt new file mode 100644 index 00000000..6f7691bd --- /dev/null +++ b/projects/las-vegas-metro/synonyms/custom_name.txt @@ -0,0 +1,25 @@ + +shopping,store,shop,retail,grocery,mall + +# Transit Centers +# Rail Stations +# Misc Landmarks + +north, N +south, S +east, E +west, W +north west => northwest +north east => northeast +south west => southwest +south east => southeast +northwest, NW +northeast, NE +southwest, SW +southeast, SE + +Int'l, international + +# street names +MLK,M L King,Martin Luther King +LV,Las Vegas diff --git a/projects/las-vegas-metro/synonyms/custom_street.txt b/projects/las-vegas-metro/synonyms/custom_street.txt new file mode 100644 index 00000000..d662620d --- /dev/null +++ b/projects/las-vegas-metro/synonyms/custom_street.txt @@ -0,0 +1,107 @@ +first,1st +second,2nd +third,3rd +fourth,4th +fifth,5th +sixth,6th +seventh,7th +eighth,8th +nineth,9th +tenth,10th +eleventh,11th +twelfth,12th +thirteenth,13th +fourteenth,14th +fifteenth,15th +sixteenth,16th +seventeenth,17th +eighteenth,18th +nineteenth,19th +twentyth,20th +twentyfirst,21st +twentysecond,22nd +twentythrid,23rd + +# USPS Suffix Abbreviations +# http://www.usps.com/ncsc/lookups/abbreviations.html#suffix +st,st.,street,str +ave,ave.,av,av.,avenue,AVNUE,AVENUE,AVENU +dr,drive,dr.,drv,driv,drives +BOULEVARD,BLVD,BOULEVARD,BOUL,BOULEVARD,BOULEVARD,BOULV +BRIDGE,BRDGE,BRG +BYPASS,BYP,BYPA,BYPAS,BYPS +CLIFF,CLF,CLIFFS,CLFS +CLUB,CLB +COMMON,CMN +CORNER,COR,CORNERS,CORS +CENTER,CEN,CENT,CENTER,CENTR,CENTRE,CNTER,CNTR,CTR,CENTERS,CTRS +CIR,CIRC,CIRCL,CIRCLE,CRCL,CIRCLE,CRCLE +COURT,CRT,CT,COURTS +CTSCK,CR,CREEK,CRK +CROSSING,CRSSING,CRSSNG,XING +CRECENT,CRES,CRESCENT,CRESENT,CRSCNT,CRSENT,CRSNT +EXP,EXPR,EXPRESS,EXPRESSWAY,EXPW,EXPY +FALL,FALLS,FLS +FERRY,FRRY,FRY +FIELD,FLD,FIELDS,FLDS +FREEWAY,FREEWY,FRWAY,FRWY,FWY +GARDEN,GARDN,GDN,GRDEN,GRDN,GARDENS,GDNS,GRDNS +GATEWAY,GATEWY,GATWAY,GTWAY,GTWY +GROV,GROVE,GRV,GROVES +HARB,HARBOR,HARBR,HBR,HRBOR,HARBORS +HEIGHT,HEIGHTS,HGTS,HT,HTS +HIGHWAY,HIGHWY,HIWAY,HIWY,HWAY,HWY +HILL,HL,HILLS,HLS +IS,ISLAND,ISLND,ISLANDS,ISLNDS,ISS,ISLE,ISLES +JCT,JCTION,JCTN,JUNCTION,JUNCTN,JUNCTON,JCTNS,JCTS,JUNCTIONS +LAKE,LK,LAKES,LKS +LANDING,LNDG,LNDNG +LA,LANE,LANES,LN +LOOP,LOOPS,LP +MANOR,MNR,MANORS,MNRS +MDW,MEADOW,MDWS,MEADOWS,MEDOWS +MILL,ML,MILLS,MLS +MNT,MOUNT,MT +MNTAIN,MNTN,MOUNTAIN,MOUNTIN,MTIN,MTN,MNTNS,MOUNTAINS +ORCH,ORCHARD,ORCHRD +PARK,PK,PRK,PARKS +PARKWAY,PARKWY,PKWAY,PKWY,PKY,PARKWAYS,PKWYS +PLAZA,PLZ,PLZA +PLACE,PL +PR,PRAIRIE,PRARIE,PRR +RANCH,RANCHES,RNCH,RNCHS +RDG,RDGE,RIDGE,RDGS,RIDGES +RIV,RIVER,RIVR,RVR +RD,ROAD,RDS,ROADS +RTESHLS,SHOALS +SHOAR,SHORE,SHR,SHOARS,SHORES,SHRS +SPG,SPNG,SPRING,SPRNG,SPGS,SPNGS,SPRINGS,SPRNGS +SQ,SQR,SQRE,SQU,SQUARE,SQRS,SQUARES +STA,STATION,STATN,STN +STREAM,STREME,STRM +ST,STR,STREET,STRT,STREETS +SMT,SUMIT,SUMITT,SUMMIT +TER,TERR,TERRACE +TR,TRAIL,TRAILS,TRL,TRLS +TUNEL,TUNL,TUNLS,TUNNEL,TUNNELS,TUNNL +UN,UNION,UNIONS +VALLEY,VALLY,VLLY,VLY,VALLEYS,VLYS +VDCT,VIA,VIADCT,VIADUCT +VIEW,VW,VIEWS,VWS +VILL,VILLAG,VILLAGE,VILLG,VILLIAGE,VLG,VILLAGES,VLGS +VILLE,VL +VIS,VIST,VISTA,VST,VSTA +WAY,WY,WAYS + +north, N +south, S +east, E +west, W +north west => northwest +north east => northeast +south west => southwest +south east => southeast +northwest, NW +northeast, NE +southwest, SW +southeast, SE diff --git a/projects/las-vegas-metro/test_cases/search_address.json b/projects/las-vegas-metro/test_cases/search_address.json new file mode 100644 index 00000000..32afa81c --- /dev/null +++ b/projects/las-vegas-metro/test_cases/search_address.json @@ -0,0 +1,717 @@ +{ + "name": "/v1/search address", + "description": "addresses in Las Vegas, NV metro area", + "priorityThresh": 1, + "normalizers": { + "name": [ + "toUpperCase", + "removeOrdinals", + "stripPunctuation", + "abbreviateDirectionals", + "abbreviateStreetSuffixes" + ] + }, + "tests": [ + { + "id": 1, + "status": "fail", + "in": { + "text": "1920 N MLK Blvd, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 2, + "status": "fail", + "in": { + "text": "1920 N MLK Blvd, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 3, + "status": "fail", + "in": { + "text": "1920 N MLK Blvd Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 4, + "status": "fail", + "in": { + "text": "1920 N MLK Blvd Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 5, + "status": "fail", + "in": { + "text": "1920 N MLK Jr Blvd, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 6, + "status": "fail", + "in": { + "text": "1920 N MLK Jr Blvd, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 7, + "status": "fail", + "in": { + "text": "1920 N MLK Jr Blvd Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 8, + "status": "fail", + "in": { + "text": "1920 N MLK Jr Blvd Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 9, + "status": "fail", + "in": { + "text": "1920 N ML King Blvd, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 10, + "status": "fail", + "in": { + "text": "1920 N ML King Blvd, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 11, + "status": "fail", + "in": { + "text": "1920 N ML King Blvd Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 12, + "status": "fail", + "in": { + "text": "1920 N ML King Blvd Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 12.1, + "status": "pass", + "in": { + "text": "1920 N martin luther king Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "1920 North Martin Luther King Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 13, + "status": "fail", + "in": { + "text": "2000 S LV Blvd, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 14, + "status": "fail", + "in": { + "text": "2000 S LV Blvd, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 15, + "status": "fail", + "in": { + "text": "2000 S LV Blvd Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 16, + "status": "fail", + "in": { + "text": "2000 S LV Blvd Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 17, + "status": "fail", + "in": { + "text": "2000 S LVBLVD, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 18, + "status": "fail", + "in": { + "text": "2000 S LVBLVD, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 19, + "status": "fail", + "in": { + "text": "2000 S LVBLVD Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 20, + "status": "fail", + "in": { + "text": "2000 S LVBLVD Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 21, + "status": "pass", + "in": { + "text": "2000 S Las Vegas Blvd, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 22, + "status": "pass", + "in": { + "text": "2000 S Las Vegas Blvd, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 23, + "status": "pass", + "in": { + "text": "2000 S Las Vegas Blvd Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 24, + "status": "pass", + "in": { + "text": "2000 S Las Vegas Blvd Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "2000 South Las Vegas Boulevard", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 25, + "status": "fail", + "description": "address is in North Las Vegas", + "in": { + "text": "3100 Thomas Ave, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "3100 Thomas Avenue", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 26, + "status": "fail", + "description": "address is in North Las Vegas", + "in": { + "text": "3100 Thomas Ave, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "3100 Thomas Avenue", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 27, + "status": "fail", + "description": "address is in North Las Vegas", + "in": { + "text": "3100 Thomas Ave Las Vegas NV" + }, + "expected": { + "properties": [ + { + "name": "3100 Thomas Avenue", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 28, + "status": "fail", + "description": "address is in North Las Vegas", + "in": { + "text": "3100 Thomas Ave Las Vegas Nevada" + }, + "expected": { + "properties": [ + { + "name": "3100 Thomas Avenue", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 29, + "status": "pass", + "in": { + "text": "3100 Thomas Ave, North Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "3100 Thomas Avenue", + "locality": "North Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 30, + "status": "pass", + "in": { + "text": "3100 Thomas Ave, North Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "3100 Thomas Avenue", + "locality": "North Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 31, + "status": "pass", + "in": { + "text": "317 N 6TH ST, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 32, + "status": "pass", + "in": { + "text": "317 N 6TH ST, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 33, + "status": "pass", + "in": { + "text": "317 N 6th St, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 34, + "status": "pass", + "in": { + "text": "317 N 6th St, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 35, + "status": "pass", + "in": { + "text": "317 North 6th St, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 36, + "status": "pass", + "in": { + "text": "317 North 6th St, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 37, + "status": "fail", + "in": { + "text": "317 N Sixth St, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 38, + "status": "fail", + "in": { + "text": "317 N Sixth St, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 39, + "status": "fail", + "in": { + "text": "317 North Sixth St, Las Vegas, Nevada" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + }, + { + "id": 40, + "status": "fail", + "in": { + "text": "317 North Sixth St, Las Vegas, NV" + }, + "expected": { + "properties": [ + { + "name": "317 North 6th Street", + "locality": "Las Vegas", + "region": "Nevada", + "region_a": "NV" + } + ] + } + } + ] +} diff --git a/projects/las-vegas-metro/test_cases/search_venue.json b/projects/las-vegas-metro/test_cases/search_venue.json new file mode 100644 index 00000000..e26c55b4 --- /dev/null +++ b/projects/las-vegas-metro/test_cases/search_venue.json @@ -0,0 +1,70 @@ +{ + "name": "/v1/search venues", + "priorityThresh": 1, + "endpoint": "search", + "tests": [ + { + "id": 1, + "status": "pass", + "notes": "Stratosphere Tower should come up for Stratosphere", + "in": { + "text": "Stratosphere" + }, + "expected": { + "properties": [ + { + "layer": "venue", + "name": "Stratosphere Tower", + "country_a": "USA", + "country": "United States", + "region": "Nevada", + "region_a": "NV", + "locality": "Las Vegas" + } + ] + } + }, + { + "id": 2, + "status": "pass", + "notes": "Stratosphere Tower should come up for Stratosphere Hotel", + "in": { + "text": "Stratosphere Tower" + }, + "expected": { + "properties": [ + { + "layer": "venue", + "name": "Stratosphere Tower", + "country_a": "USA", + "country": "United States", + "region": "Nevada", + "region_a": "NV", + "locality": "Las Vegas" + } + ] + } + }, + { + "id": 2, + "status": "pass", + "notes": "Stratosphere Tower should come up for Stratosphere Tower", + "in": { + "text": "Stratosphere Hotel" + }, + "expected": { + "properties": [ + { + "layer": "venue", + "name": "Stratosphere Tower", + "country_a": "USA", + "country": "United States", + "region": "Nevada", + "region_a": "NV", + "locality": "Las Vegas" + } + ] + } + } + ] +} diff --git a/projects/lithuania/.env b/projects/lithuania/.env new file mode 100644 index 00000000..c27c8edb --- /dev/null +++ b/projects/lithuania/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=./data diff --git a/projects/lithuania/README.md b/projects/lithuania/README.md new file mode 100644 index 00000000..49405702 --- /dev/null +++ b/projects/lithuania/README.md @@ -0,0 +1,34 @@ +# Lithuania + +This project is configured to download/prepare/build a complete Pelias installation for Lithuania. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +Given the coverage provided by OpenAddresses is somewhat sparse, it's worth examining the configuration and the OpenAddresses coverage to understand your queries. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/lithuania/docker-compose.yml b/projects/lithuania/docker-compose.yml new file mode 100644 index 00000000..460e8ed9 --- /dev/null +++ b/projects/lithuania/docker-compose.yml @@ -0,0 +1,119 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + transit: + image: pelias/transit:master + container_name: pelias_transit + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/lithuania/elasticsearch.yml b/projects/lithuania/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/lithuania/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/lithuania/pelias.json b/projects/lithuania/pelias.json new file mode 100644 index 00000000..3ed2b9bd --- /dev/null +++ b/projects/lithuania/pelias.json @@ -0,0 +1,59 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + } + }, + "imports": { + "geonames": { + "datapath": "/data/geonames", + "countryCode": "LT" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/europe/lithuania-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "lithuania-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["lt/countrywide.csv", "lt/city_of_vilnius.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "LT", + "importPostalcodes": false, + "importPlace": [ "85633269" ] + } + } +} diff --git a/projects/los-angeles-metro/.env b/projects/los-angeles-metro/.env index c653e9d4..88d6da2f 100644 --- a/projects/los-angeles-metro/.env +++ b/projects/los-angeles-metro/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/los-angeles-metro -DOCKER_USER=1000 diff --git a/projects/los-angeles-metro/README.md b/projects/los-angeles-metro/README.md index 2b3938d8..defdad17 100644 --- a/projects/los-angeles-metro/README.md +++ b/projects/los-angeles-metro/README.md @@ -11,6 +11,8 @@ The minimum configuration required in order to run this project are [installing Please ensure that's all working fine before continuing. +This project requires about 30 GB of disk space. + # Run a Build To run a complete build, execute the following commands: diff --git a/projects/los-angeles-metro/docker-compose.yml b/projects/los-angeles-metro/docker-compose.yml index 78d61c9f..a1276b81 100644 --- a/projects/los-angeles-metro/docker-compose.yml +++ b/projects/los-angeles-metro/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -23,7 +23,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -32,7 +32,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -86,7 +86,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -96,16 +96,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/los-angeles-metro/pelias.json b/projects/los-angeles-metro/pelias.json index d7d61918..edca34b8 100644 --- a/projects/los-angeles-metro/pelias.json +++ b/projects/los-angeles-metro/pelias.json @@ -41,7 +41,7 @@ }, "geonames": { "datapath": "/data/geonames", - "countryCode": "ALL" + "countryCode": "US" }, "openstreetmap": { "download": [ @@ -65,8 +65,8 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true, + "countryCode": "US", "importPlace": [ "102086957" ] diff --git a/projects/los-angeles-metro/synonyms/custom_street.txt b/projects/los-angeles-metro/synonyms/custom_street.txt index 7b1b6558..ea4490cd 100644 --- a/projects/los-angeles-metro/synonyms/custom_street.txt +++ b/projects/los-angeles-metro/synonyms/custom_street.txt @@ -14,7 +14,7 @@ jewvi,juvi,juvenile first,1st second,2nd third,3rd -forth,4th +fourth,4th fifth,5th sixth,6th seventh,7th diff --git a/projects/netherlands/.env b/projects/netherlands/.env index 46914820..cb085709 100644 --- a/projects/netherlands/.env +++ b/projects/netherlands/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias -DOCKER_USER=1000 DATA_DIR=/tmp/pelias/netherlands diff --git a/projects/netherlands/docker-compose.yml b/projects/netherlands/docker-compose.yml index 8ffc4b65..c0f50faa 100644 --- a/projects/netherlands/docker-compose.yml +++ b/projects/netherlands/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -77,7 +77,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,16 +87,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" diff --git a/projects/netherlands/pelias.json b/projects/netherlands/pelias.json index 21ccf5d8..57790cf7 100644 --- a/projects/netherlands/pelias.json +++ b/projects/netherlands/pelias.json @@ -58,9 +58,9 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, + "countryCode": "NL", "importPostalcodes": true, "importPlace": [ "85633337" ] } } -} \ No newline at end of file +} diff --git a/projects/new-york-city/.env b/projects/new-york-city/.env new file mode 100644 index 00000000..a70d2004 --- /dev/null +++ b/projects/new-york-city/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/new-york-city diff --git a/projects/new-york-city/README.md b/projects/new-york-city/README.md new file mode 100644 index 00000000..fd67fd06 --- /dev/null +++ b/projects/new-york-city/README.md @@ -0,0 +1,34 @@ + +# New York City + +This project is configured to download/prepare/build a complete Pelias installation for New York City, New York. + +# Setup + +Please refer to the instructions at https://github.com/pelias/docker in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +pelias test run +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + +http://localhost:4000/v1/search?text=111+8th+ave+nyc diff --git a/projects/new-york-city/blacklist/osm.txt b/projects/new-york-city/blacklist/osm.txt new file mode 100644 index 00000000..e69de29b diff --git a/projects/new-york-city/docker-compose.yml b/projects/new-york-city/docker-compose.yml new file mode 100644 index 00000000..cd8c0596 --- /dev/null +++ b/projects/new-york-city/docker-compose.yml @@ -0,0 +1,136 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + geonames: + image: pelias/geonames:master + container_name: pelias_geonames + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + transit: + image: pelias/transit:master + container_name: pelias_transit + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + fuzzy-tester: + image: pelias/fuzzy-tester:master + container_name: pelias_fuzzy_tester + user: "${DOCKER_USER}" + restart: "no" + command: "--help" + volumes: + - "./pelias.json:/code/pelias.json" + - "./test_cases:/code/pelias/fuzzy-tester/test_cases" diff --git a/projects/new-york-city/pelias.json b/projects/new-york-city/pelias.json new file mode 100644 index 00000000..0ac7edba --- /dev/null +++ b/projects/new-york-city/pelias.json @@ -0,0 +1,108 @@ +{ + "logger": { + "level": "info", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "acceptance-tests": { + "endpoints": { + "docker": "http://api:4000/v1/" + } + }, + "api": { + "services": { + "placeholder": { "url": "http://placeholder:4100" }, + "pip": { "url": "http://pip:4200" }, + "interpolation": { "url": "http://interpolation:4300" }, + "libpostal": { "url": "http://libpostal:4400" } + }, + "defaultParameters": { + "focus.point.lat": 45.52, + "focus.point.lon": -122.67 + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "blacklist": { + "files": [ + "/data/blacklist/osm.txt" + ] + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "US" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "https://s3.amazonaws.com/metro-extracts.nextzen.org/new-york_new-york.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "new-york_new-york.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": [ + "us/ny/city_of_new_york.csv" + ] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "importPostalcodes": true, + "countryCode": "US", + "importPlace": [ + "85977539" + ] + }, + "transit": { + "datapath": "/data/transit", + "feeds": [ + { + "layerId": "stops", + "url": "http://web.mta.info/developers/data/nyct/subway/google_transit.zip", + "filename": "NYC-subway-stops.txt", + "agencyId": "MTA NYCT", + "agencyName": "MTA NYCT", + "layerName": "Stop" + } + ] + }, + "interpolation": { + "download": { + "tiger": { + "datapath": "/data/tiger", + "states": [ + { "state_code": 36, "county_code": 81, "name": "Queens County, NY" }, + { "state_code": 36, "county_code": 85, "name": "Richmond County, NY" }, + { "state_code": 36, "county_code": 61, "name": "New York County, NY" }, + { "state_code": 36, "county_code": 47, "name": "Kings County, NY" }, + { "state_code": 36, "county_code": 5, "name": "Bronx County, NY" } + + ] + } + } + } + } +} diff --git a/projects/new-york-city/synonyms/custom_name.txt b/projects/new-york-city/synonyms/custom_name.txt new file mode 100644 index 00000000..fc5f627c --- /dev/null +++ b/projects/new-york-city/synonyms/custom_name.txt @@ -0,0 +1,17 @@ + +shopping,store,shop,retail,grocery,mall + +north, N +south, S +east, E +west, W +north west => northwest +north east => northeast +south west => southwest +south east => southeast +northwest, NW +northeast, NE +southwest, SW +southeast, SE + +Int'l, international \ No newline at end of file diff --git a/projects/new-york-city/synonyms/custom_street.txt b/projects/new-york-city/synonyms/custom_street.txt new file mode 100644 index 00000000..f98f640b --- /dev/null +++ b/projects/new-york-city/synonyms/custom_street.txt @@ -0,0 +1,125 @@ +Transit Center => TC +Park Ride => PR +Park & Ride => PR +Park and Ride => PR +carshare,car2go,Zipcar,Flexcar,GetAround,ucarshare,uhaul,hertz,wecar,enterprise +ticket,fare,outlet,store,retail +dmv,motor,vehicles +court house => courthouse +court-house => courthouse +cc,court,courts,courth,courthouse +law,jail,prison,jail,courthouse,enforcement,juvenile,justice,juvenile,correctional +jewvi,juvi,juvenile + +first,1st +second,2nd +third,3rd +fourth,4th +fifth,5th +sixth,6th +seventh,7th +eighth,8th +nineth,9th +tenth,10th +eleventh,11th +twelfth,12th +thirteenth,13th +fourteenth,14th +fifteenth,15th +sixteenth,16th +seventeenth,17th +eighteenth,18th +nineteenth,19th +twentyth,20th +twentyfirst,21st +twentysecond,22nd +twentythrid,23rd + +# USPS Suffix Abbreviations +# http://www.usps.com/ncsc/lookups/abbreviations.html#suffix +st,st.,street,str +ave,ave.,av,av.,avenue,AVNUE,AVENUE,AVENU +dr,drive,dr.,drv,driv,drives +BOULEVARD,BLVD,BOULEVARD,BOUL,BOULEVARD,BOULEVARD,BOULV +BRIDGE,BRDGE,BRG +BYPASS,BYP,BYPA,BYPAS,BYPS +CLIFF,CLF,CLIFFS,CLFS +CLUB,CLB +COMMON,CMN +CORNER,COR,CORNERS,CORS +CENTER,CEN,CENT,CENTER,CENTR,CENTRE,CNTER,CNTR,CTR,CENTERS,CTRS +CIR,CIRC,CIRCL,CIRCLE,CRCL,CIRCLE,CRCLE +COURT,CRT,CT,COURTS +CTSCK,CR,CREEK,CRK +CROSSING,CRSSING,CRSSNG,XING +CRECENT,CRES,CRESCENT,CRESENT,CRSCNT,CRSENT,CRSNT +EXP,EXPR,EXPRESS,EXPRESSWAY,EXPW,EXPY +FALL,FALLS,FLS +FERRY,FRRY,FRY +FIELD,FLD,FIELDS,FLDS +FREEWAY,FREEWY,FRWAY,FRWY,FWY +GARDEN,GARDN,GDN,GRDEN,GRDN,GARDENS,GDNS,GRDNS +GATEWAY,GATEWY,GATWAY,GTWAY,GTWY +GROV,GROVE,GRV,GROVES +HARB,HARBOR,HARBR,HBR,HRBOR,HARBORS +HEIGHT,HEIGHTS,HGTS,HT,HTS +HIGHWAY,HIGHWY,HIWAY,HIWY,HWAY,HWY +HILL,HL,HILLS,HLS +IS,ISLAND,ISLND,ISLANDS,ISLNDS,ISS,ISLE,ISLES +JCT,JCTION,JCTN,JUNCTION,JUNCTN,JUNCTON,JCTNS,JCTS,JUNCTIONS +LAKE,LK,LAKES,LKS +LANDING,LNDG,LNDNG +LA,LANE,LANES,LN +LOOP,LOOPS,LP +MANOR,MNR,MANORS,MNRS +MDW,MEADOW,MDWS,MEADOWS,MEDOWS +MILL,ML,MILLS,MLS +MNT,MOUNT,MT +MNTAIN,MNTN,MOUNTAIN,MOUNTIN,MTIN,MTN,MNTNS,MOUNTAINS +ORCH,ORCHARD,ORCHRD +PARK,PK,PRK,PARKS +PARKWAY,PARKWY,PKWAY,PKWY,PKY,PARKWAYS,PKWYS +PLAZA,PLZ,PLZA +PLACE,PL +PR,PRAIRIE,PRARIE,PRR +RANCH,RANCHES,RNCH,RNCHS +RDG,RDGE,RIDGE,RDGS,RIDGES +RIV,RIVER,RIVR,RVR +RD,ROAD,RDS,ROADS +RTESHLS,SHOALS +SHOAR,SHORE,SHR,SHOARS,SHORES,SHRS +SPG,SPNG,SPRING,SPRNG,SPGS,SPNGS,SPRINGS,SPRNGS +SQ,SQR,SQRE,SQU,SQUARE,SQRS,SQUARES +STA,STATION,STATN,STN +STREAM,STREME,STRM +ST,STR,STREET,STRT,STREETS +SMT,SUMIT,SUMITT,SUMMIT +TER,TERR,TERRACE +TR,TRAIL,TRAILS,TRL,TRLS +TUNEL,TUNL,TUNLS,TUNNEL,TUNNELS,TUNNL +UN,UNION,UNIONS +VALLEY,VALLY,VLLY,VLY,VALLEYS,VLYS +VDCT,VIA,VIADCT,VIADUCT +VIEW,VW,VIEWS,VWS +VILL,VILLAG,VILLAGE,VILLG,VILLIAGE,VLG,VILLAGES,VLGS +VILLE,VL +VIS,VIST,VISTA,VST,VSTA +WAY,WY,WAYS + +north, N +south, S +east, E +west, W +north west => northwest +north east => northeast +south west => southwest +south east => southeast +northwest, NW +northeast, NE +southwest, SW +southeast, SE + +broadway st => broadway +broadway street => broadway +broadway ave => broadway +broadway avenue => broadway diff --git a/projects/new-york-city/test_cases/search_address.json b/projects/new-york-city/test_cases/search_address.json new file mode 100644 index 00000000..e9a5fc6e --- /dev/null +++ b/projects/new-york-city/test_cases/search_address.json @@ -0,0 +1,73 @@ +{ + "name": "/v1/search address", + "description": "addresses in New York, NY", + "priorityThresh": 1, + "normalizers": { + "name": [ + "toUpperCase", + "removeOrdinals", + "stripPunctuation", + "abbreviateDirectionals", + "abbreviateStreetSuffixes" + ] + }, + "tests": [ + { + "id": 1, + "status": "pass", + "in": { + "text": "111 8th ave nyc" + }, + "expected": { + "properties": [ + { + "name": "111 8th ave", + "locality": "New York", + "region": "New York", + "region_a": "NY" + } + ] + } + }, + { + "id": 2, + "status": "pass", + "in": { + "text": "63-07 Saunders St rego park ny" + }, + "expected": { + "properties": [ + { + "name": "63-07 Saunders St", + "locality": "New York", + "region": "New York", + "region_a": "NY", + "borough": "Queens", + "county": "Queens County", + "label": "63-07 Saunders St, Queens, New York, NY, USA" + } + ] + } + }, + { + "id": 3, + "status": "pass", + "in": { + "text": "52 Ten Eyck St Brooklyn NY" + }, + "expected": { + "properties": [ + { + "name": "52 Ten Eyck St", + "locality": "New York", + "region": "New York", + "region_a": "NY", + "borough": "Brooklyn", + "county": "Kings County", + "label": "52 Ten Eyck St, Brooklyn, New York, NY, USA" + } + ] + } + } + ] +} diff --git a/projects/new-york-city/test_cases/search_venue.json b/projects/new-york-city/test_cases/search_venue.json new file mode 100644 index 00000000..eeb4a36c --- /dev/null +++ b/projects/new-york-city/test_cases/search_venue.json @@ -0,0 +1,28 @@ +{ + "name": "/v1/search venues", + "priorityThresh": 1, + "endpoint": "search", + "tests": [ + { + "id": 1, + "status": "pass", + "notes": "John F. Kennedy International Airport should come up for JFK", + "in": { + "text": "JFK" + }, + "expected": { + "properties": [ + { + "layer": "venue", + "name": "John F. Kennedy International Airport", + "country_a": "USA", + "country": "United States", + "region": "New York", + "region_a": "NY", + "locality": "New York" + } + ] + } + } + ] +} diff --git a/projects/north-america/.env b/projects/north-america/.env index 7ca1d6c5..d60970fa 100644 --- a/projects/north-america/.env +++ b/projects/north-america/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/north-america -DOCKER_USER=1000 diff --git a/projects/north-america/README.md b/projects/north-america/README.md index 8c8047e5..34171903 100644 --- a/projects/north-america/README.md +++ b/projects/north-america/README.md @@ -4,7 +4,7 @@ This project is configured to download/prepare/build a complete Pelias installat As a fairly large build, this will require significant resources to complete quickly. It can still run on a personal computer with 8GB+ RAM, but will take a while. It will require 300GB or so of disk space. -Running an interpolation build of this side would also take many days +Running an interpolation build of this size would also take many days Additionally, it requires a polylines file generated with [Valhalla](https://github.com/valhalla). @@ -14,7 +14,7 @@ Please refer to the instructions at https://github.com/pelias/docker in order to The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). -This build also requires [obtaining or generating a polylines file from Valhalla](https://github.com/pelias/polylines/wiki/Generating-polylines-from-Valhalla). Once you have the polylines file, you must move it to `polylines/extract.0sv`. +This build also requires [obtaining or generating a polylines file from Valhalla](https://github.com/pelias/polylines/wiki/Generating-polylines-from-Valhalla). Once you have the polylines file, you must move it to `polylines/extract.0sv`. You can also download the latest `north-america-valhalla.polylines.0sv.gz`, move and rename from: https://geocode.earth/data/ Please ensure that's all working fine before continuing. @@ -38,4 +38,4 @@ pelias test run You can now make queries against your new Pelias build: -[http://localhost:4000/v1/search?text=empire state building](http://localhost:4000/v1/search?text=empire state building) +[http://localhost:4000/v1/search?text=empire state building](http://localhost:4000/v1/search?text=empire%20state%20building) diff --git a/projects/north-america/docker-compose.yml b/projects/north-america/docker-compose.yml index a740a8d8..4e764645 100644 --- a/projects/north-america/docker-compose.yml +++ b/projects/north-america/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -95,7 +95,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -105,17 +105,17 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always environment: [ "ES_JAVA_OPTS=-Xmx8g" ] - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/north-america/pelias.json b/projects/north-america/pelias.json index 28570b29..787ebf34 100644 --- a/projects/north-america/pelias.json +++ b/projects/north-america/pelias.json @@ -35,6 +35,12 @@ "adminLookup": { "enabled": true }, + "csv": { + "datapath": "/data/csv", + "files": [], + "download": [ + ] + }, "geonames": { "datapath": "/data/geonames", "countryCode": "US" @@ -1833,6 +1839,8 @@ "whosonfirst": { "datapath": "/data/whosonfirst", "importPostalcodes": true, + "countryCode": ["AI", "AG", "AW", "BS", "BB", "BZ", "BM", "BQ", "BO", "VG", "KY", "CA", + "CR", "CU", "CW", "DM", "DO", "SV", "GD", "GL", "GT", "HT", "HN", "JM", "MQ", "MS", "NI", "VE", "PA", "PR", "BL", "KN", "LC", "PM", "VC", "SX", "MF", "MX", "TT", "TC", "US", "VI"], "importPlace": "102191575" }, "interpolation": { diff --git a/projects/norway/.env b/projects/norway/.env new file mode 100644 index 00000000..046430ea --- /dev/null +++ b/projects/norway/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/norway diff --git a/projects/norway/README.md b/projects/norway/README.md new file mode 100644 index 00000000..c857b72e --- /dev/null +++ b/projects/norway/README.md @@ -0,0 +1,32 @@ +# Norway area + +This project is configured to download/prepare/build a complete Pelias installation for Norway. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/norway/docker-compose.yml b/projects/norway/docker-compose.yml new file mode 100644 index 00000000..c0f50faa --- /dev/null +++ b/projects/norway/docker-compose.yml @@ -0,0 +1,112 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/projects/norway/elasticsearch.yml b/projects/norway/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/norway/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/norway/pelias.json b/projects/norway/pelias.json new file mode 100644 index 00000000..f9c72274 --- /dev/null +++ b/projects/norway/pelias.json @@ -0,0 +1,62 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "NO" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/europe/norway-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "norway-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["no/countrywide.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "NO", + "importPostalcodes": true, + "importPlace": [ "85633341" ] + } + } +} diff --git a/projects/planet/.env b/projects/planet/.env index 98bede5d..d7f792c9 100644 --- a/projects/planet/.env +++ b/projects/planet/.env @@ -1,4 +1,3 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/data -DOCKER_USER=1000 ENABLE_GEONAMES=true diff --git a/projects/planet/acceptance-tests b/projects/planet/acceptance-tests index 96817ba4..1cdcb109 160000 --- a/projects/planet/acceptance-tests +++ b/projects/planet/acceptance-tests @@ -1 +1 @@ -Subproject commit 96817ba4442ac7c4e87c5143005c363804a10fe2 +Subproject commit 1cdcb109978485736b5a7f4318d5403994763af1 diff --git a/projects/planet/docker-compose.yml b/projects/planet/docker-compose.yml index a740a8d8..4e764645 100644 --- a/projects/planet/docker-compose.yml +++ b/projects/planet/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -95,7 +95,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -105,17 +105,17 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always environment: [ "ES_JAVA_OPTS=-Xmx8g" ] - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/planet/pelias.json b/projects/planet/pelias.json index dbfbe922..b3865b41 100644 --- a/projects/planet/pelias.json +++ b/projects/planet/pelias.json @@ -60,7 +60,6 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true }, "interpolation": { diff --git a/projects/poland/.env b/projects/poland/.env new file mode 100644 index 00000000..c27c8edb --- /dev/null +++ b/projects/poland/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=./data diff --git a/projects/poland/README.md b/projects/poland/README.md new file mode 100644 index 00000000..bf75aa01 --- /dev/null +++ b/projects/poland/README.md @@ -0,0 +1,35 @@ +# Poland + +This project is configured to download/prepare/build a complete Pelias installation for Poland. + +# Setup + +Please refer to the instructions at in order to install and configure your docker environment. + +Given the coverage provided by OpenAddresses is somewhat sparse, it's worth examining the configuration and the OpenAddresses coverage to understand your queries. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +pelias test run +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + + diff --git a/projects/poland/docker-compose.yml b/projects/poland/docker-compose.yml new file mode 100644 index 00000000..e08e1724 --- /dev/null +++ b/projects/poland/docker-compose.yml @@ -0,0 +1,128 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + transit: + image: pelias/transit:master + container_name: pelias_transit + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined + fuzzy-tester: + image: pelias/fuzzy-tester:master + container_name: pelias_fuzzy_tester + user: "${DOCKER_USER}" + restart: "no" + command: "--help" + volumes: + - "./pelias.json:/code/pelias.json" + - "./test_cases:/code/pelias/fuzzy-tester/test_cases" diff --git a/projects/poland/elasticsearch.yml b/projects/poland/elasticsearch.yml new file mode 100644 index 00000000..ca137940 --- /dev/null +++ b/projects/poland/elasticsearch.yml @@ -0,0 +1,4 @@ +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/projects/poland/pelias.json b/projects/poland/pelias.json new file mode 100644 index 00000000..bfac46b3 --- /dev/null +++ b/projects/poland/pelias.json @@ -0,0 +1,99 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { + "host": "elasticsearch" + } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "acceptance-tests": { + "endpoints": { + "docker": "http://api:4000/v1/" + } + }, + "api": { + "services": { + "pip": { + "url": "http://pip:4200" + }, + "libpostal": { + "url": "http://libpostal:4400" + }, + "placeholder": { + "url": "http://placeholder:4100" + }, + "interpolation": { + "url": "http://interpolation:4300" + } + } + }, + "imports": { + "geonames": { + "datapath": "/data/geonames", + "countryCode": "PL" + }, + "openstreetmap": { + "download": [ + { + "sourceURL": "http://download.geofabrik.de/europe/poland-latest.osm.pbf" + } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [ + { + "filename": "poland-latest.osm.pbf" + } + ] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": [ + "pl/dolnoslaskie.csv", + "pl/kujawsko-pomorskie.csv", + "pl/lodzkie.csv", + "pl/lubelskie.csv", + "pl/lubuskie.csv", + "pl/malopolskie.csv", + "pl/mazowieckie.csv", + "pl/opolskie.csv", + "pl/podkarpackie.csv", + "pl/podlaskie.csv", + "pl/pomorskie.csv", + "pl/slaskie.csv", + "pl/swietokrzyskie.csv", + "pl/warminsko-mazurskie.csv", + "pl/wielkopolskie.csv", + "pl/zachodniopomorskie.csv" + ] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ + "extract.0sv" + ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "PL", + "importPostalcodes": false, + "importPlace": [ + "85633723" + ] + } + } +} diff --git a/projects/poland/test_cases/search_address.json b/projects/poland/test_cases/search_address.json new file mode 100644 index 00000000..e27f6409 --- /dev/null +++ b/projects/poland/test_cases/search_address.json @@ -0,0 +1,32 @@ +{ + "name": "/v1/search address", + "description": "addresses in Poland", + "priorityThresh": 1, + "normalizers": { + "name": [ + "toUpperCase", + "removeOrdinals", + "stripPunctuation", + "abbreviateDirectionals", + "abbreviateStreetSuffixes" + ] + }, + "tests": [ + { + "id": 1, + "status": "pass", + "in": { + "text": "sulejówek" + }, + "expected": { + "properties": [ + { + "name": "SULEJWEK", + "locality": "Sulejówek", + "country_a": "POL" + } + ] + } + } + ] +} diff --git a/projects/portland-metro/.env b/projects/portland-metro/.env index 7985c1a0..136b49ab 100644 --- a/projects/portland-metro/.env +++ b/projects/portland-metro/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/portland-metro -DOCKER_USER=1000 diff --git a/projects/portland-metro/docker-compose.yml b/projects/portland-metro/docker-compose.yml index 729f5026..ab4482e9 100644 --- a/projects/portland-metro/docker-compose.yml +++ b/projects/portland-metro/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,7 +87,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -97,16 +97,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/portland-metro/pelias.json b/projects/portland-metro/pelias.json index 9f37e359..2de88f6b 100644 --- a/projects/portland-metro/pelias.json +++ b/projects/portland-metro/pelias.json @@ -57,7 +57,7 @@ }, "openstreetmap": { "download": [ - { "sourceURL": "https://s3.amazonaws.com/metro-extracts.nextzen.org/portland_oregon.osm.pbf" } + { "sourceURL": "https://data.geocode.earth/archive/portland-metro/2022-06-20/portland_oregon.osm.pbf" } ], "leveldbpath": "/tmp", "datapath": "/data/openstreetmap", @@ -83,8 +83,8 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true, + "countryCode": "US", "importPlace": [ "85688513", "85688623" @@ -95,7 +95,7 @@ "feeds": [ { "layerId": "bikeshare", - "url": "http://biketownpdx.socialbicycles.com/opendata/station_information.json", + "url": "https://gbfs.biketownpdx.com/gbfs/en/station_information.json", "filename": "BIKETOWN-hubs.json", "agencyId": "BIKETOWN", "agencyName": "BIKETOWN", @@ -111,7 +111,7 @@ }, { "layerId": "stops", - "url": "http://www.c-tran.com/images/Google/GoogleTransitUpload.zip", + "url": "https://data.geocode.earth/archive/portland-metro/2022-06-20/C-TRAN.zip", "filename": "C-TRAN-stops.txt", "agencyId": "C-TRAN", "agencyName": "C-TRAN", diff --git a/projects/portland-metro/synonyms/custom_street.txt b/projects/portland-metro/synonyms/custom_street.txt index 32a4be71..3bfbef11 100644 --- a/projects/portland-metro/synonyms/custom_street.txt +++ b/projects/portland-metro/synonyms/custom_street.txt @@ -24,7 +24,7 @@ jewvi,juvi,juvenile first,1st second,2nd third,3rd -forth,4th +fourth,4th fifth,5th sixth,6th seventh,7th diff --git a/projects/portland-metro/test_cases/search_address.json b/projects/portland-metro/test_cases/search_address.json index 0a6c2799..cf2a7526 100644 --- a/projects/portland-metro/test_cases/search_address.json +++ b/projects/portland-metro/test_cases/search_address.json @@ -14,7 +14,7 @@ "tests": [ { "id": 1, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Blvd, Portland, OR" }, @@ -31,7 +31,7 @@ }, { "id": 2, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Blvd, Portland, Oregon" }, @@ -48,7 +48,7 @@ }, { "id": 3, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Blvd Portland OR" }, @@ -65,7 +65,7 @@ }, { "id": 4, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Blvd Portland Oregon" }, @@ -82,7 +82,7 @@ }, { "id": 5, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Jr Blvd, Portland, OR" }, @@ -99,7 +99,7 @@ }, { "id": 6, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Jr Blvd, Portland, Oregon" }, @@ -116,7 +116,7 @@ }, { "id": 7, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Jr Blvd Portland OR" }, @@ -133,7 +133,7 @@ }, { "id": 8, - "status": "pass", + "status": "fail", "in": { "text": "777 NE MLK Jr Blvd Portland Oregon" }, @@ -150,7 +150,7 @@ }, { "id": 9, - "status": "pass", + "status": "fail", "in": { "text": "777 NE ML King Blvd, Portland, OR" }, @@ -167,7 +167,7 @@ }, { "id": 10, - "status": "pass", + "status": "fail", "in": { "text": "777 NE ML King Blvd, Portland, Oregon" }, @@ -184,7 +184,7 @@ }, { "id": 11, - "status": "pass", + "status": "fail", "in": { "text": "777 NE ML King Blvd Portland OR" }, @@ -201,7 +201,7 @@ }, { "id": 12, - "status": "pass", + "status": "fail", "in": { "text": "777 NE ML King Blvd Portland Oregon" }, @@ -235,7 +235,7 @@ }, { "id": 13, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BH Hwy, Portland, OR" }, @@ -252,7 +252,7 @@ }, { "id": 14, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BH Hwy, Portland, Oregon" }, @@ -269,7 +269,7 @@ }, { "id": 15, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BH Hwy Portland OR" }, @@ -286,7 +286,7 @@ }, { "id": 16, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BH Hwy Portland Oregon" }, @@ -303,7 +303,7 @@ }, { "id": 17, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BHH, Portland, OR" }, @@ -320,7 +320,7 @@ }, { "id": 18, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BHH, Portland, Oregon" }, @@ -337,7 +337,7 @@ }, { "id": 19, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BHH Portland OR" }, @@ -354,7 +354,7 @@ }, { "id": 20, - "status": "pass", + "status": "fail", "in": { "text": "4004 SW BHH Portland Oregon" }, @@ -575,7 +575,8 @@ }, { "id": 33, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TV Hwy, aloha, OR" }, @@ -592,7 +593,8 @@ }, { "id": 34, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TV Hwy, aloha, Oregon" }, @@ -609,7 +611,8 @@ }, { "id": 35, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TV Hwy aloha OR" }, @@ -626,7 +629,8 @@ }, { "id": 36, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TV Hwy aloha Oregon" }, @@ -643,7 +647,8 @@ }, { "id": 37, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TVH, aloha, OR" }, @@ -660,7 +665,8 @@ }, { "id": 38, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TVH, aloha, Oregon" }, @@ -677,7 +683,8 @@ }, { "id": 39, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TVH aloha OR" }, @@ -694,7 +701,8 @@ }, { "id": 40, - "status": "pass", + "status": "fail", + "description": "address is in beaverton", "in": { "text": "17175 SW TVH aloha Oregon" }, @@ -4791,7 +4799,8 @@ }, { "id": 281, - "status": "pass", + "status": "fail", + "description": "there is no NE Broadway St, road name is SE Broadway", "in": { "text": "1231 NE BROADWAY ST, Portland, OR" }, @@ -4808,7 +4817,8 @@ }, { "id": 282, - "status": "pass", + "status": "fail", + "description": "there is no NE Broadway St, road name is SE Broadway", "in": { "text": "1231 NE BROADWAY ST, Portland, Oregon" }, @@ -4825,7 +4835,8 @@ }, { "id": 283, - "status": "pass", + "status": "fail", + "description": "there is no NE Broadway St, road name is SE Broadway", "in": { "text": "1231 NE BROADWAY ST Portland OR" }, @@ -4842,7 +4853,8 @@ }, { "id": 284, - "status": "pass", + "status": "fail", + "description": "there is no NE Broadway St, road name is SE Broadway", "in": { "text": "1231 NE BROADWAY ST Portland Oregon" }, @@ -6933,7 +6945,7 @@ }, { "id": 407, - "status": "fail", + "status": "pass", "in": { "text": "OREGON ZOO Portland OR" }, @@ -6950,7 +6962,7 @@ }, { "id": 408, - "status": "fail", + "status": "pass", "in": { "text": "OREGON ZOO Portland Oregon" }, @@ -7375,7 +7387,7 @@ }, { "id": 433, - "status": "pass", + "status": "fail", "in": { "text": "1000 SW BROADWAY ST, Portland, OR" }, @@ -7392,7 +7404,7 @@ }, { "id": 434, - "status": "pass", + "status": "fail", "in": { "text": "1000 SW BROADWAY ST, Portland, Oregon" }, @@ -7409,7 +7421,7 @@ }, { "id": 435, - "status": "pass", + "status": "fail", "in": { "text": "1000 SW BROADWAY ST Portland OR" }, @@ -7426,7 +7438,7 @@ }, { "id": 436, - "status": "pass", + "status": "fail", "in": { "text": "1000 SW BROADWAY ST Portland Oregon" }, diff --git a/projects/portland-metro/test_cases/search_venue.json b/projects/portland-metro/test_cases/search_venue.json index 7ac2ba57..c4aac0b1 100644 --- a/projects/portland-metro/test_cases/search_venue.json +++ b/projects/portland-metro/test_cases/search_venue.json @@ -5,7 +5,7 @@ "tests": [ { "id": 1, - "status": "fail", + "status": "pass", "notes": "portland international should come up for PDX", "in": { "text": "pdx" @@ -26,7 +26,7 @@ }, { "id": 2, - "status": "fail", + "status": "pass", "notes": "portland international should come up for PDX", "in": { "text": "pdx airport" diff --git a/projects/san-jose-metro/.env b/projects/san-jose-metro/.env index afb10214..488d7312 100644 --- a/projects/san-jose-metro/.env +++ b/projects/san-jose-metro/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/san-jose-metro -DOCKER_USER=1000 diff --git a/projects/san-jose-metro/docker-compose.yml b/projects/san-jose-metro/docker-compose.yml index 78d61c9f..a1276b81 100644 --- a/projects/san-jose-metro/docker-compose.yml +++ b/projects/san-jose-metro/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -23,7 +23,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -32,7 +32,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -86,7 +86,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -96,16 +96,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/san-jose-metro/pelias.json b/projects/san-jose-metro/pelias.json index fc9780a6..668f774e 100644 --- a/projects/san-jose-metro/pelias.json +++ b/projects/san-jose-metro/pelias.json @@ -41,7 +41,7 @@ }, "geonames": { "datapath": "/data/geonames", - "countryCode": "ALL" + "countryCode": "US" }, "openstreetmap": { "download": [ @@ -71,8 +71,8 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true, + "countryCode": "US", "importPlace": [ "1360665447" ] diff --git a/projects/san-jose-metro/synonyms/custom_street.txt b/projects/san-jose-metro/synonyms/custom_street.txt index 7b1b6558..ea4490cd 100644 --- a/projects/san-jose-metro/synonyms/custom_street.txt +++ b/projects/san-jose-metro/synonyms/custom_street.txt @@ -14,7 +14,7 @@ jewvi,juvi,juvenile first,1st second,2nd third,3rd -forth,4th +fourth,4th fifth,5th sixth,6th seventh,7th diff --git a/projects/singapore/.env b/projects/singapore/.env index 67de74b2..921597a6 100644 --- a/projects/singapore/.env +++ b/projects/singapore/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias DATA_DIR=/tmp/pelias/singapore -DOCKER_USER=1000 diff --git a/projects/singapore/docker-compose.yml b/projects/singapore/docker-compose.yml index 0e3df03b..7d90b8e0 100644 --- a/projects/singapore/docker-compose.yml +++ b/projects/singapore/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -21,7 +21,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -30,7 +30,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -82,7 +82,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -92,16 +92,16 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/singapore/pelias.json b/projects/singapore/pelias.json index 7dbc4bd0..c50eef19 100644 --- a/projects/singapore/pelias.json +++ b/projects/singapore/pelias.json @@ -60,10 +60,9 @@ "files": [ "extract.0sv" ] }, "whosonfirst": { - "sqlite": true, "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true, + "countryCode": "SG", "importPlace": [ "85632605" ] diff --git a/projects/south-africa/.env b/projects/south-africa/.env index 2887638d..5dab96a8 100644 --- a/projects/south-africa/.env +++ b/projects/south-africa/.env @@ -1,3 +1,2 @@ COMPOSE_PROJECT_NAME=pelias_za DATA_DIR=/tmp/pelias/pelias_za -DOCKER_USER=1000 diff --git a/projects/south-africa/docker-compose.yml b/projects/south-africa/docker-compose.yml index 29cda7ca..afade7f4 100644 --- a/projects/south-africa/docker-compose.yml +++ b/projects/south-africa/docker-compose.yml @@ -8,7 +8,7 @@ services: container_name: pelias_libpostal user: "${DOCKER_USER}" restart: always - ports: [ "4400:4400" ] + ports: [ "127.0.0.1:4400:4400" ] schema: image: pelias/schema:master container_name: pelias_schema @@ -23,7 +23,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4000" ] - ports: [ "4000:4000" ] + ports: [ "0.0.0.0:4000:4000" ] volumes: - "./pelias.json:/code/pelias.json" placeholder: @@ -32,7 +32,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4100" ] - ports: [ "4100:4100" ] + ports: [ "127.0.0.1:4100:4100" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -87,7 +87,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4300" ] - ports: [ "4300:4300" ] + ports: [ "127.0.0.1:4300:4300" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -97,7 +97,7 @@ services: user: "${DOCKER_USER}" restart: always environment: [ "PORT=4200" ] - ports: [ "4200:4200" ] + ports: [ "127.0.0.1:4200:4200" ] volumes: - "./pelias.json:/code/pelias.json" - "${DATA_DIR}:/data" @@ -105,15 +105,15 @@ services: image: nginx container_name: pelias_preview restart: always - ports: [ "3000:80" ] + ports: [ "127.0.0.1:3000:80" ] volumes: - "../../common/preview:/usr/share/nginx/html" elasticsearch: - image: pelias/elasticsearch:7.5.1 + image: pelias/elasticsearch:7.17.27 container_name: pelias_elasticsearch user: "${DOCKER_USER}" restart: always - ports: [ "9200:9200", "9300:9300" ] + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] volumes: - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" ulimits: diff --git a/projects/south-africa/pelias.json b/projects/south-africa/pelias.json index 10457b47..9f42f033 100644 --- a/projects/south-africa/pelias.json +++ b/projects/south-africa/pelias.json @@ -65,8 +65,8 @@ }, "whosonfirst": { "datapath": "/data/whosonfirst", - "importVenues": false, "importPostalcodes": true, + "countryCode": "ZA", "importPlace": [ "85633813" ] diff --git a/projects/south-africa/synonyms/custom_street.txt b/projects/south-africa/synonyms/custom_street.txt index 3a13de9c..d662620d 100644 --- a/projects/south-africa/synonyms/custom_street.txt +++ b/projects/south-africa/synonyms/custom_street.txt @@ -1,7 +1,7 @@ first,1st second,2nd third,3rd -forth,4th +fourth,4th fifth,5th sixth,6th seventh,7th diff --git a/projects/south-america/.env b/projects/south-america/.env new file mode 100644 index 00000000..5e9144c0 --- /dev/null +++ b/projects/south-america/.env @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/south-america diff --git a/projects/south-america/README.md b/projects/south-america/README.md new file mode 100644 index 00000000..b8444a89 --- /dev/null +++ b/projects/south-america/README.md @@ -0,0 +1,34 @@ + +# South América + +This project is configured to download/prepare/build a complete Pelias installation for the South América. + +# Setup + +Please refer to the instructions at https://github.com/pelias/docker in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +pelias test run +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + +http://localhost:4000/v1/search?text=Flores da Cunha diff --git a/projects/south-america/blacklist/osm.txt b/projects/south-america/blacklist/osm.txt new file mode 100644 index 00000000..e69de29b diff --git a/projects/south-america/docker-compose.yml b/projects/south-america/docker-compose.yml new file mode 100644 index 00000000..ab4482e9 --- /dev/null +++ b/projects/south-america/docker-compose.yml @@ -0,0 +1,128 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + transit: + image: pelias/transit:master + container_name: pelias_transit + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + fuzzy-tester: + image: pelias/fuzzy-tester:master + container_name: pelias_fuzzy_tester + user: "${DOCKER_USER}" + restart: "no" + command: "--help" + volumes: + - "./pelias.json:/code/pelias.json" + - "./test_cases:/code/pelias/fuzzy-tester/test_cases" diff --git a/projects/south-america/pelias.json b/projects/south-america/pelias.json new file mode 100644 index 00000000..9a558e32 --- /dev/null +++ b/projects/south-america/pelias.json @@ -0,0 +1,103 @@ +{ + "logger": { + "level": "info", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "3" + } + } + }, + "acceptance-tests": { + "endpoints": { + "docker": "http://api:4000/v1/" + } + }, + "api": { + "services": { + "placeholder": { "url": "http://placeholder:4100" }, + "pip": { "url": "http://pip:4200" }, + "interpolation": { "url": "http://interpolation:4300" }, + "libpostal": { "url": "http://libpostal:4400" } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "BR" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/south-america-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "south-america-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": [ + "br/ac/statewide.csv", + "br/al/statewide.csv", + "br/am/statewide.csv", + "br/ap/statewide.csv", + "br/ba/statewide.csv", + "br/ce/statewide.csv", + "br/df/statewide.csv", + "br/es/statewide.csv", + "br/go/statewide.csv", + "br/ma/statewide.csv", + "br/mg/statewide.csv", + "br/ms/statewide.csv", + "br/mt/statewide.csv", + "br/pa/statewide.csv", + "br/pb/statewide.csv", + "br/pe/statewide.csv", + "br/pi/statewide.csv", + "br/pr/statewide.csv", + "br/rj/statewide.csv", + "br/rn/statewide.csv", + "br/ro/statewide.csv", + "br/rr/statewide.csv", + "br/rs/statewide.csv", + "br/sc/statewide.csv", + "br/se/statewide.csv", + "br/sp/statewide.csv", + "br/to/statewide.csv", + "ar/c/city_of_buenos_aires.csv", + "cl/countrywide.csv", + "uy/countrywide.csv", + "uy/mo/montevideo.csv", + "co/ant/medellin.csv", + "co/bogota.csv" + ] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "importPostalcodes": true, + "countryCode": [ "AR", "BO", "BR", "CL", "GF", "EC", "GY", "PY", "PE", "SR", "UY", "VE" ], + "importPlace": [ + "102191577" + ] + } + } +} diff --git a/projects/texas/.env b/projects/texas/.env new file mode 100644 index 00000000..06fcf9c4 --- /dev/null +++ b/projects/texas/.env @@ -0,0 +1,3 @@ +COMPOSE_PROJECT_NAME=pelias +DATA_DIR=/tmp/pelias/texas +OPENADDRESSES_PARALLELISM=2 diff --git a/projects/texas/README.md b/projects/texas/README.md new file mode 100644 index 00000000..69893ca9 --- /dev/null +++ b/projects/texas/README.md @@ -0,0 +1,35 @@ +# Texas + +This project is configured to download/prepare/build a complete Pelias installation for the state of Texas, USA. + +It is intended as an example for other projects, feel free to copy->paste these files to a new project directory to kick-start your own project. + +# Setup + +Please refer to the instructions at https://github.com/pelias/docker in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment). + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +pelias download all +pelias prepare all +pelias import all +pelias compose up +pelias test run +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + +http://localhost:4000/v1/search?text=iah diff --git a/projects/texas/blacklist/osm.txt b/projects/texas/blacklist/osm.txt new file mode 100644 index 00000000..e69de29b diff --git a/projects/texas/docker-compose.yml b/projects/texas/docker-compose.yml new file mode 100644 index 00000000..ca8b6fb9 --- /dev/null +++ b/projects/texas/docker-compose.yml @@ -0,0 +1,130 @@ +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./synonyms/custom_name.txt:/code/pelias/schema/synonyms/custom_name.txt" + - "./synonyms/custom_street.txt:/code/pelias/schema/synonyms/custom_street.txt" + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + transit: + image: pelias/transit:master + container_name: pelias_transit + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.17.27 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + fuzzy-tester: + image: pelias/fuzzy-tester:master + container_name: pelias_fuzzy_tester + user: "${DOCKER_USER}" + restart: "no" + command: "--help" + volumes: + - "./pelias.json:/code/pelias.json" + - "./test_cases:/code/pelias/fuzzy-tester/test_cases" diff --git a/projects/texas/pelias.json b/projects/texas/pelias.json new file mode 100644 index 00000000..fb1ee605 --- /dev/null +++ b/projects/texas/pelias.json @@ -0,0 +1,395 @@ +{ + "logger": { + "level": "info", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "acceptance-tests": { + "endpoints": { + "docker": "http://api:4000/v1/" + } + }, + "api": { + "services": { + "placeholder": { "url": "http://placeholder:4100" }, + "pip": { "url": "http://pip:4200" }, + "interpolation": { "url": "http://interpolation:4300" }, + "libpostal": { "url": "http://libpostal:4400" } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "blacklist": { + "files": [ + "/data/blacklist/osm.txt" + ] + }, + "geonames": { + "datapath": "/data/geonames", + "countryCode": "US" + }, + "openstreetmap": { + "download": [ + { "sourceURL": "http://download.geofabrik.de/north-america/us/texas-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "texas-latest.osm.pbf" + }] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": [ + "us/tx/anderson.csv", + "us/tx/andrews.csv", + "us/tx/angelina.csv", + "us/tx/aransas.csv", + "us/tx/archer.csv", + "us/tx/armstrong.csv", + "us/tx/atascosa.csv", + "us/tx/austin.csv", + "us/tx/bailey.csv", + "us/tx/bandera.csv", + "us/tx/bastrop.csv", + "us/tx/baylor.csv", + "us/tx/bee.csv", + "us/tx/bell.csv", + "us/tx/bexar.csv", + "us/tx/blanco.csv", + "us/tx/borden.csv", + "us/tx/bosque.csv", + "us/tx/bowie.csv", + "us/tx/brazoria.csv", + "us/tx/brazos.csv", + "us/tx/brewster.csv", + "us/tx/briscoe.csv", + "us/tx/brooks.csv", + "us/tx/brown.csv", + "us/tx/burleson.csv", + "us/tx/burnet.csv", + "us/tx/caldwell.csv", + "us/tx/calhoun.csv", + "us/tx/callahan.csv", + "us/tx/cameron.csv", + "us/tx/camp.csv", + "us/tx/capcog.csv", + "us/tx/carson.csv", + "us/tx/cass.csv", + "us/tx/castro.csv", + "us/tx/chambers.csv", + "us/tx/cherokee.csv", + "us/tx/childress.csv", + "us/tx/city_of_abilene.csv", + "us/tx/city_of_alvin.csv", + "us/tx/city_of_amarillo.csv", + "us/tx/city_of_austin.csv", + "us/tx/city_of_beaumont.csv", + "us/tx/city_of_buda.csv", + "us/tx/city_of_carrollton.csv", + "us/tx/city_of_cedar_park.csv", + "us/tx/city_of_colleyville.csv", + "us/tx/city_of_dalhart.csv", + "us/tx/city_of_denison.csv", + "us/tx/city_of_denton.csv", + "us/tx/city_of_flower_mound.csv", + "us/tx/city_of_garland.csv", + "us/tx/city_of_horseshoe_bay.csv", + "us/tx/city_of_houston.csv", + "us/tx/city_of_hurst.csv", + "us/tx/city_of_killeen.csv", + "us/tx/city_of_lewisville.csv", + "us/tx/city_of_longview.csv", + "us/tx/city_of_mansfield.csv", + "us/tx/city_of_mckinney.csv", + "us/tx/city_of_palestine.csv", + "us/tx/city_of_pearland.csv", + "us/tx/city_of_pflugerville.csv", + "us/tx/city_of_rosenberg.csv", + "us/tx/city_of_san_antonio.csv", + "us/tx/city_of_sherman.csv", + "us/tx/city_of_southlake.csv", + "us/tx/city_of_sugar_land.csv", + "us/tx/city_of_temple.csv", + "us/tx/city_of_university_park.csv", + "us/tx/city_of_waco.csv", + "us/tx/city_of_waxahachie.csv", + "us/tx/clay.csv", + "us/tx/cochran.csv", + "us/tx/coke.csv", + "us/tx/coleman.csv", + "us/tx/colleyville.csv", + "us/tx/collin.csv", + "us/tx/collingsworth.csv", + "us/tx/colorado.csv", + "us/tx/comal.csv", + "us/tx/comanche.csv", + "us/tx/concho.csv", + "us/tx/cooke.csv", + "us/tx/coryell.csv", + "us/tx/cottle.csv", + "us/tx/crane.csv", + "us/tx/crockett.csv", + "us/tx/crosby.csv", + "us/tx/culberson.csv", + "us/tx/dallam.csv", + "us/tx/dallas.csv", + "us/tx/dawson.csv", + "us/tx/deaf_smith.csv", + "us/tx/delta.csv", + "us/tx/denton.csv", + "us/tx/desoto.csv", + "us/tx/dewitt.csv", + "us/tx/dickens.csv", + "us/tx/dimmit.csv", + "us/tx/donley.csv", + "us/tx/duval.csv", + "us/tx/eastland.csv", + "us/tx/ector.csv", + "us/tx/edwards.csv", + "us/tx/el_paso.csv", + "us/tx/ellis.csv", + "us/tx/erath.csv", + "us/tx/falls.csv", + "us/tx/fannin.csv", + "us/tx/fayette.csv", + "us/tx/fisher.csv", + "us/tx/floyd.csv", + "us/tx/foard.csv", + "us/tx/fort_bend.csv", + "us/tx/franklin.csv", + "us/tx/freestone.csv", + "us/tx/frio.csv", + "us/tx/gaines.csv", + "us/tx/galveston.csv", + "us/tx/garza.csv", + "us/tx/gillespie.csv", + "us/tx/glasscock.csv", + "us/tx/goliad.csv", + "us/tx/gonzales.csv", + "us/tx/gray.csv", + "us/tx/grayson.csv", + "us/tx/greater_houston.csv", + "us/tx/gregg.csv", + "us/tx/grimes.csv", + "us/tx/guadalupe.csv", + "us/tx/hale.csv", + "us/tx/hall.csv", + "us/tx/hamilton.csv", + "us/tx/hansford.csv", + "us/tx/hardeman.csv", + "us/tx/hardin.csv", + "us/tx/harris.csv", + "us/tx/harrison.csv", + "us/tx/hartley.csv", + "us/tx/haskell.csv", + "us/tx/hays.csv", + "us/tx/hemphill.csv", + "us/tx/henderson.csv", + "us/tx/hidalgo.csv", + "us/tx/hidalgo_county.csv", + "us/tx/hill.csv", + "us/tx/hockley.csv", + "us/tx/hood.csv", + "us/tx/hopkins.csv", + "us/tx/houston.csv", + "us/tx/howard.csv", + "us/tx/hudspeth.csv", + "us/tx/hunt.csv", + "us/tx/hutchinson.csv", + "us/tx/irion.csv", + "us/tx/jack.csv", + "us/tx/jackson.csv", + "us/tx/jasper.csv", + "us/tx/jeff_davis.csv", + "us/tx/jefferson.csv", + "us/tx/jim_hogg.csv", + "us/tx/jim_wells.csv", + "us/tx/johnson.csv", + "us/tx/jones.csv", + "us/tx/karnes.csv", + "us/tx/kaufman.csv", + "us/tx/keller.csv", + "us/tx/kendall.csv", + "us/tx/kenedy.csv", + "us/tx/kent.csv", + "us/tx/kerr.csv", + "us/tx/kimble.csv", + "us/tx/king.csv", + "us/tx/kinney.csv", + "us/tx/kleberg.csv", + "us/tx/knox.csv", + "us/tx/la_salle.csv", + "us/tx/lamar.csv", + "us/tx/lamb.csv", + "us/tx/lampasas.csv", + "us/tx/lasalle.csv", + "us/tx/lavaca.csv", + "us/tx/lee.csv", + "us/tx/leon.csv", + "us/tx/liberty.csv", + "us/tx/libery.csv", + "us/tx/limestone.csv", + "us/tx/lipscomb.csv", + "us/tx/live_oak.csv", + "us/tx/liveoak.csv", + "us/tx/llano.csv", + "us/tx/loving.csv", + "us/tx/lubbock.csv", + "us/tx/lynn.csv", + "us/tx/madison.csv", + "us/tx/marion.csv", + "us/tx/martin.csv", + "us/tx/mason.csv", + "us/tx/matagorda.csv", + "us/tx/maverick.csv", + "us/tx/mcculloch.csv", + "us/tx/mclennan.csv", + "us/tx/mcmullen.csv", + "us/tx/medina.csv", + "us/tx/menard.csv", + "us/tx/midland.csv", + "us/tx/milam.csv", + "us/tx/mills.csv", + "us/tx/mitchell.csv", + "us/tx/montague.csv", + "us/tx/montgomery.csv", + "us/tx/moore.csv", + "us/tx/morris.csv", + "us/tx/motley.csv", + "us/tx/nacogdoches.csv", + "us/tx/navarro.csv", + "us/tx/new_braunfels.csv", + "us/tx/newton.csv", + "us/tx/nolan.csv", + "us/tx/north_richland_hills.csv", + "us/tx/nueces.csv", + "us/tx/ochiltree.csv", + "us/tx/oldham.csv", + "us/tx/orange.csv", + "us/tx/palo_pinto.csv", + "us/tx/panola.csv", + "us/tx/parker.csv", + "us/tx/parmer.csv", + "us/tx/pecos.csv", + "us/tx/plano.csv", + "us/tx/polk.csv", + "us/tx/potter.csv", + "us/tx/presidio.csv", + "us/tx/rains.csv", + "us/tx/randall.csv", + "us/tx/reagan.csv", + "us/tx/real.csv", + "us/tx/red_river.csv", + "us/tx/reeves.csv", + "us/tx/refugio.csv", + "us/tx/roberts.csv", + "us/tx/robertson.csv", + "us/tx/rockwall.csv", + "us/tx/round_rock.csv", + "us/tx/runnels.csv", + "us/tx/rusk.csv", + "us/tx/sabine.csv", + "us/tx/san_antonio.csv", + "us/tx/san_augustine.csv", + "us/tx/san_jacinto.csv", + "us/tx/san_patricio.csv", + "us/tx/san_saba.csv", + "us/tx/schleicher.csv", + "us/tx/scurry.csv", + "us/tx/shackelford.csv", + "us/tx/shelby.csv", + "us/tx/sherman.csv", + "us/tx/smith.csv", + "us/tx/starr.csv", + "us/tx/statewide-partial.csv", + "us/tx/stephens.csv", + "us/tx/sterling.csv", + "us/tx/stonewall.csv", + "us/tx/sutton.csv", + "us/tx/swisher.csv", + "us/tx/tarrant-county.csv", + "us/tx/tarrant.csv", + "us/tx/taylor.csv", + "us/tx/terrell.csv", + "us/tx/terry.csv", + "us/tx/texoma-counties.csv", + "us/tx/throckmorton.csv", + "us/tx/titus.csv", + "us/tx/tom_green.csv", + "us/tx/travis.csv", + "us/tx/trinity.csv", + "us/tx/tyler.csv", + "us/tx/upshur.csv", + "us/tx/upton.csv", + "us/tx/uvalde.csv", + "us/tx/val_verde.csv", + "us/tx/van_zandt.csv", + "us/tx/vanzandt.csv", + "us/tx/victoria.csv", + "us/tx/waco.csv", + "us/tx/walker.csv", + "us/tx/waller.csv", + "us/tx/ward.csv", + "us/tx/washington.csv", + "us/tx/webb.csv", + "us/tx/wharton.csv", + "us/tx/wheeler.csv", + "us/tx/wichita.csv", + "us/tx/wilbarger.csv", + "us/tx/willacy.csv", + "us/tx/williamson.csv", + "us/tx/wilson.csv", + "us/tx/winkler.csv", + "us/tx/wise.csv", + "us/tx/wood.csv", + "us/tx/yoakum.csv", + "us/tx/young.csv", + "us/tx/zapata.csv", + "us/tx/zavala.csv" + ] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "US", + "importPlace": [ + "85688753" + ] + }, + "transit": { + "datapath": "/data/transit", + "feeds": [ + ] + }, + "interpolation": { + "download": { + "tiger": { + "datapath": "/data/tiger", + "states": [ + { "state_code": 48 } + ] + } + } + } + } +} diff --git a/projects/texas/synonyms/custom_name.txt b/projects/texas/synonyms/custom_name.txt new file mode 100644 index 00000000..988f7229 --- /dev/null +++ b/projects/texas/synonyms/custom_name.txt @@ -0,0 +1,141 @@ + +Ranch to market road,RM,ranch to market +Farm to market road,FM,farm to market + +shopping,store,shop,retail,grocery,mall + +# Transit Centers +Oregon City Transit Center,Oregon City TC,OCTC +Barbur Blvd Transit Center,BBTC,Barbur Blvd TC,Barbur TC +Beaverton Transit Center,BTC,Beaverton TC +Clackamas Town Center Transit Center,CTC,Clackamas TC,Clackamas Town Center TC,Clackamas Transit Center +Gateway/NE 99th Ave Transit Center,GTC,Gateway TC,Gateway Transit Center +Gresham Central Transit Center,GCTC,Gresham Central TC,Gresham TC +Hillsboro Center/SE 3rd Ave Transit Center, HCTC, Hillsboro TC, Hillsboro Transit Center +Hollywood/NE 42nd Ave Transit Center,HTC, HOllywood TC,HOllywood Transit Center +Lake Oswego Transit Center, LOTC,Lake Oswego TC +N Lombard Transit Center, Lombard Transit Center, Lombard TC,NLTC +Parkrose/Sumner Transit Center, Parkrose Transit Center,Parkrose TC,PRSTC,PTC +Rose Quarter Transit Center,RQTC, Rose Quarter TC +Sunset Transit Center,Sunset TC, STC +Tigard Transit Center,Tigard TC,TTC +Washington Square Transit Center,WSTC,Washington Square TC +Willow Creek/SW 185th Ave Transit Center, Willow Creek TC, Willow Creek Transit Center, WCTC + +# Rail Stations +Yamhill District MAX Station,YAMX +Washington/SE 12th Ave MAX Station, WASX +Tuality Hospital/SE 8th Ave MAX Station, TUAX +Skidmore Fountain MAX Station, SKIX +SE Powell Blvd MAX Station,POWX +SE Holgate BLvd MAX Station,HOLX +SE Fuller Rd MAX Station,FULX +SE Flavel St MAX Station,FLAX +SE Division St MAX Station,DIVX +Ruby Junction/E 197th Ave MAX Station,RUBX +Rosa Parks MAX Station,N Portland Blvd MAX Station,ROSX,RPX +Rockwood/E 188th Ave MAX Station,ROCX +Quatama/NW 205th Ave MAX Station,QUAX +Providence Park MAX Station,Civic Stadium MAX Station,JELD-WEN Field MAX Station,PGE Park MAX Station,PPX,PROX +Portland Int'l Airport MAX Station; PDXX +Pioneer Square South MAX Station,PCSS MAX +Pioneer Square North MAX Station,PCSN MAX +Parkrose/Sumner TC MAX Station,Parkrose MAX Station,PTC +Overlook Park MAX Station,OVEX +Orenco/NW 231st Ave MAX Station,OREX +Old Town/Chinatown MAX Station,OLDX +Oak/SW 1st Ave MAX Station,OAKX +N Prescott St MAX Station,PREX +N Killingsworth St MAX Station,KILX +NE 60th Ave MAX Station,60X +NE 82nd Ave MAX Station,82X +Mt Hood Ave MAX Station,MTHX +Millikan Way MAX Station,MILX +Merlo Rd/SW 158th Ave MAX Station,MERX +Lloyd Center/NE 11th Ave MAX Station,LLOX +Library/SW 9th Ave MAX Station,LIBX +Lents Town Center/Foster Rd MAX Station,LENX +Kings Hill/SW Salmon St MAX Station,KINX +Kenton/N Denver Ave MAX Station,KENX +Interstate/Rose Quarter MAX Station,IRQ MAX,IRQ +Hawthorn Farm MAX Station,HAWX +Goose Hollow/SW Jefferson St MAX Station,GHX,GOOX +Galleria/SW 10th Ave MAX Station,GALX +Fair Complex/Hillsboro Airport MAX Station,FAIX +Expo Center MAX Station,EXPX +E 162nd Ave MAX Station,162X +E 172nd Ave MAX Station,172X +E 181st Ave MAX Station,181X +E 102nd Ave MAX Station,102X +E 122nd Ave MAX Station,122X +E 148th Ave MAX Station,148X +Elmonica/SW 170th Ave MAX Station,ELMX,Elmonica +Delta Park/Vanport MAX Station,DELX,DPV MAX,DPX +Convention Center MAX Station,CCX,CONX +Cleveland Ave MAX Station,CLEX +Cascades MAX Station,CASX +Beaverton Creek MAX Station,BCRX +Beaverton Central MAX Station,BEAX +Albina/Mississippi MAX Station,ALBX + +# TriMet Facilities +ATP/Nela,Nela +Center Street Bus Maintenance, Center Garage +Elmonica Operations Facility,Elmo,Elmonica +Merlo Operations Facility,Merlo Garage, Merlo +Powell Operations Facility,Powell Garage +Transit Mobility Center,ATP Mobility Center,Mobility Center +TriMet Administration Headquarters,Admin Building,Administration Building,Harrison Square,TriMet Administrative Offices +TriMet Operations Headquarters,Center St, Center Street,TriMet Lost & Found +#Trimet Ticket Office,TTO +Vintage Trolley Barn,Trolley Barn + +# Misc Landmarks +# FXP: removed psu and pdx, since they led to ambig hits +Oregon Zoo,Zoo,Washington Park Zoo +Portland State University,Portland State +Portland International Raceway,PIR +Portland International Airport,Portland Airport +Portland Community College - Cascade,PCC Cascade +Portland Community College - Rock Creek,PCC Rock Creek +Portland Community College - Southeast,PCC Southeast, PCC Southeast Center +Portland Community College - Sylvania,PCC Sylvania +Portland Community College - Willow Creek Center,PCC Willow Creek Center +Pioneer Courthouse Square,Downtown Portland,PCS +Oregon Rail Heritage Center,ORHF +Oregon Museum of Science and Industry,OMSI +Oregon Health & Science University,OHSU,Oregon Health Sciences University +Oregon College of Oriental Medicine,OCOM +Moda Center at the Rose Quarter,Moda Center,Rose Garden Arena +Clackamas Community College,CCC +Clackamas Community College Harmony Campus, CCCH +Gordon Faber Recreation Complex,Hillsboro Stadium,Ron Tonkin Field +Providence Park,Civic Stadium,JELD-WEN Field,PGE Park +OSHU Collaborative Life Sciences Building, Skourtes Tower, CLSB, School of Dentistry +Aging & Disability, DHS +African Youth and Community Organization, AYCO + +north, N +south, S +east, E +west, W +north west => northwest +north east => northeast +south west => southwest +south east => southeast +northwest, NW +northeast, NE +southwest, SW +southeast, SE + +Portland, Portland City Center +Int'l, international +clackamus, clackamas +clack, clackamas +p-town, portland +casscade, cascade + +# street names +Tualatin Valley Hwy,TV Hwy,TVH,TVHWY +Beaverton-Hillsdale Hwy,Beaverton- Hillsdale Hwy,BH Hwy,BHH +MLK,M L King,Martin Luther King diff --git a/projects/texas/synonyms/custom_street.txt b/projects/texas/synonyms/custom_street.txt new file mode 100644 index 00000000..4e9fa868 --- /dev/null +++ b/projects/texas/synonyms/custom_street.txt @@ -0,0 +1,135 @@ +Ranch to market road,RM,ranch to market +Farm to market road,FM,farm to market + +Tualatin Valley Hwy,TV Hwy,TVH,TVHWY +Beaverton Hillsdale HWY,Beaverton-Hillsdale HWY,BH HYW,BHH +Beaverton Hillsdale,Beaverton-Hillsdale,BH +Martin Luther King,ML King,M L King,MLK +Doernbecher,Dornbecher,Doernbecker,Dornbecker,Dornbecka +Native American Youth => NAYA +Transit Center => TC +Park Ride => PR +Park & Ride => PR +Park and Ride => PR +caeser,cesar,chavez,39th +metro,portland +oregon,or +carshare,car2go,Zipcar,Flexcar,GetAround,ucarshare,uhaul,hertz,wecar,enterprise +ticket,fare,outlet,store,retail +dmv,motor,vehicles +court house => courthouse +court-house => courthouse +cc,court,courts,courth,courthouse +law,jail,prison,jail,courthouse,enforcement,juvenile,justice,juvenile,correctional +jewvi,juvi,juvenile + +first,1st +second,2nd +third,3rd +fourth,4th +fifth,5th +sixth,6th +seventh,7th +eighth,8th +nineth,9th +tenth,10th +eleventh,11th +twelfth,12th +thirteenth,13th +fourteenth,14th +fifteenth,15th +sixteenth,16th +seventeenth,17th +eighteenth,18th +nineteenth,19th +twentyth,20th +twentyfirst,21st +twentysecond,22nd +twentythrid,23rd + +# USPS Suffix Abbreviations +# http://www.usps.com/ncsc/lookups/abbreviations.html#suffix +st,st.,street,str +ave,ave.,av,av.,avenue,AVNUE,AVENUE,AVENU +dr,drive,dr.,drv,driv,drives +BOULEVARD,BLVD,BOULEVARD,BOUL,BOULEVARD,BOULEVARD,BOULV +BRIDGE,BRDGE,BRG +BYPASS,BYP,BYPA,BYPAS,BYPS +CLIFF,CLF,CLIFFS,CLFS +CLUB,CLB +COMMON,CMN +CORNER,COR,CORNERS,CORS +CENTER,CEN,CENT,CENTER,CENTR,CENTRE,CNTER,CNTR,CTR,CENTERS,CTRS +CIR,CIRC,CIRCL,CIRCLE,CRCL,CIRCLE,CRCLE +COURT,CRT,CT,COURTS +CTSCK,CR,CREEK,CRK +CROSSING,CRSSING,CRSSNG,XING +CRECENT,CRES,CRESCENT,CRESENT,CRSCNT,CRSENT,CRSNT +EXP,EXPR,EXPRESS,EXPRESSWAY,EXPW,EXPY +FALL,FALLS,FLS +FERRY,FRRY,FRY +FIELD,FLD,FIELDS,FLDS +FREEWAY,FREEWY,FRWAY,FRWY,FWY +GARDEN,GARDN,GDN,GRDEN,GRDN,GARDENS,GDNS,GRDNS +GATEWAY,GATEWY,GATWAY,GTWAY,GTWY +GROV,GROVE,GRV,GROVES +HARB,HARBOR,HARBR,HBR,HRBOR,HARBORS +HEIGHT,HEIGHTS,HGTS,HT,HTS +HIGHWAY,HIGHWY,HIWAY,HIWY,HWAY,HWY +HILL,HL,HILLS,HLS +IS,ISLAND,ISLND,ISLANDS,ISLNDS,ISS,ISLE,ISLES +JCT,JCTION,JCTN,JUNCTION,JUNCTN,JUNCTON,JCTNS,JCTS,JUNCTIONS +LAKE,LK,LAKES,LKS +LANDING,LNDG,LNDNG +LA,LANE,LANES,LN +LOOP,LOOPS,LP +MANOR,MNR,MANORS,MNRS +MDW,MEADOW,MDWS,MEADOWS,MEDOWS +MILL,ML,MILLS,MLS +MNT,MOUNT,MT +MNTAIN,MNTN,MOUNTAIN,MOUNTIN,MTIN,MTN,MNTNS,MOUNTAINS +ORCH,ORCHARD,ORCHRD +PARK,PK,PRK,PARKS +PARKWAY,PARKWY,PKWAY,PKWY,PKY,PARKWAYS,PKWYS +PLAZA,PLZ,PLZA +PLACE,PL +PR,PRAIRIE,PRARIE,PRR +RANCH,RANCHES,RNCH,RNCHS +RDG,RDGE,RIDGE,RDGS,RIDGES +RIV,RIVER,RIVR,RVR +RD,ROAD,RDS,ROADS +RTESHLS,SHOALS +SHOAR,SHORE,SHR,SHOARS,SHORES,SHRS +SPG,SPNG,SPRING,SPRNG,SPGS,SPNGS,SPRINGS,SPRNGS +SQ,SQR,SQRE,SQU,SQUARE,SQRS,SQUARES +STA,STATION,STATN,STN +STREAM,STREME,STRM +ST,STR,STREET,STRT,STREETS +SMT,SUMIT,SUMITT,SUMMIT +TER,TERR,TERRACE +TR,TRAIL,TRAILS,TRL,TRLS +TUNEL,TUNL,TUNLS,TUNNEL,TUNNELS,TUNNL +UN,UNION,UNIONS +VALLEY,VALLY,VLLY,VLY,VALLEYS,VLYS +VDCT,VIA,VIADCT,VIADUCT +VIEW,VW,VIEWS,VWS +VILL,VILLAG,VILLAGE,VILLG,VILLIAGE,VLG,VILLAGES,VLGS +VILLE,VL +VIS,VIST,VISTA,VST,VSTA +WAY,WY,WAYS + +north, N +south, S +east, E +west, W +north west => northwest +north east => northeast +south west => southwest +south east => southeast +northwest, NW +northeast, NE +southwest, SW +southeast, SE + +broadway st => broadway +broadway street => broadway diff --git a/projects/texas/test_cases/libpostal_quirks.json b/projects/texas/test_cases/libpostal_quirks.json new file mode 100644 index 00000000..36f6a583 --- /dev/null +++ b/projects/texas/test_cases/libpostal_quirks.json @@ -0,0 +1,35 @@ +{ + "name": "/v1/search address", + "description": "addresses in Portland, OR", + "priorityThresh": 1, + "normalizers": { + "name": [ + "toUpperCase", + "removeOrdinals", + "stripPunctuation", + "abbreviateDirectionals", + "abbreviateStreetSuffixes" + ] + }, + "tests": [ + { + "id": 1, + "status": "pass", + "in": { + "text": "4004 SW Beaverton-Hillsdale, Portland" + }, + "issue": "https://github.com/OpenTransitTools/trimet-mod-pelias/issues/20", + "description": "libpostal does not handle street directionals in some cases", + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + } + ] +} diff --git a/projects/texas/test_cases/search_address.json b/projects/texas/test_cases/search_address.json new file mode 100644 index 00000000..0a6c2799 --- /dev/null +++ b/projects/texas/test_cases/search_address.json @@ -0,0 +1,8057 @@ +{ + "name": "/v1/search address", + "description": "addresses in Portland, OR", + "priorityThresh": 1, + "normalizers": { + "name": [ + "toUpperCase", + "removeOrdinals", + "stripPunctuation", + "abbreviateDirectionals", + "abbreviateStreetSuffixes" + ] + }, + "tests": [ + { + "id": 1, + "status": "pass", + "in": { + "text": "777 NE MLK Blvd, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 2, + "status": "pass", + "in": { + "text": "777 NE MLK Blvd, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 3, + "status": "pass", + "in": { + "text": "777 NE MLK Blvd Portland OR" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 4, + "status": "pass", + "in": { + "text": "777 NE MLK Blvd Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 5, + "status": "pass", + "in": { + "text": "777 NE MLK Jr Blvd, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 6, + "status": "pass", + "in": { + "text": "777 NE MLK Jr Blvd, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 7, + "status": "pass", + "in": { + "text": "777 NE MLK Jr Blvd Portland OR" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 8, + "status": "pass", + "in": { + "text": "777 NE MLK Jr Blvd Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 9, + "status": "pass", + "in": { + "text": "777 NE ML King Blvd, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 10, + "status": "pass", + "in": { + "text": "777 NE ML King Blvd, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 11, + "status": "pass", + "in": { + "text": "777 NE ML King Blvd Portland OR" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 12, + "status": "pass", + "in": { + "text": "777 NE ML King Blvd Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 12.1, + "status": "pass", + "in": { + "text": "777 NE martin luther king Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "777 NE Martin Luther King Junior Blvd", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 13, + "status": "pass", + "in": { + "text": "4004 SW BH Hwy, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 14, + "status": "pass", + "in": { + "text": "4004 SW BH Hwy, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 15, + "status": "pass", + "in": { + "text": "4004 SW BH Hwy Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 16, + "status": "pass", + "in": { + "text": "4004 SW BH Hwy Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 17, + "status": "pass", + "in": { + "text": "4004 SW BHH, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE HWY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 18, + "status": "pass", + "in": { + "text": "4004 SW BHH, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE HWY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 19, + "status": "pass", + "in": { + "text": "4004 SW BHH Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE HWY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 20, + "status": "pass", + "in": { + "text": "4004 SW BHH Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE HWY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 21, + "status": "pass", + "in": { + "text": "4004 SW Beaverton-Hillsdale Hwy, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 22, + "status": "pass", + "in": { + "text": "4004 SW Beaverton-Hillsdale Hwy, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 23, + "status": "pass", + "in": { + "text": "4004 SW Beaverton-Hillsdale Hwy Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 24, + "status": "pass", + "in": { + "text": "4004 SW Beaverton-Hillsdale Hwy Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW BEAVERTON HILLSDALE Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 25, + "status": "pass", + "in": { + "text": "4004 SW Beaverton- Hillsdale Hwy, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton- Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 26, + "status": "pass", + "in": { + "text": "4004 SW Beaverton- Hillsdale Hwy, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton- Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 27, + "status": "pass", + "in": { + "text": "4004 SW Beaverton- Hillsdale Hwy Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton- Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 28, + "status": "pass", + "in": { + "text": "4004 SW Beaverton- Hillsdale Hwy Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton- Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 29, + "status": "pass", + "in": { + "text": "4004 SW Beaverton Hillsdale Hwy, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 30, + "status": "pass", + "in": { + "text": "4004 SW Beaverton Hillsdale Hwy, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 31, + "status": "pass", + "in": { + "text": "4004 SW Beaverton Hillsdale Hwy Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 32, + "status": "pass", + "in": { + "text": "4004 SW Beaverton Hillsdale Hwy Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4004 SW Beaverton Hillsdale Hwy", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 33, + "status": "pass", + "in": { + "text": "17175 SW TV Hwy, aloha, OR" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 34, + "status": "pass", + "in": { + "text": "17175 SW TV Hwy, aloha, Oregon" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 35, + "status": "pass", + "in": { + "text": "17175 SW TV Hwy aloha OR" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 36, + "status": "pass", + "in": { + "text": "17175 SW TV Hwy aloha Oregon" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 37, + "status": "pass", + "in": { + "text": "17175 SW TVH, aloha, OR" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 38, + "status": "pass", + "in": { + "text": "17175 SW TVH, aloha, Oregon" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 39, + "status": "pass", + "in": { + "text": "17175 SW TVH aloha OR" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 40, + "status": "pass", + "in": { + "text": "17175 SW TVH aloha Oregon" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 41, + "status": "pass", + "in": { + "text": "17175 SW TUALATIN VALLEY HWY, aloha, OR" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 42, + "status": "pass", + "in": { + "text": "17175 SW TUALATIN VALLEY HWY, aloha, Oregon" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 43, + "status": "pass", + "in": { + "text": "17175 SW TUALATIN VALLEY HWY aloha OR" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 44, + "status": "pass", + "in": { + "text": "17175 SW TUALATIN VALLEY HWY aloha Oregon" + }, + "expected": { + "properties": [ + { + "name": "17175 SW TUALATIN VALLEY HIGHWAY", + "locality": "Aloha", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 45, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 46, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 47, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 48, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 49, + "status": "pass", + "in": { + "text": "4134 N VANCOUVER AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4134 N VANCOUVER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 50, + "status": "pass", + "in": { + "text": "4134 N VANCOUVER AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4134 N VANCOUVER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 51, + "status": "pass", + "in": { + "text": "4134 N VANCOUVER AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4134 N VANCOUVER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 52, + "status": "pass", + "in": { + "text": "4134 N VANCOUVER AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4134 N VANCOUVER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 53, + "status": "pass", + "in": { + "text": "834 SE LAMBERT ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "834 SE LAMBERT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 54, + "status": "pass", + "in": { + "text": "834 SE LAMBERT ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "834 SE LAMBERT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 55, + "status": "pass", + "in": { + "text": "834 SE LAMBERT ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "834 SE LAMBERT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 56, + "status": "pass", + "in": { + "text": "834 SE LAMBERT ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "834 SE LAMBERT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 57, + "status": "pass", + "in": { + "text": "6146 SW 18th DR, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "6146 SW 18th DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 58, + "status": "pass", + "in": { + "text": "6146 SW 18th DR, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "6146 SW 18th DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 59, + "status": "pass", + "in": { + "text": "6146 SW 18th DR Portland OR" + }, + "expected": { + "properties": [ + { + "name": "6146 SW 18th DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 60, + "status": "pass", + "in": { + "text": "6146 SW 18th DR Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "6146 SW 18th DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 61, + "status": "pass", + "in": { + "text": "725 SW 10TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "725 SW 10TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 62, + "status": "pass", + "in": { + "text": "725 SW 10TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "725 SW 10TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 63, + "status": "pass", + "in": { + "text": "725 SW 10TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "725 SW 10TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 64, + "status": "pass", + "in": { + "text": "725 SW 10TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "725 SW 10TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 65, + "status": "fail", + "in": { + "text": "14587 SW DAUER CT, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "14587 SW DAUER CT", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 66, + "status": "fail", + "in": { + "text": "14587 SW DAUER CT, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "14587 SW DAUER CT", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 67, + "status": "fail", + "in": { + "text": "14587 SW DAUER CT Portland OR" + }, + "expected": { + "properties": [ + { + "name": "14587 SW DAUER CT", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 68, + "status": "fail", + "in": { + "text": "14587 SW DAUER CT Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "14587 SW DAUER CT", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 69, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 70, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 71, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 72, + "status": "pass", + "in": { + "text": "1800 SW 1ST AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1800 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 73, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 74, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 75, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 76, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 77, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 78, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 79, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 80, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 81, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 82, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 83, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 84, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 85, + "status": "pass", + "in": { + "text": "30 147TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147 AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 86, + "status": "pass", + "in": { + "text": "30 147TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147 AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 87, + "status": "pass", + "in": { + "text": "30 147TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147 AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 88, + "status": "pass", + "in": { + "text": "30 147TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147 AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 89, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 90, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 91, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 92, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 93, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 94, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 95, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 96, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 97, + "status": "pass", + "in": { + "text": "6236 SE 134TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "6236 SE 134TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 98, + "status": "pass", + "in": { + "text": "6236 SE 134TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "6236 SE 134TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 99, + "status": "pass", + "in": { + "text": "6236 SE 134TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "6236 SE 134TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 100, + "status": "pass", + "in": { + "text": "6236 SE 134TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "6236 SE 134TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 101, + "status": "pass", + "in": { + "text": "3334 SE 7TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3334 SE 7TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 102, + "status": "pass", + "in": { + "text": "3334 SE 7TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3334 SE 7TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 103, + "status": "pass", + "in": { + "text": "3334 SE 7TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3334 SE 7TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 104, + "status": "pass", + "in": { + "text": "3334 SE 7TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3334 SE 7TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 105, + "status": "pass", + "in": { + "text": "3625 N FARRAGUT ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3625 N FARRAGUT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 106, + "status": "pass", + "in": { + "text": "3625 N FARRAGUT ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3625 N FARRAGUT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 107, + "status": "pass", + "in": { + "text": "3625 N FARRAGUT ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3625 N FARRAGUT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 108, + "status": "pass", + "in": { + "text": "3625 N FARRAGUT ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3625 N FARRAGUT ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 109, + "status": "pass", + "in": { + "text": "1606 NE 90TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1606 NE 90TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 110, + "status": "pass", + "in": { + "text": "1606 NE 90TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1606 NE 90TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 111, + "status": "pass", + "in": { + "text": "1606 NE 90TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1606 NE 90TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 112, + "status": "pass", + "in": { + "text": "1606 NE 90TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1606 NE 90TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 113, + "status": "pass", + "in": { + "text": "14359 SE POWELL BLVD, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "14359 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 114, + "status": "pass", + "in": { + "text": "14359 SE POWELL BLVD, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "14359 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 115, + "status": "pass", + "in": { + "text": "14359 SE POWELL BLVD Portland OR" + }, + "expected": { + "properties": [ + { + "name": "14359 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 116, + "status": "pass", + "in": { + "text": "14359 SE POWELL BLVD Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "14359 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 117, + "status": "fail", + "in": { + "text": "4015 N ALBINA ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4015 N ALBINA ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 118, + "status": "fail", + "in": { + "text": "4015 N ALBINA ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4015 N ALBINA ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 119, + "status": "fail", + "in": { + "text": "4015 N ALBINA ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4015 N ALBINA ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 120, + "status": "fail", + "in": { + "text": "4015 N ALBINA ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4015 N ALBINA ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 121, + "status": "pass", + "in": { + "text": "5661 SE HAROLD ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "5661 SE HAROLD ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 122, + "status": "pass", + "in": { + "text": "5661 SE HAROLD ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "5661 SE HAROLD ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 123, + "status": "pass", + "in": { + "text": "5661 SE HAROLD ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "5661 SE HAROLD ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 124, + "status": "pass", + "in": { + "text": "5661 SE HAROLD ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "5661 SE HAROLD ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 125, + "status": "pass", + "in": { + "text": "3689 SE FRANCIS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3689 SE FRANCIS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 126, + "status": "pass", + "in": { + "text": "3689 SE FRANCIS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3689 SE FRANCIS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 127, + "status": "pass", + "in": { + "text": "3689 SE FRANCIS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3689 SE FRANCIS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 128, + "status": "pass", + "in": { + "text": "3689 SE FRANCIS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3689 SE FRANCIS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 129, + "status": "pass", + "in": { + "text": "2522 SE CLINTON ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "2522 SE CLINTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 130, + "status": "pass", + "in": { + "text": "2522 SE CLINTON ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "2522 SE CLINTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 131, + "status": "pass", + "in": { + "text": "2522 SE CLINTON ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "2522 SE CLINTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 132, + "status": "pass", + "in": { + "text": "2522 SE CLINTON ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "2522 SE CLINTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 133, + "status": "pass", + "in": { + "text": "6834 SE POWELL BLVD, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "6834 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 134, + "status": "pass", + "in": { + "text": "6834 SE POWELL BLVD, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "6834 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 135, + "status": "pass", + "in": { + "text": "6834 SE POWELL BLVD Portland OR" + }, + "expected": { + "properties": [ + { + "name": "6834 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 136, + "status": "pass", + "in": { + "text": "6834 SE POWELL BLVD Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "6834 SE POWELL BLVD", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 137, + "status": "pass", + "in": { + "text": "310 NE 55TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "310 NE 55TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 138, + "status": "pass", + "in": { + "text": "310 NE 55TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "310 NE 55TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 139, + "status": "pass", + "in": { + "text": "310 NE 55TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "310 NE 55TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 140, + "status": "pass", + "in": { + "text": "310 NE 55TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "310 NE 55TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 141, + "status": "pass", + "in": { + "text": "6021 SE 72ND AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "6021 SE 72ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 142, + "status": "pass", + "in": { + "text": "6021 SE 72ND AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "6021 SE 72ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 143, + "status": "pass", + "in": { + "text": "6021 SE 72ND AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "6021 SE 72ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 144, + "status": "pass", + "in": { + "text": "6021 SE 72ND AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "6021 SE 72ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 145, + "status": "pass", + "in": { + "text": "1721 NE 108TH, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1721 NE 108TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 146, + "status": "pass", + "in": { + "text": "1721 NE 108TH, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1721 NE 108TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 147, + "status": "pass", + "in": { + "text": "1721 NE 108TH Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1721 NE 108TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 148, + "status": "pass", + "in": { + "text": "1721 NE 108TH Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1721 NE 108TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 149, + "status": "pass", + "in": { + "text": "9352 N DWIGHT AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9352 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 150, + "status": "pass", + "in": { + "text": "9352 N DWIGHT AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9352 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 151, + "status": "pass", + "in": { + "text": "9352 N DWIGHT AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9352 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 152, + "status": "pass", + "in": { + "text": "9352 N DWIGHT AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9352 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 153, + "status": "pass", + "in": { + "text": "9348 N DWIGHT AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9348 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 154, + "status": "pass", + "in": { + "text": "9348 N DWIGHT AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9348 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 155, + "status": "pass", + "in": { + "text": "9348 N DWIGHT AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9348 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 156, + "status": "pass", + "in": { + "text": "9348 N DWIGHT AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9348 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 157, + "status": "pass", + "in": { + "text": "9344 N DWIGHT AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9344 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 158, + "status": "pass", + "in": { + "text": "9344 N DWIGHT AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9344 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 159, + "status": "pass", + "in": { + "text": "9344 N DWIGHT AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9344 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 160, + "status": "pass", + "in": { + "text": "9344 N DWIGHT AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9344 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 161, + "status": "pass", + "in": { + "text": "9340 N DWIGHT AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9340 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 162, + "status": "pass", + "in": { + "text": "9340 N DWIGHT AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9340 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 163, + "status": "pass", + "in": { + "text": "9340 N DWIGHT AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9340 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 164, + "status": "pass", + "in": { + "text": "9340 N DWIGHT AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9340 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 165, + "status": "pass", + "in": { + "text": "9336 N DWIGHT AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9336 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 166, + "status": "pass", + "in": { + "text": "9336 N DWIGHT AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9336 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 167, + "status": "pass", + "in": { + "text": "9336 N DWIGHT AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9336 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 168, + "status": "pass", + "in": { + "text": "9336 N DWIGHT AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9336 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 169, + "status": "pass", + "in": { + "text": "9332 N DWIGHT AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9332 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 170, + "status": "pass", + "in": { + "text": "9332 N DWIGHT AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9332 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 171, + "status": "pass", + "in": { + "text": "9332 N DWIGHT AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9332 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 172, + "status": "pass", + "in": { + "text": "9332 N DWIGHT AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9332 N DWIGHT AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 173, + "status": "pass", + "in": { + "text": "9649 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9649 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 174, + "status": "pass", + "in": { + "text": "9649 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9649 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 175, + "status": "pass", + "in": { + "text": "9649 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9649 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 176, + "status": "pass", + "in": { + "text": "9649 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9649 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 177, + "status": "pass", + "in": { + "text": "9645 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9645 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 178, + "status": "pass", + "in": { + "text": "9645 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9645 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 179, + "status": "pass", + "in": { + "text": "9645 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9645 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 180, + "status": "pass", + "in": { + "text": "9645 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9645 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 181, + "status": "pass", + "in": { + "text": "9641 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9641 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 182, + "status": "pass", + "in": { + "text": "9641 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9641 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 183, + "status": "pass", + "in": { + "text": "9641 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9641 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 184, + "status": "pass", + "in": { + "text": "9641 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9641 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 185, + "status": "pass", + "in": { + "text": "9637 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9637 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 186, + "status": "pass", + "in": { + "text": "9637 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9637 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 187, + "status": "pass", + "in": { + "text": "9637 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9637 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 188, + "status": "pass", + "in": { + "text": "9637 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9637 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 189, + "status": "pass", + "in": { + "text": "9117 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9117 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 190, + "status": "pass", + "in": { + "text": "9117 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9117 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 191, + "status": "pass", + "in": { + "text": "9117 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9117 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 192, + "status": "pass", + "in": { + "text": "9117 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9117 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 193, + "status": "pass", + "in": { + "text": "9129 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9129 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 194, + "status": "pass", + "in": { + "text": "9129 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9129 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 195, + "status": "pass", + "in": { + "text": "9129 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9129 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 196, + "status": "pass", + "in": { + "text": "9129 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9129 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 197, + "status": "pass", + "in": { + "text": "9125 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9125 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 198, + "status": "pass", + "in": { + "text": "9125 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9125 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 199, + "status": "pass", + "in": { + "text": "9125 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9125 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 200, + "status": "pass", + "in": { + "text": "9125 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9125 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 201, + "status": "pass", + "in": { + "text": "9121 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9121 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 202, + "status": "pass", + "in": { + "text": "9121 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9121 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 203, + "status": "pass", + "in": { + "text": "9121 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9121 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 204, + "status": "pass", + "in": { + "text": "9121 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9121 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 205, + "status": "pass", + "in": { + "text": "9133 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9133 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 206, + "status": "pass", + "in": { + "text": "9133 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9133 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 207, + "status": "pass", + "in": { + "text": "9133 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9133 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 208, + "status": "pass", + "in": { + "text": "9133 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9133 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 209, + "status": "pass", + "in": { + "text": "9325 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9325 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 210, + "status": "pass", + "in": { + "text": "9325 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9325 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 211, + "status": "pass", + "in": { + "text": "9325 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9325 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 212, + "status": "pass", + "in": { + "text": "9325 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9325 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 213, + "status": "pass", + "in": { + "text": "9305 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9305 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 214, + "status": "pass", + "in": { + "text": "9305 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9305 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 215, + "status": "pass", + "in": { + "text": "9305 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9305 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 216, + "status": "pass", + "in": { + "text": "9305 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9305 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 217, + "status": "pass", + "in": { + "text": "9309 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9309 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 218, + "status": "pass", + "in": { + "text": "9309 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9309 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 219, + "status": "pass", + "in": { + "text": "9309 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9309 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 220, + "status": "pass", + "in": { + "text": "9309 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9309 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 221, + "status": "pass", + "in": { + "text": "9313 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9313 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 222, + "status": "pass", + "in": { + "text": "9313 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9313 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 223, + "status": "pass", + "in": { + "text": "9313 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9313 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 224, + "status": "pass", + "in": { + "text": "9313 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9313 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 225, + "status": "pass", + "in": { + "text": "9321 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9321 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 226, + "status": "pass", + "in": { + "text": "9321 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9321 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 227, + "status": "pass", + "in": { + "text": "9321 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9321 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 228, + "status": "pass", + "in": { + "text": "9321 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9321 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 229, + "status": "pass", + "in": { + "text": "9341 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9341 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 230, + "status": "pass", + "in": { + "text": "9341 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9341 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 231, + "status": "pass", + "in": { + "text": "9341 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9341 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 232, + "status": "pass", + "in": { + "text": "9341 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9341 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 233, + "status": "pass", + "in": { + "text": "9337 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9337 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 234, + "status": "pass", + "in": { + "text": "9337 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9337 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 235, + "status": "pass", + "in": { + "text": "9337 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9337 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 236, + "status": "pass", + "in": { + "text": "9337 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9337 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 237, + "status": "pass", + "in": { + "text": "9333 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9333 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 238, + "status": "pass", + "in": { + "text": "9333 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9333 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 239, + "status": "pass", + "in": { + "text": "9333 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9333 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 240, + "status": "pass", + "in": { + "text": "9333 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9333 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 241, + "status": "pass", + "in": { + "text": "9349 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9349 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 242, + "status": "pass", + "in": { + "text": "9349 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9349 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 243, + "status": "pass", + "in": { + "text": "9349 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9349 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 244, + "status": "pass", + "in": { + "text": "9349 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9349 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 245, + "status": "pass", + "in": { + "text": "9345 N FISKE AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "9345 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 246, + "status": "pass", + "in": { + "text": "9345 N FISKE AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "9345 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 247, + "status": "pass", + "in": { + "text": "9345 N FISKE AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "9345 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 248, + "status": "pass", + "in": { + "text": "9345 N FISKE AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "9345 N FISKE AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 249, + "status": "pass", + "in": { + "text": "4902 N TRENTON ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4902 N TRENTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 250, + "status": "pass", + "in": { + "text": "4902 N TRENTON ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4902 N TRENTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 251, + "status": "pass", + "in": { + "text": "4902 N TRENTON ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4902 N TRENTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 252, + "status": "pass", + "in": { + "text": "4902 N TRENTON ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4902 N TRENTON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 253, + "status": "pass", + "in": { + "text": "5330 NE GLISAN ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "5330 NE GLISAN ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 254, + "status": "pass", + "in": { + "text": "5330 NE GLISAN ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "5330 NE GLISAN ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 255, + "status": "pass", + "in": { + "text": "5330 NE GLISAN ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "5330 NE GLISAN ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 256, + "status": "pass", + "in": { + "text": "5330 NE GLISAN ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "5330 NE GLISAN ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 257, + "status": "pass", + "in": { + "text": "3268 NE EMERSON ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3268 NE EMERSON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 258, + "status": "pass", + "in": { + "text": "3268 NE EMERSON ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3268 NE EMERSON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 259, + "status": "pass", + "in": { + "text": "3268 NE EMERSON ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3268 NE EMERSON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 260, + "status": "pass", + "in": { + "text": "3268 NE EMERSON ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3268 NE EMERSON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 261, + "status": "fail", + "in": { + "text": "4105 SE INTERNATIONAL WAY, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4105 SE INTERNATIONAL WAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 262, + "status": "fail", + "in": { + "text": "4105 SE INTERNATIONAL WAY, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4105 SE INTERNATIONAL WAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 263, + "status": "fail", + "in": { + "text": "4105 SE INTERNATIONAL WAY Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4105 SE INTERNATIONAL WAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 264, + "status": "fail", + "in": { + "text": "4105 SE INTERNATIONAL WAY Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4105 SE INTERNATIONAL WAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 265, + "status": "pass", + "in": { + "text": "1508 SE 21ST AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1508 SE 21ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 266, + "status": "pass", + "in": { + "text": "1508 SE 21ST AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1508 SE 21ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 267, + "status": "pass", + "in": { + "text": "1508 SE 21ST AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1508 SE 21ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 268, + "status": "pass", + "in": { + "text": "1508 SE 21ST AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1508 SE 21ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 269, + "status": "pass", + "in": { + "text": "1322 SE WATER AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1322 SE WATER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 270, + "status": "pass", + "in": { + "text": "1322 SE WATER AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1322 SE WATER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 271, + "status": "pass", + "in": { + "text": "1322 SE WATER AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1322 SE WATER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 272, + "status": "pass", + "in": { + "text": "1322 SE WATER AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1322 SE WATER AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 273, + "status": "pass", + "in": { + "text": "216 SE 103RD AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "216 SE 103RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 274, + "status": "pass", + "in": { + "text": "216 SE 103RD AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "216 SE 103RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 275, + "status": "pass", + "in": { + "text": "216 SE 103RD AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "216 SE 103RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 276, + "status": "pass", + "in": { + "text": "216 SE 103RD AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "216 SE 103RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 277, + "status": "pass", + "in": { + "text": "0841 SW GAINES ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "0841 SW GAINES ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 278, + "status": "pass", + "in": { + "text": "0841 SW GAINES ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "0841 SW GAINES ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 279, + "status": "pass", + "in": { + "text": "0841 SW GAINES ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "0841 SW GAINES ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 280, + "status": "pass", + "in": { + "text": "0841 SW GAINES ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "0841 SW GAINES ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 281, + "status": "pass", + "in": { + "text": "1231 NE BROADWAY ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1231 NE BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 282, + "status": "pass", + "in": { + "text": "1231 NE BROADWAY ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1231 NE BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 283, + "status": "pass", + "in": { + "text": "1231 NE BROADWAY ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1231 NE BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 284, + "status": "pass", + "in": { + "text": "1231 NE BROADWAY ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1231 NE BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 285, + "status": "pass", + "in": { + "text": "1523 SE 162ND AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1523 SE 162ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 286, + "status": "pass", + "in": { + "text": "1523 SE 162ND AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1523 SE 162ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 287, + "status": "pass", + "in": { + "text": "1523 SE 162ND AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1523 SE 162ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 288, + "status": "pass", + "in": { + "text": "1523 SE 162ND AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1523 SE 162ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 289, + "status": "pass", + "in": { + "text": "2243 SE DIVISION ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "2243 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 290, + "status": "pass", + "in": { + "text": "2243 SE DIVISION ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "2243 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 291, + "status": "pass", + "in": { + "text": "2243 SE DIVISION ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "2243 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 292, + "status": "pass", + "in": { + "text": "2243 SE DIVISION ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "2243 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 293, + "status": "fail", + "in": { + "text": "10955 SE JENNIFER ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "10955 SE JENNIFER ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 294, + "status": "fail", + "in": { + "text": "10955 SE JENNIFER ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "10955 SE JENNIFER ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 295, + "status": "fail", + "in": { + "text": "10955 SE JENNIFER ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "10955 SE JENNIFER ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 296, + "status": "fail", + "in": { + "text": "10955 SE JENNIFER ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "10955 SE JENNIFER ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 297, + "status": "pass", + "in": { + "text": "1739 NW COUCH ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1739 NW COUCH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 298, + "status": "pass", + "in": { + "text": "1739 NW COUCH ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1739 NW COUCH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 299, + "status": "pass", + "in": { + "text": "1739 NW COUCH ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1739 NW COUCH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 300, + "status": "pass", + "in": { + "text": "1739 NW COUCH ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1739 NW COUCH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 301, + "status": "pass", + "in": { + "text": "2716 SW BEAVERTON-HILLSDALE HWY, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "2716 SW BEAVERTON HILLSDALE HIGHWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 302, + "status": "pass", + "in": { + "text": "2716 SW BEAVERTON-HILLSDALE HWY, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "2716 SW BEAVERTON HILLSDALE HIGHWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 303, + "status": "pass", + "in": { + "text": "2716 SW BEAVERTON-HILLSDALE HWY Portland OR" + }, + "expected": { + "properties": [ + { + "name": "2716 SW BEAVERTON HILLSDALE HIGHWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 304, + "status": "pass", + "in": { + "text": "2716 SW BEAVERTON-HILLSDALE HWY Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "2716 SW BEAVERTON HILLSDALE HIGHWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 305, + "status": "pass", + "in": { + "text": "4701 SE 24TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "4701 SE 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 306, + "status": "pass", + "in": { + "text": "4701 SE 24TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "4701 SE 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 307, + "status": "pass", + "in": { + "text": "4701 SE 24TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "4701 SE 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 308, + "status": "pass", + "in": { + "text": "4701 SE 24TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "4701 SE 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 309, + "status": "pass", + "in": { + "text": "1130 NW 22ND AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1130 NW 22ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 310, + "status": "pass", + "in": { + "text": "1130 NW 22ND AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1130 NW 22ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 311, + "status": "pass", + "in": { + "text": "1130 NW 22ND AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1130 NW 22ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 312, + "status": "pass", + "in": { + "text": "1130 NW 22ND AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1130 NW 22ND AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 313, + "status": "pass", + "in": { + "text": "7368 SE DIVISION ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "7368 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 314, + "status": "pass", + "in": { + "text": "7368 SE DIVISION ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "7368 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 315, + "status": "pass", + "in": { + "text": "7368 SE DIVISION ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "7368 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 316, + "status": "pass", + "in": { + "text": "7368 SE DIVISION ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "7368 SE DIVISION ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 317, + "status": "fail", + "in": { + "text": "16317 SE 82ND DR, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "16317 SE 82ND DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 318, + "status": "fail", + "in": { + "text": "16317 SE 82ND DR, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "16317 SE 82ND DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 319, + "status": "fail", + "in": { + "text": "16317 SE 82ND DR Portland OR" + }, + "expected": { + "properties": [ + { + "name": "16317 SE 82ND DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 320, + "status": "fail", + "in": { + "text": "16317 SE 82ND DR Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "16317 SE 82ND DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 321, + "status": "fail", + "in": { + "text": "14255 SW 6TH ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "14255 SW 6TH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 322, + "status": "fail", + "in": { + "text": "14255 SW 6TH ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "14255 SW 6TH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 323, + "status": "fail", + "in": { + "text": "14255 SW 6TH ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "14255 SW 6TH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 324, + "status": "fail", + "in": { + "text": "14255 SW 6TH ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "14255 SW 6TH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 325, + "status": "pass", + "in": { + "text": "3421 SE SALMON ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3421 SE SALMON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 326, + "status": "pass", + "in": { + "text": "3421 SE SALMON ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3421 SE SALMON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 327, + "status": "pass", + "in": { + "text": "3421 SE SALMON ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3421 SE SALMON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 328, + "status": "pass", + "in": { + "text": "3421 SE SALMON ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3421 SE SALMON ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 329, + "status": "fail", + "in": { + "text": "12133 SE 8OTH AVE MILWAUKIE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "12133 SE 8OTH AVE MILWAUKIE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 330, + "status": "fail", + "in": { + "text": "12133 SE 8OTH AVE MILWAUKIE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "12133 SE 8OTH AVE MILWAUKIE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 331, + "status": "fail", + "in": { + "text": "12133 SE 8OTH AVE MILWAUKIE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "12133 SE 8OTH AVE MILWAUKIE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 332, + "status": "fail", + "in": { + "text": "12133 SE 8OTH AVE MILWAUKIE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "12133 SE 8OTH AVE MILWAUKIE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 333, + "status": "pass", + "in": { + "text": "311 NW 12TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "311 NW 12TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 334, + "status": "pass", + "in": { + "text": "311 NW 12TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "311 NW 12TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 335, + "status": "pass", + "in": { + "text": "311 NW 12TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "311 NW 12TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 336, + "status": "pass", + "in": { + "text": "311 NW 12TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "311 NW 12TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 337, + "status": "pass", + "in": { + "text": "3480 NW INDUSTRIAL ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3480 NW INDUSTRIAL ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 338, + "status": "pass", + "in": { + "text": "3480 NW INDUSTRIAL ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3480 NW INDUSTRIAL ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 339, + "status": "pass", + "in": { + "text": "3480 NW INDUSTRIAL ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3480 NW INDUSTRIAL ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 340, + "status": "pass", + "in": { + "text": "3480 NW INDUSTRIAL ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3480 NW INDUSTRIAL ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 341, + "status": "pass", + "in": { + "text": "422 E BURNSIDE ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "422 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 342, + "status": "pass", + "in": { + "text": "422 E BURNSIDE ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "422 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 343, + "status": "pass", + "in": { + "text": "422 E BURNSIDE ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "422 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 344, + "status": "pass", + "in": { + "text": "422 E BURNSIDE ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "422 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 345, + "status": "pass", + "in": { + "text": "1917 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1917 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 346, + "status": "pass", + "in": { + "text": "1917 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1917 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 347, + "status": "pass", + "in": { + "text": "1917 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1917 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 348, + "status": "pass", + "in": { + "text": "1917 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1917 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 349, + "status": "pass", + "in": { + "text": "1915 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1915 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 350, + "status": "pass", + "in": { + "text": "1915 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1915 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 351, + "status": "pass", + "in": { + "text": "1915 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1915 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 352, + "status": "pass", + "in": { + "text": "1915 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1915 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 353, + "status": "pass", + "in": { + "text": "1913 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1913 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 354, + "status": "pass", + "in": { + "text": "1913 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1913 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 355, + "status": "pass", + "in": { + "text": "1913 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1913 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 356, + "status": "pass", + "in": { + "text": "1913 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1913 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 357, + "status": "pass", + "in": { + "text": "1911 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1911 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 358, + "status": "pass", + "in": { + "text": "1911 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1911 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 359, + "status": "pass", + "in": { + "text": "1911 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1911 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 360, + "status": "pass", + "in": { + "text": "1911 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1911 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 361, + "status": "pass", + "in": { + "text": "1909 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1909 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 362, + "status": "pass", + "in": { + "text": "1909 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1909 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 363, + "status": "pass", + "in": { + "text": "1909 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1909 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 364, + "status": "pass", + "in": { + "text": "1909 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1909 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 365, + "status": "pass", + "in": { + "text": "1907 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1907 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 366, + "status": "pass", + "in": { + "text": "1907 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1907 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 367, + "status": "pass", + "in": { + "text": "1907 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1907 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 368, + "status": "pass", + "in": { + "text": "1907 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1907 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 369, + "status": "pass", + "in": { + "text": "1905 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1905 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 370, + "status": "pass", + "in": { + "text": "1905 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1905 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 371, + "status": "pass", + "in": { + "text": "1905 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1905 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 372, + "status": "pass", + "in": { + "text": "1905 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1905 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 373, + "status": "pass", + "in": { + "text": "1903 SE TIBBETTS ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1903 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 374, + "status": "pass", + "in": { + "text": "1903 SE TIBBETTS ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1903 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 375, + "status": "pass", + "in": { + "text": "1903 SE TIBBETTS ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1903 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 376, + "status": "pass", + "in": { + "text": "1903 SE TIBBETTS ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1903 SE TIBBETTS ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 377, + "status": "pass", + "in": { + "text": "3083 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3083 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 378, + "status": "pass", + "in": { + "text": "3083 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3083 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 379, + "status": "pass", + "in": { + "text": "3083 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3083 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 380, + "status": "pass", + "in": { + "text": "3083 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3083 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 381, + "status": "pass", + "in": { + "text": "3075 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3075 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 382, + "status": "pass", + "in": { + "text": "3075 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3075 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 383, + "status": "pass", + "in": { + "text": "3075 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3075 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 384, + "status": "pass", + "in": { + "text": "3075 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3075 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 385, + "status": "fail", + "in": { + "text": "3073 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3073 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 386, + "status": "fail", + "in": { + "text": "3073 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3073 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 387, + "status": "fail", + "in": { + "text": "3073 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3073 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 388, + "status": "fail", + "in": { + "text": "3073 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3073 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 389, + "status": "pass", + "in": { + "text": "3035 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3035 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 390, + "status": "pass", + "in": { + "text": "3035 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3035 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 391, + "status": "pass", + "in": { + "text": "3035 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3035 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 392, + "status": "pass", + "in": { + "text": "3035 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3035 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 393, + "status": "pass", + "in": { + "text": "3033 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3033 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 394, + "status": "pass", + "in": { + "text": "3033 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3033 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 395, + "status": "pass", + "in": { + "text": "3033 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3033 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 396, + "status": "pass", + "in": { + "text": "3033 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3033 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 397, + "status": "pass", + "in": { + "text": "3031 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3031 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 398, + "status": "pass", + "in": { + "text": "3031 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3031 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 399, + "status": "pass", + "in": { + "text": "3031 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3031 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 400, + "status": "pass", + "in": { + "text": "3031 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3031 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 401, + "status": "pass", + "in": { + "text": "3027 SE 20TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "3027 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 402, + "status": "pass", + "in": { + "text": "3027 SE 20TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "3027 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 403, + "status": "pass", + "in": { + "text": "3027 SE 20TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "3027 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 404, + "status": "pass", + "in": { + "text": "3027 SE 20TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "3027 SE 20TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 405, + "status": "pass", + "in": { + "text": "OREGON ZOO, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "OREGON ZOO", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 406, + "status": "pass", + "in": { + "text": "OREGON ZOO, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "OREGON ZOO", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 407, + "status": "fail", + "in": { + "text": "OREGON ZOO Portland OR" + }, + "expected": { + "properties": [ + { + "name": "OREGON ZOO", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 408, + "status": "fail", + "in": { + "text": "OREGON ZOO Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "OREGON ZOO", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 409, + "status": "fail", + "in": { + "text": "10647 SW RIVER DR, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "10647 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 410, + "status": "fail", + "in": { + "text": "10647 SW RIVER DR, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "10647 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 411, + "status": "fail", + "in": { + "text": "10647 SW RIVER DR Portland OR" + }, + "expected": { + "properties": [ + { + "name": "10647 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 412, + "status": "fail", + "in": { + "text": "10647 SW RIVER DR Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "10647 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 413, + "status": "pass", + "in": { + "text": "1831 SW RIVER DR, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1831 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 414, + "status": "pass", + "in": { + "text": "1831 SW RIVER DR, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1831 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 415, + "status": "pass", + "in": { + "text": "1831 SW RIVER DR Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1831 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 416, + "status": "pass", + "in": { + "text": "1831 SW RIVER DR Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1831 SW RIVER DR", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 417, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 418, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 419, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 420, + "status": "pass", + "in": { + "text": "825 NE MULTNOMAH ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "825 NE MULTNOMAH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 421, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 422, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 423, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 424, + "status": "pass", + "in": { + "text": "1220 SW 3RD AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1220 SW 3RD AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 425, + "status": "pass", + "in": { + "text": "30 NE 147TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 426, + "status": "pass", + "in": { + "text": "30 NE 147TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 427, + "status": "pass", + "in": { + "text": "30 NE 147TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 428, + "status": "pass", + "in": { + "text": "30 NE 147TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "30 NE 147TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 429, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 430, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 431, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 432, + "status": "pass", + "in": { + "text": "14715 E BURNSIDE ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "14715 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 433, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 434, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 435, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 436, + "status": "pass", + "in": { + "text": "1000 SW BROADWAY ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1000 SW BROADWAY", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 437, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 438, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 439, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 440, + "status": "pass", + "in": { + "text": "1400 SW 5TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1400 SW 5TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 441, + "status": "pass", + "in": { + "text": "2211 SW 1ST AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "2211 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 442, + "status": "pass", + "in": { + "text": "2211 SW 1ST AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "2211 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 443, + "status": "pass", + "in": { + "text": "2211 SW 1ST AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "2211 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 444, + "status": "pass", + "in": { + "text": "2211 SW 1ST AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "2211 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 445, + "status": "pass", + "in": { + "text": "2221 SW 1ST AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "2221 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 446, + "status": "pass", + "in": { + "text": "2221 SW 1ST AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "2221 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 447, + "status": "pass", + "in": { + "text": "2221 SW 1ST AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "2221 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 448, + "status": "pass", + "in": { + "text": "2221 SW 1ST AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "2221 SW 1ST AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 449, + "status": "pass", + "in": { + "text": "1600 SW 4TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "1600 SW 4TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 450, + "status": "pass", + "in": { + "text": "1600 SW 4TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "1600 SW 4TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 451, + "status": "pass", + "in": { + "text": "1600 SW 4TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "1600 SW 4TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 452, + "status": "pass", + "in": { + "text": "1600 SW 4TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "1600 SW 4TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 453, + "status": "pass", + "in": { + "text": "8205 SW 24TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "8205 SW 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 454, + "status": "pass", + "in": { + "text": "8205 SW 24TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "8205 SW 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 455, + "status": "pass", + "in": { + "text": "8205 SW 24TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "8205 SW 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 456, + "status": "pass", + "in": { + "text": "8205 SW 24TH AVE Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "8205 SW 24TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 457, + "status": "pass", + "in": { + "text": "537 SE ASH ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "537 SE ASH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 458, + "status": "pass", + "in": { + "text": "537 SE ASH ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "537 SE ASH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 459, + "status": "pass", + "in": { + "text": "537 SE ASH ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "537 SE ASH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 460, + "status": "pass", + "in": { + "text": "537 SE ASH ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "537 SE ASH ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 461, + "status": "pass", + "in": { + "text": "524 E BURNSIDE ST, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "524 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 462, + "status": "pass", + "in": { + "text": "524 E BURNSIDE ST, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "524 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 463, + "status": "pass", + "in": { + "text": "524 E BURNSIDE ST Portland OR" + }, + "expected": { + "properties": [ + { + "name": "524 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 464, + "status": "pass", + "in": { + "text": "524 E BURNSIDE ST Portland Oregon" + }, + "expected": { + "properties": [ + { + "name": "524 E BURNSIDE ST", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 465, + "status": "pass", + "in": { + "text": "309 SE 129TH AVE, Portland, OR" + }, + "expected": { + "properties": [ + { + "name": "309 SE 129TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 466, + "status": "pass", + "in": { + "text": "309 SE 129TH AVE, Portland, Oregon" + }, + "expected": { + "properties": [ + { + "name": "309 SE 129TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 467, + "status": "pass", + "in": { + "text": "309 SE 129TH AVE Portland OR" + }, + "expected": { + "properties": [ + { + "name": "309 SE 129TH AVE", + "locality": "Portland", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 468, + "status": "fail", + "in": { + "text": "309 SE 129TH AVE Oak Grove Oregon" + }, + "expected": { + "properties": [ + { + "name": "309 SE 129TH AVE", + "locality": "Oak Grove", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 469, + "status": "pass", + "in": { + "text": "2817 SE PARK AVE, Oak Grove, OR" + }, + "expected": { + "properties": [ + { + "name": "2817 SE PARK AVE", + "locality": "Oak Grove", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 470, + "status": "pass", + "in": { + "text": "2817 SE PARK AVE, Oak Grove, Oregon" + }, + "expected": { + "properties": [ + { + "name": "2817 SE PARK AVE", + "locality": "Oak Grove", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 471, + "status": "pass", + "in": { + "text": "2817 SE PARK AVE Oak Grove OR" + }, + "expected": { + "properties": [ + { + "name": "2817 SE PARK AVE", + "locality": "Oak Grove", + "region": "Oregon", + "region_a": "OR" + } + ] + } + }, + { + "id": 472, + "status": "pass", + "in": { + "text": "2817 SE PARK AVE Oak Grove Oregon" + }, + "expected": { + "properties": [ + { + "name": "2817 SE PARK AVE", + "locality": "Oak Grove", + "region": "Oregon", + "region_a": "OR" + } + ] + } + } + ] +} diff --git a/projects/texas/test_cases/search_venue.json b/projects/texas/test_cases/search_venue.json new file mode 100644 index 00000000..7ac2ba57 --- /dev/null +++ b/projects/texas/test_cases/search_venue.json @@ -0,0 +1,49 @@ +{ + "name": "/v1/search venues", + "priorityThresh": 1, + "endpoint": "search", + "tests": [ + { + "id": 1, + "status": "fail", + "notes": "portland international should come up for PDX", + "in": { + "text": "pdx" + }, + "expected": { + "properties": [ + { + "layer": "venue", + "name": "Portland International Airport", + "country_a": "USA", + "country": "United States", + "region": "Oregon", + "region_a": "OR", + "locality": "Portland" + } + ] + } + }, + { + "id": 2, + "status": "fail", + "notes": "portland international should come up for PDX", + "in": { + "text": "pdx airport" + }, + "expected": { + "properties": [ + { + "layer": "venue", + "name": "Portland International Airport", + "country_a": "USA", + "country": "United States", + "region": "Oregon", + "region_a": "OR", + "locality": "Portland" + } + ] + } + } + ] +}