mirror of
https://github.com/nextapps-de/flexsearch.git
synced 2025-09-03 10:53:41 +02:00
v0.5.1 Resolution
This commit is contained in:
555
test/benchmark-docs.html
Normal file
555
test/benchmark-docs.html
Normal file
@@ -0,0 +1,555 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Benchmark Presets</title>
|
||||
<style>
|
||||
body{
|
||||
font-family: sans-serif;
|
||||
}
|
||||
table td{
|
||||
padding: 1em 2em;
|
||||
}
|
||||
button{
|
||||
padding: 5px 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>Document Index Benchmark Comparison</h2>
|
||||
<h4>Indexed Text: Movie Documents</h4>
|
||||
<hr>
|
||||
<div id="container"></div>
|
||||
<hr>
|
||||
<script src="../dist/flexsearch.min.js"></script>
|
||||
<script src="../data/movies.js"></script>
|
||||
<script>
|
||||
|
||||
(function(){
|
||||
|
||||
var index = {};
|
||||
var index_doc = {};
|
||||
var flexsearch_doc;
|
||||
var flexsearch_doc_field;
|
||||
var flexsearch_where;
|
||||
var flexsearch_where_custom;
|
||||
var flexsearch_tag;
|
||||
var flexsearch_static;
|
||||
var flexsearch_static_tag;
|
||||
var flexsearch_static_tag_query;
|
||||
var flexsearch_static_query;
|
||||
var flexsearch_index_tag;
|
||||
var flexsearch_index_ref;
|
||||
var flexsearch_find;
|
||||
|
||||
function add(id, cat, content){
|
||||
(index[cat] || (
|
||||
index[cat] = new FlexSearch("fast")
|
||||
)).add(id, content);
|
||||
}
|
||||
|
||||
function search(cat, query){
|
||||
return index[cat].search(query);
|
||||
}
|
||||
|
||||
function add_doc(cat, content){
|
||||
(index_doc[cat] || (
|
||||
index_doc[cat] = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
})
|
||||
)).add(content);
|
||||
}
|
||||
|
||||
function search_doc(cat, query){
|
||||
return index_doc[cat].search(query, {
|
||||
field: "title"
|
||||
});
|
||||
}
|
||||
|
||||
var tests = {
|
||||
|
||||
"helper-no-doc": {
|
||||
|
||||
init: function(){},
|
||||
add: function(content){
|
||||
|
||||
add(content.id, content.genre, content.title);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return search("Adventure", query);
|
||||
},
|
||||
loops: 400000
|
||||
},
|
||||
|
||||
"helper-doc": {
|
||||
|
||||
init: function(){},
|
||||
add: function(content){
|
||||
|
||||
add_doc(content.genre, content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return search_doc("Adventure", query);
|
||||
},
|
||||
loops: 300000
|
||||
},
|
||||
|
||||
"doc-no-cat-no-field": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_doc = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_doc.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_doc.search(query);
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
|
||||
"doc-no-cat-field": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_doc_field = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_doc_field.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_doc_field.search(query, {
|
||||
field: "title"
|
||||
});
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
|
||||
"where-cat": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_where = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_where.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_where.search(query, {
|
||||
field: "title",
|
||||
where: {
|
||||
genre: "Adventure"
|
||||
}
|
||||
});
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
|
||||
"where-custom": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_where_custom = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_where_custom.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_where_custom.search(query, {
|
||||
field: "title",
|
||||
where: function(val){
|
||||
return val.genre === "Adventure";
|
||||
}
|
||||
});
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
|
||||
"where-tag": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_tag = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: ["title"],
|
||||
tag: ["genre"]
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_tag.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_tag.search(query, {
|
||||
field: "title",
|
||||
where: {
|
||||
genre: "Adventure"
|
||||
}
|
||||
});
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
|
||||
"where-indexed-manual": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_index_ref = new FlexSearch({
|
||||
encode: false,
|
||||
tokenize: function(doc){
|
||||
return [doc];
|
||||
},
|
||||
doc:{
|
||||
id: "id",
|
||||
field: ["genre"]
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_index_ref.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_index_ref.search("Adventure", {
|
||||
|
||||
field: "genre"
|
||||
});
|
||||
},
|
||||
loops: 300000
|
||||
},
|
||||
|
||||
/*
|
||||
"where-indexed-tag": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_index_tag = new FlexSearch({
|
||||
preset: "fastest",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: ["title"],
|
||||
tag: ["genre"]
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_index_tag.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_index_tag.search("Adventure", {
|
||||
|
||||
field: "genre"
|
||||
});
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
*/
|
||||
|
||||
"static-where": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_static = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_static.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_static.where({
|
||||
|
||||
genre: "Adventure"
|
||||
});
|
||||
},
|
||||
loops: 400
|
||||
},
|
||||
|
||||
"static-where-tag": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_static_tag = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title",
|
||||
tag: "genre"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_static_tag.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_static_tag.where({
|
||||
|
||||
genre: "Adventure"
|
||||
});
|
||||
},
|
||||
loops: 5000000
|
||||
},
|
||||
|
||||
"static-where-query": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_static_query = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_static_query.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_static_query.where({
|
||||
|
||||
title: query,
|
||||
genre: "Adventure"
|
||||
});
|
||||
},
|
||||
loops: 400
|
||||
},
|
||||
|
||||
"static-where-tag-query": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_static_tag_query = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title",
|
||||
tag: "genre"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_static_tag_query.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_static_tag_query.where({
|
||||
|
||||
title: query,
|
||||
genre: "Adventure"
|
||||
});
|
||||
},
|
||||
loops: 5000
|
||||
},
|
||||
|
||||
"static-find-id": {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_find = new FlexSearch({
|
||||
preset: "fast",
|
||||
doc:{
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(content){
|
||||
|
||||
flexsearch_find.add(content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_find.find(10000);
|
||||
},
|
||||
loops: 20000000
|
||||
}
|
||||
};
|
||||
|
||||
function init_container(target){
|
||||
|
||||
var html = "<table>" +
|
||||
"<tr>" +
|
||||
"<th>Preset </th>" +
|
||||
"<th>Single Phrase </th>" +
|
||||
"<th>Multi Phrase </th>" +
|
||||
"<th>Not Found </th>" +
|
||||
"</tr>";
|
||||
|
||||
for(var test in tests){
|
||||
|
||||
if(tests.hasOwnProperty(test)){
|
||||
|
||||
html += "<tr>" +
|
||||
"<td>" + test + "</td>" +
|
||||
"<td id=\"test-" + test + "\">indexing ...</td>" +
|
||||
"<td id=\"test-multi-" + test + "\"></td>" +
|
||||
"<td id=\"test-notfound-" + test + "\"></td>" +
|
||||
"</tr>"
|
||||
}
|
||||
}
|
||||
|
||||
html += "</table>";
|
||||
|
||||
target.innerHTML = html;
|
||||
}
|
||||
|
||||
var is_mobile = navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/);
|
||||
var genres = ["Comedy", "Adventure", "Comic", "Horror"];
|
||||
|
||||
function init_tests(index, keys){
|
||||
|
||||
var key = keys[index];
|
||||
var test = tests[key];
|
||||
|
||||
test.init();
|
||||
|
||||
if(is_mobile && (test.loops > 1)){
|
||||
|
||||
test.loops = (test.loops / 5) >> 0;
|
||||
}
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
|
||||
test.add({
|
||||
id: i,
|
||||
genre: genres[i % 4],
|
||||
title: data[i]
|
||||
});
|
||||
}
|
||||
|
||||
document.getElementById("test-" + key).textContent = "ready ...";
|
||||
|
||||
if(++index < keys.length){
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
init_tests(index, keys);
|
||||
|
||||
}, 100);
|
||||
}
|
||||
else{
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
start_tests(0, 0, keys);
|
||||
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
function start_tests(suite, index, keys){
|
||||
|
||||
var phrase = suite === 0 ? "mermaid" : (suite === 1 ? "little mermaid" : "undefined");
|
||||
var key = keys[index];
|
||||
var test = tests[key];
|
||||
var loops = test.loops;
|
||||
var query = test.query;
|
||||
var start = Date.now();
|
||||
|
||||
for(var x = 0; x < loops; x++){
|
||||
|
||||
query(phrase);
|
||||
}
|
||||
|
||||
var duration = Date.now() - start;
|
||||
|
||||
console.log("[Suite " + suite + "] " + key + ":", duration);
|
||||
|
||||
document.getElementById("test-" + (suite === 1 ? "multi-" : (suite === 2 ? "notfound-" : "")) + key).textContent = format_number(((1000 / duration * loops * 10 + 0.5) >> 0) / 10) + " op/s";
|
||||
|
||||
if(++index >= keys.length){
|
||||
|
||||
if(++suite < 3){
|
||||
|
||||
index = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(index < keys.length){
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
start_tests(suite, index, keys);
|
||||
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
init_container(document.getElementById("container"));
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
init_tests(0, Object.keys(tests));
|
||||
|
||||
}, 100);
|
||||
|
||||
function format_number(num){
|
||||
|
||||
return ("" + num).replace(/(\d)(?=(\d{3})+\b)/g, '$1,');
|
||||
}
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
//window.tests = tests;
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@@ -17,7 +17,6 @@
|
||||
</head>
|
||||
<body>
|
||||
<h2>Presets Benchmark Comparison</h2>
|
||||
<!--<button id="btn_start" onclick="start();" disabled>Start</button>-->
|
||||
<h4>Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)</h4>
|
||||
<hr>
|
||||
<div id="container"></div>
|
||||
@@ -26,30 +25,28 @@
|
||||
<script src="../data/gulliver.js"></script>
|
||||
<script>
|
||||
|
||||
//var data = [];
|
||||
|
||||
(function(){
|
||||
|
||||
var flexsearch_default = new FlexSearch();
|
||||
var flexsearch_memory = new FlexSearch("memory");
|
||||
var flexsearch_speed = new FlexSearch("speed");
|
||||
var flexsearch_fastest = new FlexSearch("fastest");
|
||||
var flexsearch_fast = new FlexSearch("fast");
|
||||
var flexsearch_match = new FlexSearch("match");
|
||||
var flexsearch_score = new FlexSearch("score");
|
||||
var flexsearch_balance = new FlexSearch("balance");
|
||||
|
||||
var tests = {
|
||||
|
||||
"fastest": {
|
||||
"fast": {
|
||||
|
||||
init: function(){},
|
||||
add: function(index, content){
|
||||
|
||||
flexsearch_fastest.add(index, content);
|
||||
flexsearch_fast.add(index, content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_fastest.search(query);
|
||||
return flexsearch_fast.search(query);
|
||||
},
|
||||
loops: 250000
|
||||
},
|
||||
@@ -146,7 +143,7 @@
|
||||
"<th>Preset </th>" +
|
||||
"<th>Benchmark (Single Phrase) </th>" +
|
||||
"<th>Benchmark (Multi Phrase) </th>" +
|
||||
"<th>Benchmark (Mixed Not Found) </th>" +
|
||||
"<th>Benchmark (Not Found) </th>" +
|
||||
"</tr>";
|
||||
|
||||
for(var test in tests){
|
||||
@@ -198,15 +195,6 @@
|
||||
}
|
||||
else{
|
||||
|
||||
/*
|
||||
window.start = function(){
|
||||
|
||||
start_tests(0, Object.keys(tests));
|
||||
};
|
||||
|
||||
document.getElementById("btn_start").disabled = false;
|
||||
*/
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
start_tests(0, 0, keys);
|
||||
@@ -280,7 +268,7 @@
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
window.tests = tests;
|
||||
//window.tests = tests;
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
463
test/benchmark-short.html
Normal file
463
test/benchmark-short.html
Normal file
@@ -0,0 +1,463 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Benchmark</title>
|
||||
<style>
|
||||
body{
|
||||
font-family: sans-serif;
|
||||
}
|
||||
table td{
|
||||
padding: 1em 2em;
|
||||
}
|
||||
button{
|
||||
padding: 5px 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>Benchmark Comparison</h2>
|
||||
<h4>Indexed Text: Movie Titles</h4>
|
||||
<hr>
|
||||
<div id="container"></div>
|
||||
<hr>
|
||||
Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least 8 matches for the query "The Spirit", 4. result should be ordered by relevance
|
||||
<script src="../dist/flexsearch.light.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/nextapps-de/bulksearch@master/bulksearch.light.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/weixsong/elasticlunr.js@0.9.6/example/elasticlunr.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/lunr@2.3.5/lunr.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/kbrsh/wade@0.3.3/dist/wade.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/krisk/Fuse@3.3.0/dist/fuse.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/js-search@1.4.2/dist/umd/js-search.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/karussell/jsii@master/web/js/src/BitSet.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/karussell/jsii@master/web/js/src/JSii.js"></script>
|
||||
<script src="https://gist.githack.com/vlad-x/a25e0c5c1eeb6bf6aa38/raw/02d1a1703e4a99a7c733c85097f583579f6af4e2/bm25.js"></script>
|
||||
<script src="../data/movies.js"></script>
|
||||
<script>
|
||||
|
||||
(function(){
|
||||
|
||||
var bulksearch;
|
||||
var flexsearch;
|
||||
// var flexsearch_cache;
|
||||
// var flexsearch_worker;
|
||||
// var flexsearch_cache_scale;
|
||||
var elasticsearch;
|
||||
var lunrsearch;
|
||||
var wade;
|
||||
var fuse;
|
||||
var jssearch;
|
||||
var jsii;
|
||||
var bm25;
|
||||
|
||||
var tests = {
|
||||
|
||||
flexsearch: {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch = new FlexSearch({
|
||||
encode: "icase",
|
||||
tokenize: "strict",
|
||||
threshold: 8,
|
||||
resolution: 9,
|
||||
depth: 1,
|
||||
async: false,
|
||||
cache: false,
|
||||
worker: false
|
||||
});
|
||||
},
|
||||
add: function(index, content){
|
||||
|
||||
flexsearch.add(index, content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch.search(query);
|
||||
},
|
||||
loops: 350000
|
||||
},
|
||||
|
||||
/*
|
||||
flexsearch_cache_unbound: {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_cache = new FlexSearch({
|
||||
encode: "icase",
|
||||
tokenize: "strict",
|
||||
threshold: 9,
|
||||
depth: 1,
|
||||
async: false,
|
||||
cache: true,
|
||||
worker: false
|
||||
});
|
||||
},
|
||||
add: function(index, content){
|
||||
|
||||
flexsearch_cache.add(index, content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_cache.search(query);
|
||||
},
|
||||
loops: 1000000
|
||||
},
|
||||
*/
|
||||
|
||||
/*
|
||||
flexsearch_cache_balanced: {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_cache_scale = new FlexSearch({
|
||||
encode: "icase",
|
||||
tokenize: "strict",
|
||||
threshold: 9,
|
||||
depth: 1,
|
||||
async: false,
|
||||
cache: 100,
|
||||
worker: false
|
||||
});
|
||||
},
|
||||
add: function(index, content){
|
||||
|
||||
flexsearch_cache_scale.add(index, content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return flexsearch_cache_scale.search(query);
|
||||
},
|
||||
loops: 1000000
|
||||
},
|
||||
*/
|
||||
|
||||
/*
|
||||
flexsearch_worker: {
|
||||
|
||||
init: function(){
|
||||
|
||||
flexsearch_worker = new FlexSearch({
|
||||
encode: "icase",
|
||||
tokenize: "strict",
|
||||
threshold: 9,
|
||||
depth: 1,
|
||||
async: true,
|
||||
cache: false,
|
||||
worker: 4
|
||||
});
|
||||
},
|
||||
add: function(index, content){
|
||||
|
||||
flexsearch_worker.add(index, content);
|
||||
},
|
||||
query: async function(query){
|
||||
|
||||
return await new Promise(function(resolve){
|
||||
|
||||
flexsearch_worker.search(query, resolve);
|
||||
});
|
||||
},
|
||||
loops: 5000
|
||||
},
|
||||
*/
|
||||
|
||||
bulksearch: {
|
||||
|
||||
init: function(){
|
||||
|
||||
bulksearch = new BulkSearch({
|
||||
type: "short",
|
||||
encode: "icase",
|
||||
multi: false,
|
||||
async: false,
|
||||
cache: false,
|
||||
worker: false
|
||||
});
|
||||
},
|
||||
add: function(index, content){
|
||||
|
||||
bulksearch.add(index, content);
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return bulksearch.search(query);
|
||||
},
|
||||
loops: 2800
|
||||
},
|
||||
|
||||
elasticlunr: {
|
||||
|
||||
init: function(){
|
||||
|
||||
elasticsearch = elasticlunr(function(){
|
||||
this.setRef("id");
|
||||
this.addField("content");
|
||||
});
|
||||
},
|
||||
add: function(index, content){
|
||||
|
||||
elasticsearch.addDoc({id: index, content: content});
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return elasticsearch.search(query);
|
||||
},
|
||||
loops: 700
|
||||
},
|
||||
|
||||
lunr: {
|
||||
|
||||
init: function(){
|
||||
|
||||
lunrsearch = lunr(function(){
|
||||
this.ref("id");
|
||||
this.field("content");
|
||||
for(var i = 0; i < data.length; i++){
|
||||
this.add({id: i, content: data[i]});
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return lunrsearch.search(query);
|
||||
},
|
||||
loops: 2400
|
||||
},
|
||||
|
||||
wade: {
|
||||
|
||||
init: function(){
|
||||
|
||||
wade = Wade(data.slice(0));
|
||||
},
|
||||
sort: function(a, b){
|
||||
|
||||
var sum = a.score - b.score;
|
||||
return sum < 0 ? 1 : sum ? -1 : 0;
|
||||
},
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return wade(query).sort(this.sort);
|
||||
},
|
||||
loops: 10000
|
||||
},
|
||||
|
||||
fuse: {
|
||||
|
||||
init: function(){
|
||||
|
||||
var payload = [];
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
payload[i] = {id: i, content: data[i]};
|
||||
}
|
||||
|
||||
fuse = new Fuse(payload, {
|
||||
keys: ["content"],
|
||||
id: "id",
|
||||
shouldSort: true,
|
||||
tokenize: true,
|
||||
matchAllTokens: true,
|
||||
threshold: 0.2
|
||||
});
|
||||
},
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return fuse.search(query);
|
||||
},
|
||||
loops: 1
|
||||
},
|
||||
|
||||
jssearch: {
|
||||
|
||||
init: function(){
|
||||
|
||||
var payload = [];
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
payload[i] = {id: i, content: data[i]};
|
||||
}
|
||||
|
||||
jssearch = new JsSearch.Search("id");
|
||||
jssearch.addIndex("content");
|
||||
jssearch.addDocuments(payload);
|
||||
},
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return jssearch.search(query);
|
||||
},
|
||||
loops: 8000
|
||||
},
|
||||
|
||||
jsii: {
|
||||
|
||||
init: function(){
|
||||
|
||||
var payload = [];
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
payload[i] = {id: i, text: data[i]};
|
||||
}
|
||||
|
||||
jsii = new JSii();
|
||||
jsii.feedDocs(payload);
|
||||
},
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return jsii.search(query);
|
||||
},
|
||||
loops: 100000
|
||||
},
|
||||
|
||||
bm25: {
|
||||
|
||||
init: function(){
|
||||
|
||||
bm25 = new BM25();
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
bm25.addDocument({id: i, body: data[i]});
|
||||
}
|
||||
|
||||
bm25.updateIdf();
|
||||
},
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return bm25.search(query);
|
||||
},
|
||||
loops: 50
|
||||
}
|
||||
};
|
||||
|
||||
function init_container(target){
|
||||
|
||||
var html = "<table>" +
|
||||
"<tr>" +
|
||||
"<th>Library </th>" +
|
||||
"<th>Benchmark (Single Phrase) </th>" +
|
||||
"<th>Benchmark (Multi Phrase) </th>" +
|
||||
"<th>Benchmark (Not Found) </th>" +
|
||||
"</tr>";
|
||||
|
||||
for(var test in tests){
|
||||
|
||||
if(tests.hasOwnProperty(test)){
|
||||
|
||||
html += "<tr>" +
|
||||
"<td>" + test + "</td>" +
|
||||
"<td id=\"test-" + test + "\">indexing ...</td>" +
|
||||
"<td id=\"test-multi-" + test + "\"></td>" +
|
||||
"<td id=\"test-notfound-" + test + "\"></td>" +
|
||||
"</tr>"
|
||||
}
|
||||
}
|
||||
|
||||
html += "</table>";
|
||||
|
||||
target.innerHTML = html;
|
||||
}
|
||||
|
||||
var is_mobile = navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/);
|
||||
|
||||
function init_tests(index, keys){
|
||||
|
||||
var key = keys[index];
|
||||
var test = tests[key];
|
||||
|
||||
test.init();
|
||||
|
||||
if(is_mobile && (test.loops > 1)){
|
||||
|
||||
test.loops = (test.loops / 5) >> 0;
|
||||
}
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
|
||||
test.add(i, data[i]);
|
||||
}
|
||||
|
||||
document.getElementById("test-" + key).textContent = "ready ...";
|
||||
|
||||
if(++index < keys.length){
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
init_tests(index, keys);
|
||||
|
||||
}, 100);
|
||||
}
|
||||
else{
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
start_tests(0, 0, keys);
|
||||
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
function start_tests(suite, index, keys){
|
||||
|
||||
var phrase = suite === 0 ? "mermaid" : (suite === 1 ? "little mermaid" : "undefined");
|
||||
var key = keys[index];
|
||||
var test = tests[key];
|
||||
var loops = test.loops;
|
||||
var query = test.query;
|
||||
var start = Date.now();
|
||||
|
||||
for(var x = 0; x < loops; x++){
|
||||
|
||||
query(phrase);
|
||||
}
|
||||
|
||||
var duration = Date.now() - start;
|
||||
|
||||
console.log("[Suite " + suite + "] " + key + ":", duration);
|
||||
|
||||
document.getElementById("test-" + (suite === 1 ? "multi-" : (suite === 2 ? "notfound-" : "")) + key).textContent = format_number(((1000 / duration * loops * 10 + 0.5) >> 0) / 10) + " op/s";
|
||||
|
||||
if(++index >= keys.length){
|
||||
|
||||
if(++suite < 3){
|
||||
|
||||
index = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(index < keys.length){
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
start_tests(suite, index, keys);
|
||||
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
init_container(document.getElementById("container"));
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
init_tests(0, Object.keys(tests));
|
||||
|
||||
}, 100);
|
||||
|
||||
function format_number(num){
|
||||
|
||||
return ("" + num).replace(/(\d)(?=(\d{3})+\b)/g, '$1,');
|
||||
}
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
//window.tests = tests;
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@@ -17,7 +17,6 @@
|
||||
</head>
|
||||
<body>
|
||||
<h2>Benchmark Comparison</h2>
|
||||
<!--<button id="btn_start" onclick="start();" disabled>Start</button>-->
|
||||
<h4>Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)</h4>
|
||||
<hr>
|
||||
<div id="container"></div>
|
||||
@@ -36,19 +35,16 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
<script src="../data/gulliver.js"></script>
|
||||
<script>
|
||||
|
||||
//var data = [];
|
||||
|
||||
(function(){
|
||||
|
||||
var bulksearch;
|
||||
var flexsearch;
|
||||
// var flexsearch_cache;
|
||||
// var flexsearch_worker;
|
||||
// var flexsearch_cache_scale;
|
||||
var flexsearch_cache;
|
||||
var flexsearch_worker;
|
||||
var flexsearch_cache_scale;
|
||||
var elasticsearch;
|
||||
var lunrsearch;
|
||||
var wade;
|
||||
//var wadesearch;
|
||||
var fuse;
|
||||
var jssearch;
|
||||
var jsii;
|
||||
@@ -63,7 +59,8 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
flexsearch = new FlexSearch({
|
||||
encode: "icase",
|
||||
tokenize: "strict",
|
||||
threshold: 9,
|
||||
threshold: 8,
|
||||
resolution: 9,
|
||||
depth: 1,
|
||||
async: false,
|
||||
cache: false,
|
||||
@@ -106,9 +103,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
},
|
||||
loops: 1000000
|
||||
},
|
||||
*/
|
||||
|
||||
/*
|
||||
flexsearch_cache_balanced: {
|
||||
|
||||
init: function(){
|
||||
@@ -133,9 +128,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
},
|
||||
loops: 1000000
|
||||
},
|
||||
*/
|
||||
|
||||
/*
|
||||
flexsearch_worker: {
|
||||
|
||||
init: function(){
|
||||
@@ -170,7 +163,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
init: function(){
|
||||
|
||||
bulksearch = new BulkSearch({
|
||||
type: "short", // this type specifies the maximum bitlength of assigned IDs!
|
||||
type: "short",
|
||||
encode: "icase",
|
||||
multi: false,
|
||||
async: false,
|
||||
@@ -204,7 +197,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
},
|
||||
query: function(query){
|
||||
|
||||
return elasticsearch.search(query)/*.map(function(val){return val.ref})*/;
|
||||
return elasticsearch.search(query);
|
||||
},
|
||||
loops: 100
|
||||
},
|
||||
@@ -224,7 +217,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return lunrsearch.search(query)/*.map(function(val){return val.ref})*/;
|
||||
return lunrsearch.search(query);
|
||||
},
|
||||
loops: 350
|
||||
},
|
||||
@@ -243,7 +236,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return wade(query).sort(this.sort)/*.map(function(val){return val.index})*/;
|
||||
return wade(query).sort(this.sort);
|
||||
},
|
||||
loops: 1500
|
||||
},
|
||||
@@ -292,7 +285,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return jssearch.search(query)/*.map(function(val){return val.id})*/;
|
||||
return jssearch.search(query);
|
||||
},
|
||||
loops: 800
|
||||
},
|
||||
@@ -313,7 +306,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return jsii.search(query)/*.docs.map(function(val){return val.id})*/;
|
||||
return jsii.search(query);
|
||||
},
|
||||
loops: 600
|
||||
},
|
||||
@@ -333,7 +326,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
add: function(index, content){},
|
||||
query: function(query){
|
||||
|
||||
return bm25.search(query)/*.map(function(val){return val.id})*/;
|
||||
return bm25.search(query);
|
||||
},
|
||||
loops: 95
|
||||
}
|
||||
@@ -398,15 +391,6 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
}
|
||||
else{
|
||||
|
||||
/*
|
||||
window.start = function(){
|
||||
|
||||
start_tests(0, Object.keys(tests));
|
||||
};
|
||||
|
||||
document.getElementById("btn_start").disabled = false;
|
||||
*/
|
||||
|
||||
setTimeout(function(){
|
||||
|
||||
start_tests(0, 0, keys);
|
||||
@@ -480,7 +464,7 @@ Test rules: 1. no cache allowed, 2. no async allowed, 3. should return at least
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
window.tests = tests;
|
||||
//window.tests = tests;
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
@@ -22,6 +22,7 @@
|
||||
var env = "min";
|
||||
</script>
|
||||
<script src="test.js"></script>
|
||||
<!--<script src="test.es6.js"></script>-->
|
||||
<script>
|
||||
if(window.mochaPhantomJS) {
|
||||
|
||||
|
@@ -28,7 +28,7 @@
|
||||
<th>matching</th>
|
||||
<th>scoring</th>
|
||||
<th>balanced</th>
|
||||
<th>fastest</th>
|
||||
<th>fast</th>
|
||||
</tr>
|
||||
<tr id="test-1">
|
||||
<td style="width: 200px">"without breach of modesty"</td>
|
||||
@@ -175,7 +175,7 @@
|
||||
var flexsearch_default = new FlexSearch();
|
||||
var flexsearch_memory = new FlexSearch("memory");
|
||||
var flexsearch_speed = new FlexSearch("speed");
|
||||
var flexsearch_fastest = new FlexSearch("fastest");
|
||||
var flexsearch_fast = new FlexSearch("fast");
|
||||
var flexsearch_match = new FlexSearch("match");
|
||||
var flexsearch_score = new FlexSearch("score");
|
||||
var flexsearch_balance = new FlexSearch("balance");
|
||||
@@ -242,13 +242,13 @@
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
console.time('flexsearch_fastest');
|
||||
console.time('flexsearch_fast');
|
||||
|
||||
for(var i = 0; i < data.length; i++){
|
||||
flexsearch_fastest.add(i, data[i]);
|
||||
flexsearch_fast.add(i, data[i]);
|
||||
}
|
||||
|
||||
console.timeEnd('flexsearch_fastest');
|
||||
console.timeEnd('flexsearch_fast');
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
@@ -301,7 +301,7 @@
|
||||
break;
|
||||
|
||||
case 7:
|
||||
results = flexsearch_fastest.search(query);
|
||||
results = flexsearch_fast.search(query);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -277,7 +277,8 @@
|
||||
flexsearch = new FlexSearch({
|
||||
encode: 'extra',
|
||||
tokenize: 'strict',
|
||||
threshold: 5,
|
||||
threshold: 0,
|
||||
resolution: 9,
|
||||
depth: 3,
|
||||
suggest: true
|
||||
});
|
||||
|
493
test/test.es6.js
493
test/test.es6.js
@@ -1,416 +1,147 @@
|
||||
var env = "";
|
||||
|
||||
if(typeof module !== "undefined"){
|
||||
|
||||
var expect = require("chai").expect;
|
||||
var FlexSearch = require("../" + (env ? "dist/": "") + "flexsearch" + (env ? "." + env : "") + ".js");
|
||||
}
|
||||
|
||||
module.exports = function(FlexSearch, env){
|
||||
// ------------------------------------------------------------------------
|
||||
// Multi-Field Documents
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Multi-Field Documents
|
||||
// ------------------------------------------------------------------------
|
||||
describe("Index Multi-Field Documents (ES6)", function(){
|
||||
|
||||
if(env === "") describe("Index Multi-Field Documents", function(){
|
||||
var data = [{
|
||||
|
||||
var data = [{
|
||||
id: 2,
|
||||
data:{
|
||||
title: "Title 3",
|
||||
body: "Body 3"
|
||||
}
|
||||
},{
|
||||
id: 1,
|
||||
data:{
|
||||
title: "Title 2",
|
||||
body: "Body 2"
|
||||
}
|
||||
},{
|
||||
id: 0,
|
||||
data:{
|
||||
title: "Title 1",
|
||||
body: "Body 1"
|
||||
}
|
||||
}];
|
||||
|
||||
id: 2,
|
||||
data:{
|
||||
title: "Title 3",
|
||||
body: "Body 3"
|
||||
var update = [{
|
||||
|
||||
id: 0,
|
||||
data:{
|
||||
title: "Foo 1",
|
||||
body: "Bar 1"
|
||||
}
|
||||
},{
|
||||
id: 1,
|
||||
data:{
|
||||
title: "Foo 2",
|
||||
body: "Bar 2"
|
||||
}
|
||||
},{
|
||||
id: 2,
|
||||
data:{
|
||||
title: "Foo 3",
|
||||
body: "Bar 3"
|
||||
}
|
||||
}];
|
||||
|
||||
it("Should have been indexed properly (Async)", async function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
async: true,
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title",
|
||||
"data:body"
|
||||
]
|
||||
}
|
||||
},{
|
||||
id: 1,
|
||||
data:{
|
||||
title: "Title 2",
|
||||
body: "Body 2"
|
||||
}
|
||||
},{
|
||||
id: 0,
|
||||
data:{
|
||||
title: "Title 1",
|
||||
body: "Body 1"
|
||||
}
|
||||
}];
|
||||
|
||||
var update = [{
|
||||
|
||||
id: 0,
|
||||
data:{
|
||||
title: "Foo 1",
|
||||
body: "Bar 1"
|
||||
}
|
||||
},{
|
||||
id: 1,
|
||||
data:{
|
||||
title: "Foo 2",
|
||||
body: "Bar 2"
|
||||
}
|
||||
},{
|
||||
id: 2,
|
||||
data:{
|
||||
title: "Foo 3",
|
||||
body: "Bar 3"
|
||||
}
|
||||
}];
|
||||
|
||||
it("Should have been indexed properly", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title",
|
||||
"data:body"
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
index.add(data);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
|
||||
expect(index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: "data:title", query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search({query: "body"})).to.have.members(data);
|
||||
expect(index.search("title")).to.have.members(data);
|
||||
|
||||
expect(index.search({
|
||||
|
||||
field: "data:title",
|
||||
query: "title",
|
||||
boost: 2
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search([{
|
||||
|
||||
field: "data:title",
|
||||
query: "body",
|
||||
boost: 2
|
||||
},{
|
||||
field: "data:body",
|
||||
query: "body",
|
||||
boost: 2
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
expect(index.search("title", {
|
||||
|
||||
field: "data:title",
|
||||
boost: 2
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search("title", {
|
||||
|
||||
field: "data:body",
|
||||
boost: 2
|
||||
|
||||
})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search("body", [{
|
||||
|
||||
field: "data:title",
|
||||
boost: 2
|
||||
},{
|
||||
field: "data:body",
|
||||
boost: 2
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
index.update(update);
|
||||
|
||||
expect(index.search("foo")).not.to.have.members(data);
|
||||
expect(index.search("bar")).not.to.have.members(data);
|
||||
expect(index.search("foo")).to.have.members(update);
|
||||
expect(index.search("bar")).to.have.members(update);
|
||||
|
||||
index.remove(update);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(0);
|
||||
expect(index.doc.index[1].length).to.equal(0);
|
||||
});
|
||||
|
||||
it("Should have been boosted properly", function(){
|
||||
await index.add(data);
|
||||
|
||||
var index = new FlexSearch({
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
|
||||
tokenize: "strict",
|
||||
depth: 3,
|
||||
doc: {
|
||||
id: "id",
|
||||
field: ["title", "body"]
|
||||
}
|
||||
});
|
||||
expect(await index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: "data:title", query: "title"})).to.have.members(data);
|
||||
|
||||
index.add([{
|
||||
expect(await index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(await index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
id: 0,
|
||||
title: "1 2 3 4 5",
|
||||
body: "1 2 3 4 5"
|
||||
},{
|
||||
id: 1,
|
||||
title: "1 2 3 4 5",
|
||||
body: "1 2 5 4 3" // <-- body
|
||||
},{
|
||||
id: 2,
|
||||
title: "1 2 5 4 3", // <-- title
|
||||
body: "1 2 3 4 5"
|
||||
}]);
|
||||
expect(await index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search([{
|
||||
expect(await index.search({query: "body"})).to.have.members(data);
|
||||
expect(await index.search("title")).to.have.members(data);
|
||||
|
||||
field: "title",
|
||||
query: "5",
|
||||
boost: 0.1
|
||||
},{
|
||||
field: "body",
|
||||
query: "5",
|
||||
boost: 9
|
||||
await index.update(update);
|
||||
|
||||
}])[0].id).to.equal(1);
|
||||
expect(await index.search("foo")).not.to.have.members(data);
|
||||
expect(await index.search("bar")).not.to.have.members(data);
|
||||
expect(await index.search("foo")).to.have.members(update);
|
||||
expect(await index.search("bar")).to.have.members(update);
|
||||
|
||||
expect(index.search([{
|
||||
await index.remove(update);
|
||||
|
||||
field: "title",
|
||||
query: "5",
|
||||
boost: 9
|
||||
},{
|
||||
field: "body",
|
||||
query: "5",
|
||||
boost: 0.1
|
||||
|
||||
}])[0].id).to.equal(2);
|
||||
});
|
||||
|
||||
it("Should have been indexed properly (Async)", async function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
async: true,
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title",
|
||||
"data:body"
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
await index.add(data);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
|
||||
expect(await index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: "data:title", query: "title"})).to.have.members(data);
|
||||
|
||||
expect(await index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(await index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(await index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(await index.search({query: "body"})).to.have.members(data);
|
||||
expect(await index.search("title")).to.have.members(data);
|
||||
|
||||
await index.update(update);
|
||||
|
||||
expect(await index.search("foo")).not.to.have.members(data);
|
||||
expect(await index.search("bar")).not.to.have.members(data);
|
||||
expect(await index.search("foo")).to.have.members(update);
|
||||
expect(await index.search("bar")).to.have.members(update);
|
||||
|
||||
await index.remove(update);
|
||||
|
||||
expect(await index.doc.index[0].length).to.equal(0);
|
||||
expect(await index.doc.index[1].length).to.equal(0);
|
||||
});
|
||||
|
||||
it("Should have been indexed properly (Worker)", async function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
worker: 4,
|
||||
async: true,
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title",
|
||||
"data:body"
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
await index.add(data);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
|
||||
expect(await index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: "data:title", query: "title"})).to.have.members(data);
|
||||
|
||||
expect(await index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(await index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(await index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(await index.search({query: "body"})).to.have.members(data);
|
||||
expect(await index.search("title")).to.have.members(data);
|
||||
|
||||
await index.update(update);
|
||||
|
||||
expect(await index.search("foo")).not.to.have.members(data);
|
||||
expect(await index.search("bar")).not.to.have.members(data);
|
||||
expect(await index.search("foo")).to.have.members(update);
|
||||
expect(await index.search("bar")).to.have.members(update);
|
||||
|
||||
await index.remove(update);
|
||||
|
||||
expect(await index.doc.index[0].length).to.equal(0);
|
||||
expect(await index.doc.index[1].length).to.equal(0);
|
||||
});
|
||||
|
||||
it("Should have been sorted properly", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title"
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
index.add(data);
|
||||
|
||||
var results = index.search({
|
||||
|
||||
field: "data:title",
|
||||
query: "title"
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[0]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[2]);
|
||||
|
||||
results = index.search({
|
||||
|
||||
query: "title",
|
||||
field: "data:title",
|
||||
sort: function(a, b){
|
||||
|
||||
const diff = a.id - b.id;
|
||||
return (diff < 0 ? -1 : (diff ? 1 : 0));
|
||||
}
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[2]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[0]);
|
||||
|
||||
results = index.search({
|
||||
|
||||
query: "title",
|
||||
field: "data:title",
|
||||
sort: "id"
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[2]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[0]);
|
||||
|
||||
results = index.search({
|
||||
|
||||
query: "title",
|
||||
field: "data:title",
|
||||
sort: "data:title"
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[2]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[0]);
|
||||
});
|
||||
expect(await index.doc.index[0].length).to.equal(0);
|
||||
expect(await index.doc.index[1].length).to.equal(0);
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Export / Import
|
||||
// ------------------------------------------------------------------------
|
||||
it("Should have been indexed properly (Worker)", async function(){
|
||||
|
||||
if(env !== "light") describe("Export / Import", function(){
|
||||
var index = new FlexSearch({
|
||||
|
||||
var data;
|
||||
worker: 4,
|
||||
async: true,
|
||||
doc: {
|
||||
|
||||
it("Should have been exported properly", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
tokenize: "reverse",
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
|
||||
index.add({id: 0, title: "foo"});
|
||||
index.add({id: 1, title: "bar"});
|
||||
index.add({id: 2, title: "foobar"});
|
||||
|
||||
if(env === ""){
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
|
||||
data = index.export();
|
||||
|
||||
expect(data).to.equal(JSON.stringify([
|
||||
[
|
||||
index.doc.index[0]._map,
|
||||
index.doc.index[0]._ctx,
|
||||
index.doc.index[0]._ids
|
||||
],
|
||||
index._doc
|
||||
]));
|
||||
}
|
||||
else{
|
||||
|
||||
data = index.export();
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title",
|
||||
"data:body"
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
it("Should have been imported properly", function(){
|
||||
await index.add(data);
|
||||
|
||||
var index = new FlexSearch("score", {
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "title"
|
||||
}
|
||||
});
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
|
||||
index.import(data);
|
||||
expect(await index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: "data:title", query: "title"})).to.have.members(data);
|
||||
|
||||
if(env === ""){
|
||||
expect(await index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(await index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
}
|
||||
expect(await index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(await index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search("foo")).to.have.lengthOf(2);
|
||||
expect(index.search("bar")).to.have.lengthOf(2);
|
||||
expect(index.search("foobar")).to.have.lengthOf(1);
|
||||
expect(index.search("foobar")[0].id).to.equal(2);
|
||||
});
|
||||
expect(await index.search({query: "body"})).to.have.members(data);
|
||||
expect(await index.search("title")).to.have.members(data);
|
||||
|
||||
await index.update(update);
|
||||
|
||||
expect(await index.search("foo")).not.to.have.members(data);
|
||||
expect(await index.search("bar")).not.to.have.members(data);
|
||||
expect(await index.search("foo")).to.have.members(update);
|
||||
expect(await index.search("bar")).to.have.members(update);
|
||||
|
||||
await index.remove(update);
|
||||
|
||||
expect(await index.doc.index[0].length).to.equal(0);
|
||||
expect(await index.doc.index[1].length).to.equal(0);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
484
test/test.js
484
test/test.js
@@ -1,11 +1,5 @@
|
||||
if(typeof module !== "undefined"){
|
||||
|
||||
// Node.js Stub
|
||||
|
||||
URL = function(string){};
|
||||
URL.createObjectURL = function(val){};
|
||||
Blob = function(string){};
|
||||
|
||||
var env = process.argv[3] === "test" ? "min" : process.argv[3] === "test/" ? "light" : "";
|
||||
var expect = require("chai").expect;
|
||||
var FlexSearch = require("../" + (env ? "dist/": "") + "flexsearch" + (env ? "." + env : "") + ".js");
|
||||
@@ -110,6 +104,7 @@ describe("Initialize", function(){
|
||||
|
||||
encode: "icase",
|
||||
tokenize: "reverse",
|
||||
resolution: 10,
|
||||
async: false,
|
||||
worker: false
|
||||
});
|
||||
@@ -140,6 +135,17 @@ describe("Initialize", function(){
|
||||
expect(flexsearch_default).to.be.an.instanceOf(FlexSearch);
|
||||
expect(flexsearch_sync).to.be.an.instanceOf(FlexSearch);
|
||||
expect(flexsearch_async).to.be.an.instanceOf(FlexSearch);
|
||||
|
||||
it("Should have correct uuids", function(){
|
||||
|
||||
expect(flexsearch_default.id).to.equal(0);
|
||||
expect(flexsearch_sync.id).to.equal(1);
|
||||
expect(flexsearch_async.id).to.equal(2);
|
||||
expect(flexsearch_icase.id).to.equal(3);
|
||||
expect(flexsearch_simple.id).to.equal(4);
|
||||
expect(flexsearch_advanced.id).to.equal(5);
|
||||
expect(flexsearch_extra.id).to.equal(6);
|
||||
});
|
||||
});
|
||||
|
||||
it("Should have all provided methods", function(){
|
||||
@@ -157,17 +163,6 @@ describe("Initialize", function(){
|
||||
}
|
||||
});
|
||||
|
||||
it("Should have correct uuids", function(){
|
||||
|
||||
expect(flexsearch_default.id).to.equal(0);
|
||||
expect(flexsearch_sync.id).to.equal(1);
|
||||
expect(flexsearch_async.id).to.equal(2);
|
||||
expect(flexsearch_icase.id).to.equal(3);
|
||||
expect(flexsearch_simple.id).to.equal(4);
|
||||
expect(flexsearch_advanced.id).to.equal(5);
|
||||
expect(flexsearch_extra.id).to.equal(6);
|
||||
});
|
||||
|
||||
it("Should have the correct options", function(){
|
||||
|
||||
if(env !== "light"){
|
||||
@@ -1104,7 +1099,7 @@ if(env !== "light") describe("Suggestions", function(){
|
||||
// Where Clause
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
if(env === "") describe("Where/Find", function(){
|
||||
if(env === "" || env === "min") describe("Where/Find", function(){
|
||||
|
||||
var data = [{
|
||||
id: 0,
|
||||
@@ -1128,8 +1123,7 @@ if(env === "") describe("Where/Find", function(){
|
||||
var index = new FlexSearch({
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "title",
|
||||
tag: "cat"
|
||||
field: ["title"]
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1175,10 +1169,445 @@ if(env === "") describe("Where/Find", function(){
|
||||
// Multi-Field Documents
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
if((typeof require !== "undefined") && !this._phantom){
|
||||
if(env !== "light") describe("Index Multi-Field Documents", function(){
|
||||
|
||||
require("./test.es6.js")(FlexSearch, env);
|
||||
}
|
||||
var data = [{
|
||||
|
||||
id: 2,
|
||||
data:{
|
||||
title: "Title 3",
|
||||
body: "Body 3"
|
||||
}
|
||||
},{
|
||||
id: 1,
|
||||
data:{
|
||||
title: "Title 2",
|
||||
body: "Body 2"
|
||||
}
|
||||
},{
|
||||
id: 0,
|
||||
data:{
|
||||
title: "Title 1",
|
||||
body: "Body 1"
|
||||
}
|
||||
}];
|
||||
|
||||
var update = [{
|
||||
|
||||
id: 0,
|
||||
data:{
|
||||
title: "Foo 1",
|
||||
body: "Bar 1"
|
||||
}
|
||||
},{
|
||||
id: 1,
|
||||
data:{
|
||||
title: "Foo 2",
|
||||
body: "Bar 2"
|
||||
}
|
||||
},{
|
||||
id: 2,
|
||||
data:{
|
||||
title: "Foo 3",
|
||||
body: "Bar 3"
|
||||
}
|
||||
}];
|
||||
|
||||
it("Should have been indexed properly", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: [
|
||||
"data:title",
|
||||
"data:body"
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
index.add(data);
|
||||
|
||||
if(env === ""){
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
}
|
||||
|
||||
expect(index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: "data:title", query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search({query: "body"})).to.have.members(data);
|
||||
expect(index.search("title")).to.have.members(data);
|
||||
|
||||
expect(index.search({
|
||||
|
||||
field: "data:title",
|
||||
query: "title",
|
||||
boost: 2
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search([{
|
||||
|
||||
field: "data:title",
|
||||
query: "body",
|
||||
boost: 2
|
||||
},{
|
||||
field: "data:body",
|
||||
query: "body",
|
||||
boost: 2
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
expect(index.search("title", {
|
||||
|
||||
field: "data:title",
|
||||
boost: 2
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search("title", {
|
||||
|
||||
field: "data:body",
|
||||
boost: 2
|
||||
|
||||
})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search("body", [{
|
||||
|
||||
field: "data:title",
|
||||
boost: 2
|
||||
},{
|
||||
field: "data:body",
|
||||
boost: 2
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
index.update(update);
|
||||
|
||||
expect(index.search("foo")).not.to.have.members(data);
|
||||
expect(index.search("bar")).not.to.have.members(data);
|
||||
expect(index.search("foo")).to.have.members(update);
|
||||
expect(index.search("bar")).to.have.members(update);
|
||||
|
||||
index.remove(update);
|
||||
|
||||
if(env === ""){
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(0);
|
||||
expect(index.doc.index[1].length).to.equal(0);
|
||||
}
|
||||
});
|
||||
|
||||
it("Should have been indexed properly (custom fields)", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: {
|
||||
"data:title": {
|
||||
encode: "advanced",
|
||||
tokenize: "reverse"
|
||||
},
|
||||
"data:body": {
|
||||
encode: "icase",
|
||||
tokenize: "strict"
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
index.add(data);
|
||||
|
||||
if(env === ""){
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
}
|
||||
|
||||
expect(index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: "data:title", query: "tle"})).to.have.members(data);
|
||||
|
||||
expect(index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: ["data:body", "data:title"], query: "tle"})).to.have.members(data);
|
||||
|
||||
expect(index.search({query: "body"})).to.have.members(data);
|
||||
expect(index.search("tle")).to.have.members(data);
|
||||
|
||||
expect(index.search({
|
||||
|
||||
field: "data:title",
|
||||
query: "tle"
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search([{
|
||||
|
||||
field: "data:title",
|
||||
query: "body"
|
||||
},{
|
||||
field: "data:body",
|
||||
query: "body"
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
expect(index.search("tle", {
|
||||
|
||||
field: "data:title"
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search("tle", {
|
||||
|
||||
field: "data:body"
|
||||
|
||||
})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search("body", [{
|
||||
|
||||
field: "data:title"
|
||||
},{
|
||||
field: "data:body"
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
index.update(update);
|
||||
|
||||
expect(index.search("foo")).not.to.have.members(data);
|
||||
expect(index.search("bar")).not.to.have.members(data);
|
||||
expect(index.search("foo")).to.have.members(update);
|
||||
expect(index.search("bar")).to.have.members(update);
|
||||
|
||||
index.remove(update);
|
||||
|
||||
if(env === ""){
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(0);
|
||||
expect(index.doc.index[1].length).to.equal(0);
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
it("Should have been indexed properly (tag)", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
doc: {
|
||||
|
||||
id: "id",
|
||||
field: "data:body",
|
||||
tag: "data:title"
|
||||
}
|
||||
});
|
||||
|
||||
index.add(data);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
expect(index.doc.index[1].length).to.equal(3);
|
||||
|
||||
expect(index.search({field: "data:body", query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: "data:title", query: "title"})).to.have.lengthOf(0);
|
||||
expect(index.search({field: "data:title", query: "Title 1"})).to.have.members(data[0]);
|
||||
|
||||
expect(index.search({field: "data:body", query: "title"})).to.have.lengthOf(0);
|
||||
expect(index.search({field: "data:title", query: "body"})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search({field: ["data:title", "data:body"], query: "body"})).to.have.members(data);
|
||||
expect(index.search({field: ["data:body", "data:title"], query: "title"})).to.have.members(data);
|
||||
|
||||
expect(index.search({query: "body"})).to.have.members(data);
|
||||
expect(index.search("title")).to.have.members(data);
|
||||
|
||||
expect(index.search({
|
||||
|
||||
field: "data:title",
|
||||
query: "title",
|
||||
boost: 2
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search([{
|
||||
|
||||
field: "data:title",
|
||||
query: "body",
|
||||
boost: 2
|
||||
},{
|
||||
field: "data:body",
|
||||
query: "body",
|
||||
boost: 2
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
expect(index.search("title", {
|
||||
|
||||
field: "data:title",
|
||||
boost: 2
|
||||
|
||||
})).to.have.members(data);
|
||||
|
||||
expect(index.search("title", {
|
||||
|
||||
field: "data:body",
|
||||
boost: 2
|
||||
|
||||
})).to.have.lengthOf(0);
|
||||
|
||||
expect(index.search("body", [{
|
||||
|
||||
field: "data:title",
|
||||
boost: 2
|
||||
},{
|
||||
field: "data:body",
|
||||
boost: 2
|
||||
|
||||
}])).to.have.members(data);
|
||||
|
||||
index.update(update);
|
||||
|
||||
expect(index.search("foo")).not.to.have.members(data);
|
||||
expect(index.search("bar")).not.to.have.members(data);
|
||||
expect(index.search("foo")).to.have.members(update);
|
||||
expect(index.search("bar")).to.have.members(update);
|
||||
|
||||
index.remove(update);
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(0);
|
||||
expect(index.doc.index[1].length).to.equal(0);
|
||||
});
|
||||
*/
|
||||
|
||||
/*
|
||||
it("Should have been boosted properly", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
tokenize: "strict",
|
||||
depth: 3,
|
||||
doc: {
|
||||
id: "id",
|
||||
field: ["title", "body"]
|
||||
}
|
||||
});
|
||||
|
||||
index.add([{
|
||||
|
||||
id: 0,
|
||||
title: "1 2 3 4 5",
|
||||
body: "1 2 3 4 5"
|
||||
},{
|
||||
id: 1,
|
||||
title: "1 2 3 4 5",
|
||||
body: "1 2 5 4 3" // <-- body
|
||||
},{
|
||||
id: 2,
|
||||
title: "1 2 5 4 3", // <-- title
|
||||
body: "1 2 3 4 5"
|
||||
}]);
|
||||
|
||||
expect(index.search([{
|
||||
|
||||
field: "title",
|
||||
query: "5",
|
||||
boost: 0.1
|
||||
},{
|
||||
field: "body",
|
||||
query: "5",
|
||||
boost: 9
|
||||
|
||||
}])[0].id).to.equal(1);
|
||||
|
||||
expect(index.search([{
|
||||
|
||||
field: "title",
|
||||
query: "5",
|
||||
boost: 9
|
||||
},{
|
||||
field: "body",
|
||||
query: "5",
|
||||
boost: 0.1
|
||||
|
||||
}])[0].id).to.equal(2);
|
||||
});
|
||||
*/
|
||||
|
||||
it("Should have been sorted properly", function(){
|
||||
|
||||
var index = new FlexSearch({
|
||||
|
||||
doc: {
|
||||
id: "id",
|
||||
field: "data:title"
|
||||
}
|
||||
});
|
||||
|
||||
index.add(data);
|
||||
|
||||
var results = index.search({
|
||||
|
||||
field: "data:title",
|
||||
query: "title"
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[0]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[2]);
|
||||
|
||||
results = index.search({
|
||||
|
||||
query: "title",
|
||||
field: "data:title",
|
||||
sort: function(a, b){
|
||||
|
||||
const diff = a.id - b.id;
|
||||
return (diff < 0 ? -1 : (diff ? 1 : 0));
|
||||
}
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[2]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[0]);
|
||||
|
||||
results = index.search({
|
||||
|
||||
query: "title",
|
||||
field: "data:title",
|
||||
sort: "id"
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[2]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[0]);
|
||||
|
||||
results = index.search({
|
||||
|
||||
query: "title",
|
||||
field: "data:title",
|
||||
sort: "data:title"
|
||||
});
|
||||
|
||||
expect(results[0]).to.equal(data[2]);
|
||||
expect(results[1]).to.equal(data[1]);
|
||||
expect(results[2]).to.equal(data[0]);
|
||||
});
|
||||
|
||||
if(env === "" && (typeof require !== "undefined") && !this._phantom){
|
||||
|
||||
require("./test.es6.js");
|
||||
}
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Export / Import
|
||||
@@ -1202,12 +1631,11 @@ if(env !== "light") describe("Export / Import", function(){
|
||||
index.add({id: 1, title: "bar"});
|
||||
index.add({id: 2, title: "foobar"});
|
||||
|
||||
data = index.export();
|
||||
|
||||
if(env === ""){
|
||||
|
||||
expect(index.doc.index[0].length).to.equal(3);
|
||||
|
||||
data = index.export();
|
||||
|
||||
expect(data).to.equal(JSON.stringify([
|
||||
[
|
||||
index.doc.index[0]._map,
|
||||
@@ -1217,10 +1645,6 @@ if(env !== "light") describe("Export / Import", function(){
|
||||
index._doc
|
||||
]));
|
||||
}
|
||||
else{
|
||||
|
||||
data = index.export();
|
||||
}
|
||||
});
|
||||
|
||||
it("Should have been imported properly", function(){
|
||||
|
Reference in New Issue
Block a user