0
0
bleve/examples/beer-search/static/js/search.js
2014-08-29 18:14:12 -04:00

389 lines
11 KiB
JavaScript

function SearchCtrl($scope, $http, $routeParams, $log, $sce) {
$scope.inclusiveMin = true;
$scope.inclusiveMax = false;
$scope.inclusiveStart = true;
$scope.inclusiveEnd = false;
$scope.fieldNames = [];
$scope.minShouldOptions = [];
for (var i = 0; i <= 50; i++) {
$scope.minShouldOptions[i] = i;
}
var resetSchema = function() {
$scope.phraseTerm = "";
$scope.clauseTerm = "";
$scope.clauseOccur = "MUST";
$scope.clauseBoost = 1.0;
};
var resetForm = function() {
$scope.clauses = [];
$scope.phraseTerms = [];
$scope.size = "10";
$scope.minShould = "0";
resetSchema();
};
resetForm();
updateFieldNames = function() {
$http.get('/api/fields').success(function(data) {
$scope.fieldNames = data.fields;
}).
error(function(data, code) {
});
};
updateFieldNames();
$scope.searchTerm = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"term": $scope.term,
"field": $scope.field,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.searchPrefix = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"prefix": $scope.prefix,
"field": $scope.field,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.searchNumericRange = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"min": parseFloat($scope.min),
"max": parseFloat($scope.max),
"inclusive_min": $scope.inclusiveMin,
"inclusive_max": $scope.inclusiveMax,
"field": $scope.field,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.searchDateRange = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"start": $scope.startDate,
"end": $scope.endDate,
"inclusive_start": $scope.inclusiveStart,
"inclusive_end": $scope.inclusiveEnd,
"field": $scope.field,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.searchMatch = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"boost": 1.0,
"match": $scope.match,
"field": $scope.field,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.searchMatchPhrase = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"boost": 1.0,
"match_phrase": $scope.matchphrase,
"field": $scope.field,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.searchSyntax = function() {
$http.post('/api/search', {
"size": 10,
"explain": true,
"highlight":{},
"query": {
"boost": 1.0,
"query": $scope.syntax,
}
}).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
});
};
$scope.expl = function(explanation) {
rv = "" + $scope.roundScore(explanation.value) + " - " + explanation.message;
rv = rv + "<ul>";
for(var i in explanation.children) {
child = explanation.children[i];
rv = rv + "<li>" + $scope.expl(child) + "</li>";
}
rv = rv + "</ul>";
return rv;
};
$scope.roundScore = function(score) {
return Math.round(score*1000)/1000;
};
$scope.roundTook = function(took) {
if (took < 1000 * 1000) {
return "less than 1ms";
} else if (took < 1000 * 1000 * 1000) {
return "" + Math.round(took / (1000*1000)) + "ms";
} else {
roundMs = Math.round(took / (1000*1000));
return "" + roundMs/1000 + "s";
}
};
$scope.removePhraseTerm = function(index) {
$scope.phraseTerms.splice(index, 1);
};
$scope.addPhraseTerm = function() {
if($scope.phraseTerm === "") {
//$scope.errorMessage = "Phrase term cannot be empty";
//return;
$scope.phraseTerms.push(null);
}else {
$scope.phraseTerms.push($scope.phraseTerm);
}
// reset form
delete $scope.errorMessage;
resetSchema();
};
$scope.processResults = function(data) {
$scope.errorMessage = null;
$scope.results = data;
for(var i in $scope.results.hits) {
hit = $scope.results.hits[i];
hit.roundedScore = $scope.roundScore(hit.score);
hit.explanationString = $scope.expl(hit.explanation);
hit.explanationStringSafe = $sce.trustAsHtml(hit.explanationString);
for(var ff in hit.fragments) {
fragments = hit.fragments[ff];
newFragments = [];
for(var ffi in fragments) {
fragment = fragments[ffi];
safeFragment = $sce.trustAsHtml(fragment);
newFragments.push(safeFragment);
}
hit.fragments[ff] = newFragments;
}
}
$scope.results.roundTook = $scope.roundTook(data.took);
};
$scope.searchPhrase = function() {
delete $scope.results;
if($scope.phraseTerms.length < 1) {
$scope.errorMessage = "Query requires at least one term";
return;
}
var requestBody = {
"query": {
"terms": [],
"boost": 1.0,
},
"highlight":{},
explain: true,
size: parseInt($scope.size, 10)
};
for(var i in $scope.phraseTerms) {
var term = $scope.phraseTerms[i];
if (term !== null) {
var termQuery = {
"term": term,
"field": $scope.phraseField,
"boost": 1.0,
};
requestBody.query.terms.push(termQuery);
} else {
requestBody.query.terms.push(null);
}
}
$http.post('/api/search', requestBody).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
$scope.errorMessage = data;
return;
});
};
$scope.removeClause = function(index) {
$scope.clauses.splice(index, 1);
};
$scope.addClause = function() {
if($scope.clauseTerm === "") {
$scope.errorMessage = "Clause term cannot be empty";
return;
}
if($scope.clauseOccur === "") {
$scope.errorMessage = "Select clause occur";
return;
}
if($scope.clauseField === "") {
$scope.errorMessage = "Select a field";
return;
}
if($scope.clauseBoost === "") {
$scope.errorMessage = "Clause boost cannot be empty";
return;
}
clause = {
"term": $scope.clauseTerm,
"occur": $scope.clauseOccur,
"field": $scope.clauseField,
"boost": $scope.clauseBoost
};
$scope.clauses.push(clause);
// reset form
delete $scope.errorMessage;
resetSchema();
};
$scope.searchBoolean = function() {
delete $scope.results;
if($scope.clauses.length < 1) {
$scope.errorMessage = "Query requires at least one clause";
return;
}
var requestBody = {
"query": {
"must": {
"conjuncts":[],
"boost": 1.0,
},
"should":{
"disjuncts":[],
"boost": 1.0,
"min": parseInt($scope.minShould, 10)
},
"must_not": {
"disjuncts": [],
"boost": 1.0,
},
"boost": 1.0,
},
explain: true,
"highlight":{},
size: parseInt($scope.size, 10)
};
for(var i in $scope.clauses) {
var clause = $scope.clauses[i];
var termQuery = {
"term": clause.term,
"field": clause.field,
"boost": parseFloat(clause.boost),
};
switch(clause.occur) {
case "MUST":
requestBody.query.must.conjuncts.push(termQuery);
break;
case "SHOULD":
requestBody.query.should.disjuncts.push(termQuery);
break;
case "MUST NOT":
requestBody.query.must_not.disjuncts.push(termQuery);
break;
}
}
if (requestBody.query.must.conjuncts.length === 0) {
delete requestBody.query.must;
}
if (requestBody.query.should.disjuncts.length === 0) {
delete requestBody.query.should;
}
if (requestBody.query.must_not.disjuncts.length === 0) {
delete requestBody.query.must_not;
}
$http.post('/api/search', requestBody).
success(function(data) {
$scope.processResults(data);
}).
error(function(data, code) {
$scope.errorMessage = data;
return;
});
};
}