@hexide-digital/geoportal.lt
Version:
Set of libs for geoportal.lt
189 lines (188 loc) • 7.77 kB
JavaScript
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;
}
}