@mountainpass/addressr
Version:
Australian Address Validation, Search and Autocomplete
237 lines (234 loc) • 7.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ELASTIC_PORT = undefined;
exports.dropIndex = dropIndex;
exports.initIndex = initIndex;
exports.esConnect = esConnect;
var _debug = require("debug");
var _debug2 = _interopRequireDefault(_debug);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const waitPort = require('wait-port');
const elasticsearch = require('@opensearch-project/opensearch');
const logger = (0, _debug2.default)('api');
const error = (0, _debug2.default)('error');
const ES_INDEX_NAME = process.env.ES_INDEX_NAME || 'addressr';
const ELASTIC_PORT = exports.ELASTIC_PORT = Number.parseInt(process.env.ELASTIC_PORT || '9200');
const ELASTIC_HOST = process.env.ELASTIC_HOST || '127.0.0.1';
const ELASTIC_USERNAME = process.env.ELASTIC_USERNAME || undefined;
const ELASTIC_PASSWORD = process.env.ELASTIC_PASSWORD || undefined;
const ELASTIC_PROTOCOL = process.env.ELASTIC_PROTOCOL || 'http';
async function dropIndex(esClient) {
// eslint-disable-next-line security/detect-non-literal-fs-filename
let exists = await esClient.indices.exists({
index: ES_INDEX_NAME
});
if (exists.body) {
const deleteIndexResult = await esClient.indices.delete({
index: ES_INDEX_NAME
});
logger({
deleteIndexResult
});
}
logger('checking if index exists');
// eslint-disable-next-line security/detect-non-literal-fs-filename
exists = await esClient.indices.exists({
index: ES_INDEX_NAME
});
logger('index exists:', exists);
}
async function initIndex(esClient, clear, synonyms) {
if (clear) {
await dropIndex(esClient);
}
logger('checking if index exists');
// eslint-disable-next-line security/detect-non-literal-fs-filename
const exists = await esClient.indices.exists({
index: ES_INDEX_NAME
});
logger('index exists:', exists.body);
const indexBody = {
settings: {
index: {
analysis: {
filter: {
my_synonym_filter: {
type: 'synonym',
lenient: true,
synonyms
},
comma_stripper: {
type: 'pattern_replace',
pattern: ',',
replacement: ''
}
},
analyzer: {
// default: {
// tokenizer: 'my_tokenizer',
// filter: ['lowercase', 'asciifolding', 'synonym'],
// },
my_analyzer: {
tokenizer: 'whitecomma',
filter: ['uppercase', 'asciifolding', 'my_synonym_filter', 'comma_stripper', 'trim']
}
},
tokenizer: {
whitecomma: {
type: 'pattern',
pattern: '[\\W,]+',
lowercase: false
}
}
}
}
},
aliases: {},
mappings: {
properties: {
structured: {
type: 'object',
enabled: false
},
sla: {
type: 'text',
analyzer: 'my_analyzer',
fields: {
raw: {
type: 'keyword'
}
}
// fielddata: true
},
ssla: {
type: 'text',
analyzer: 'my_analyzer',
fields: {
raw: {
type: 'keyword'
}
}
},
confidence: {
type: 'integer'
}
}
}
};
if (!exists.body) {
logger(`creating index: ${ES_INDEX_NAME}`);
const indexCreateResult = await esClient.indices.create({
index: ES_INDEX_NAME,
body: indexBody
});
logger({
indexCreateResult
});
} else {
// update the index
const indexCloseResult = await esClient.indices.close({
index: ES_INDEX_NAME
});
logger({
indexCloseResult
});
const indexPutSettingsResult = await esClient.indices.putSettings({
index: ES_INDEX_NAME,
body: indexBody
});
logger({
indexPutSettingsResult
});
const indexPutMappingResult = await esClient.indices.putMapping({
index: ES_INDEX_NAME,
body: indexBody.mappings
});
logger({
indexPutMappingResult
});
// eslint-disable-next-line security/detect-non-literal-fs-filename
const indexOpenResult = await esClient.indices.open({
index: ES_INDEX_NAME
});
logger({
indexOpenResult
});
const refreshResult = await esClient.indices.refresh({
index: ES_INDEX_NAME
});
logger({
refreshResult
});
}
const indexGetResult = await esClient.indices.get({
index: ES_INDEX_NAME,
includeDefaults: true
});
logger(`indexGetResult:\n${JSON.stringify(indexGetResult, undefined, 2)}`);
}
async function esConnect(esport = ELASTIC_PORT, eshost = ELASTIC_HOST, interval = 1000, timeout = 0) {
// we keep trying to connect, no matter what
// eslint-disable-next-line no-constant-condition
while (true) {
logger(`trying to reach elastic search on ${eshost}:${esport}...`);
try {
const open = await waitPort({
host: eshost,
port: esport,
interval,
timeout
});
if (open) {
logger(`...${eshost}:${esport} is reachable`);
// eslint-disable-next-line no-constant-condition
while (true) {
try {
const node = ELASTIC_USERNAME ? `${ELASTIC_PROTOCOL}://${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}@${eshost}:${esport}` : `${ELASTIC_PROTOCOL}://${eshost}:${esport}`;
const esClientOptions = {
node
// ...(ELASTIC_USERNAME &&
// ELASTIC_PASSWORD && {
// cloud: {
// username: ELASTIC_USERNAME,
// password: ELASTIC_PASSWORD
// }
// })
// host: [
// {
// host: eshost,
// ...(ELASTIC_USERNAME &&
// ELASTIC_PASSWORD && {
// auth: `${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}`,
// }),
// protocol: ELASTIC_PROTOCOL,
// port: esport,
// },
// ],
// log: 'info',
};
const esClient = new elasticsearch.Client(esClientOptions);
logger(`connecting elastic search client on ${eshost}:${esport}...`);
await esClient.ping();
logger(`...connected to ${eshost}:${esport}`);
global.esClient = esClient;
return esClient;
} catch (error_) {
error(`An error occurred while trying to connect the elastic search client on ${eshost}:${esport}`, error_);
await new Promise(resolve => {
setTimeout(() => resolve(), interval);
});
logger('retrying...');
}
}
}
} catch (error_) {
error(`An error occured while waiting to reach elastic search on ${eshost}:${esport}`, error_);
await new Promise(resolve => {
setTimeout(() => resolve(), interval);
});
logger('retrying...');
}
}
}