UNPKG

@hexide-digital/geoportal.lt

Version:
189 lines (188 loc) 7.77 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import axios from 'axios'; export default class Search { constructor(url, options = {}) { this.latestQuery = ''; this.items = []; this.start = 0; this.url = 'https://www.geoportal.lt/mapproxy/elasticsearch'; this.options = { perPage: 10, }; if (url) { this.url = url; } this.options = Object.assign(Object.assign({}, this.options), options); } search(query) { return __awaiter(this, void 0, void 0, function* () { if (this.latestQuery === query) { return this.items; } this.latestQuery = query; let payload = this.payload(query); let response = yield axios.post(this.url, payload, { headers: { "content-type": "text/plain", } }); if (response.data && response.data.hits && response.data.hits.total === 0) { // full search payload = this.payload(query, true); response = yield axios.post(this.url, payload, { headers: { "content-type": "text/plain", } }); } if (response.data && response.data.hits) { const items = this.filter(response.data.hits.hits); this.items = this.format(items); return this.items; } this.items = []; return this.items; }); } payload(query, fullSearch = false) { const fields = fullSearch ? ["VARDAS^5", "VARDAS.folded^5", "VARDAS.shingle^5", "VARDAS.trigram^3", "VARDAS.edge^5", "FULL_ADDR", "FULL_ADDR.folded", "FULL_ADDR.shingle", "FULL_ADDR.trigram", "FULL_ADDR.edge"] : ["VARDAS^5", "VARDAS.folded^5", "FULL_ADDR", "FULL_ADDR.folded"]; return { "query": { "function_score": { "query": { "multi_match": { "query": query, "type": "phrase", "fields": fields, "slop": 5 } }, "functions": [ { "filter": { "term": { "TYPE": "apskritis" } }, "weight": 1 }, { "filter": { "term": { "TYPE": "savivaldybė" } }, "weight": 1 }, { "filter": { "term": { "TYPE": "gyvenvietė" } }, "weight": 1 }, { "filter": { "term": { "TYPE": "miesto dalis" } }, "weight": 1 }, { "filter": { "term": { "TYPE": "gatvė" } }, "weight": 1.2 }, { "filter": { "term": { "TYPE": "adresas" } }, "weight": 0.1 }, { "filter": { "term": { "TYPE": "ežeras" } }, "weight": 1 }, { "filter": { "term": { "TYPE": "tvenkinys" } }, "weight": 1 }, { "filter": { "term": { "TYPE": "upė" } }, "weight": 1 } ] } }, "sort": [ "_score", { "GYVSK": "desc" }, "VARDAS" ], "from": this.start, "size": this.options.perPage }; return JSON.parse('{"query":{"function_score":{"query":{"multi_match":{"query":"' + query + '","type":"most_fields","fields":["VARDAS^5","VARDAS.folded^5","VARDAS.shingle^5","VARDAS.trigram^3","VARDAS.edge^5","FULL_ADDR","FULL_ADDR.folded","FULL_ADDR.shingle","FULL_ADDR.trigram","FULL_ADDR.edge"],"slop":5}},"functions":[{"filter":{"term":{"TYPE":"apskritis"}},"weight":1},{"filter":{"term":{"TYPE":"savivaldybė"}},"weight":1},{"filter":{"term":{"TYPE":"gyvenvietė"}},"weight":1},{"filter":{"term":{"TYPE":"miesto dalis"}},"weight":1},{"filter":{"term":{"TYPE":"gatvė"}},"weight":1.2},{"filter":{"term":{"TYPE":"adresas"}},"weight":0.1},{"filter":{"term":{"TYPE":"ežeras"}},"weight":1},{"filter":{"term":{"TYPE":"tvenkinys"}},"weight":1},{"filter":{"term":{"TYPE":"upė"}},"weight":1}]}},"sort":["_score",{"GYVSK":"desc"},"VARDAS"],"from":' + this.start + ',"size":' + this.options.perPage + '}'); } filter(list, types = []) { if (types.length === 0) { return list; } return list.filter((el) => { return types.indexOf(el._source.GEOM_TYPE) >= 0; }); } format(list) { return list.map((item) => { return { label: item._source.VARDAS, city: item._source.CITY ? this.capitalize(item._source.CITY) : '', full_address: item._source.FULL_ADDR, description: item._source.DESCRIPTIO, type: item._source.TYPE, lat: item._source.LOCATIONY, lng: item._source.LOCATIONX, }; }); } capitalize(label) { return label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label; } }