为什么 Elasticlunr 版本 0.9.5 无法使用以下代码与 Safari 10.3.3 (14F89) 一起使



使用elasticlunr,我设置了一个索引,如下所示:

elasticlunr.clearStopWords();
elasticlunr.tokenizer.seperator = /[s-/@]+/;
function indexStops(document) {
var index = elasticlunr();
index.pipeline.remove(elasticlunr.stemmer);
index.setRef('stop_id');
index.addField('stop_code');
index.addField('stop_name');
index.addField('stop_desc');
index.saveDocument(false);
var i = 0;
for (var doc in document) {
index.addDoc(document[doc]);
i++;
}
return index;
}

然后我按如下方式使用它:

var results = index.search(searchText, {
bool: "AND",
expand: true
});

在Safari以外的任何现代浏览器上,它都可以工作。在 Safari IOS 8.4.1 和 9.3.5 上它可以工作。在 Safari 10.3.3 和现代版本的 MAC OS X 上,它不起作用。它返回偶尔的搜索文本值的结果,但大多数不返回任何内容。 两个问题

此代码片段中是否有任何非标准的内容并影响对现代版本的 Safari 的搜索?

弹性和某些浏览器版本是否存在已知问题?

一般来说,我无法访问苹果平台上的javascript调试工具。但是,有一次我做了结果,当时没有匹配,应该在调试器中看到的形式是这样的:

results: [{ref: "0", score Nan}, {ref: "1", score Nan},{ref: "2", score Nan} .....etc... ]

对于适用于所有浏览器的东西,解决方案是编写自己的搜索。如果您对词干或停用词不感兴趣,并且有一个包含数据的 json 对象,其中键是引用,那么它就像

var text;
for (var ref in dataAsJson) {
// text is what you will use when searching for matches
text = dataAsJson[ref].searchField1 + dataAsJson[ref].searchField2; //etc
text = text.toLowerCase();
dataAsJson[ref].search = text; 
}

然后搜索方法(直到搜索文本包含至少 3 个字符时才启动(为

function searchStops(dataAsJson, searchText) {
var matchRefs = [];
if (dataAsJson == undefined || searchText.length < 3) {
return matchRefs;
}
// Create an array of searchTerms from searchText which are all lowercase. 
// Split on whitespace
var terms = searchText.split(/[s]+/);
var searchTerms = [];
for (var i=0; i<terms.length; i++) {
if (terms[i].length > 0) {
searchTerms.push(terms[i].toLowerCase());
}
}
var match;
var search;
for (var ref in dataAsJson) {
match = true;
search = dataAsJson[ref].search;
for (var i=0; i<searchTerms.length; i++) {
if (search.indexOf(searchTerms[i]) == -1) {
// Start by assuming a match, however if any of the terms are
// not found we do not match
match = false;
break;
}
}
if (match) {
matchRefs.push(ref);        
}
}
return matchRefs;
}

我正在将其与包含大约 8000 行的 dataAsJson 一起使用,每行有 5-10 个单词,并且没有注意到它比等效的 elasticlunr 实现慢(这两种情况对用户来说都是即时的(

最新更新