Jor*_*dan 19 javascript search
是否有一个JavaScript库可以确定字符串是否与搜索查询匹配?它应该是高效的,并提供类似Google或LexisNexis的高级查询功能(诸如和/或运算符,同义词和括号之类的东西).任何类型的高级搜索功能都会很棒; 它不必与任何特定搜索引擎完全匹配.
动机:我有一个HTML页面,其中包含一个搜索框,后跟一堆段落(它们具有唯一ID,并且是从JavaScript数组生成的).当用户在框中键入搜索查询并按Enter键时,如果它们与查询不匹配,则应隐藏所有段落(即display
设置为none
).
我目前的策略(使用jQuery):
$('p').hide()
.$('p:contains("'+keyword+'")').show()
.这是一个非常有限的搜索功能,是区分大小写的,把所有的关键字为可选,并没有提供像运营商and
,or
或小括号.这也是效率低下的,因为即使已经匹配,它也会为每个关键字遍历每个字符串一次.
tur*_*nvh 31
以下是我正在为项目评估的一些库(2013年7月).其中任何一个都应该能够提供搜索功能的核心.
如果您想构建自己的,那么这里有两种常见的词干算法的实现,可以帮助您入门:
至于处理布尔逻辑搜索运算符,也许这个关于js查询解析器的问题会很有用.
小智 5
最好(简单又好)的方法是使用矢量搜索算法。
首先将每个段落中的所有单词保存在一个向量对象中(稍后解释如何构建)并比较每个段落向量的查询向量的关系
然后在每个单词上使用Porter 词干分析器将其聚类为 Kid 和 kids 之类的东西。
var Vector = function(phar) {
var self = this;
self.InitVector = function () {
var wordArray = self.spltwords(phar);
self.VectorSize = wordArray .length;
var stemdWordArray = self.runPotterStemmer(wordArray);
self.VectoData = self.GroupAndCountWords(stemdWordArray) ;
}
self.VectoData = {};
self.runPotterStemmer = function(arr){
// run potter as seen in link
}
self.spltwords= function(arr) {
// run split
}
self.GroupAndCountWords = function(arr) {
for (var i=0; i<arr.length; i++) {
if (VectoData[arr[i]] === undefined) {
VectoData[arr[i]] = 0;
} else {
VectoData[arr[i]] = VectoData[arr[i]] +1;
}
}
}
self.compare = function(queryVector) {
// compare queryVector to current vector and return a similarity number
// number of similar words count in query divided by the length of paragraph
}
self.InitVector()
return self;
Run Code Online (Sandbox Code Playgroud)