用于搜索引擎样式搜索的JavaScript库?

Jor*_*dan 19 javascript search

是否有一个JavaScript库可以确定字符串是否与搜索查询匹配?它应该是高效的,并提供类似Google或LexisNexis的高级查询功能(诸如和/或运算符,同义词和括号之类的东西).任何类型的高级搜索功能都会很棒; 它不必与任何特定搜索引擎完全匹配.

动机:我有一个HTML页面,其中包含一个搜索框,后跟一堆段落(它们具有唯一ID,并且是从JavaScript数组生成的).当用户在框中键入搜索查询并按Enter键时,如果它们与查询不匹配,则应隐藏所有段落(即display设置为none).

我目前的策略(使用jQuery):

  1. 通过将查询字符串拆分为空格,将查询字符串分隔为关键字数组.
  2. 隐藏所有段落$('p').hide().
  3. 对于每个关键字,显示包含它的段落$('p:contains("'+keyword+'")').show().

这是一个非常有限的搜索功能,是区分大小写的,把所有的关键字为可选,并没有提供像运营商and,or或小括号.这也是效率低下的,因为即使已经匹配,它也会为每个关键字遍历每个字符串一次.

tur*_*nvh 31

以下是我正在为项目评估的一些库(2013年7月).其中任何一个都应该能够提供搜索功能的核心.

如果您想构建自己的,那么这里有两种常见的词干算法的实现,可以帮助您入门:

至于处理布尔逻辑搜索运算符,也许这个关于js查询解析器的问题会很有用.

  • @Noitidart我在一段时间内一直没有对这些系统的需求,但是如果我今天要做某事,我的第一选择仍然会像以前一样:lunrjs (3认同)

小智 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)