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

用于搜索引擎样式搜索的JavaScript库?,javascript,search,Javascript,Search,是否有JavaScript库可以确定字符串是否与搜索查询匹配?它应该是高效的,并提供像Google或LexisNexis那样的高级查询功能(像和/或运算符、同义词和括号)。任何一种高级搜索功能都会很棒;它不必与任何特定的搜索引擎完全匹配 动机:我有一个带有搜索框的HTML页面,后面是一堆段落(它们有唯一的ID,并且是从JavaScript数组生成的)。当用户在框中键入搜索查询并按enter键时,如果所有段落与查询不匹配,则应隐藏所有段落(即其显示设置为无) 我当前的策略(使用jQuery): 通

是否有JavaScript库可以确定字符串是否与搜索查询匹配?它应该是高效的,并提供像Google或LexisNexis那样的高级查询功能(像和/或运算符、同义词和括号)。任何一种高级搜索功能都会很棒;它不必与任何特定的搜索引擎完全匹配

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

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

  • 通过将查询字符串拆分为空格,将其拆分为关键字数组
  • 使用
    $('p')隐藏所有段落。隐藏()
  • 对于每个关键字,用
    $('p:contains(“+keyword+”))显示包含该关键字的段落。show()
  • 这是一个非常有限的搜索功能,区分大小写,将所有关键字视为可选,不提供诸如
    或括号之类的运算符。它的效率也很低,因为对于每个关键字,它只对每个字符串进行一次检查,即使它已经被匹配。

    最好的(简单而好的)方法是使用向量搜索算法

    首先,获取每个段落中的所有单词,并将它们保存在一个向量对象中(后面将解释如何构建),然后比较每个段落向量和查询向量的关系

    然后在每个单词上使用,使其聚集像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;
    
    var向量=函数(phar){
    var self=这个;
    self.InitVector=函数(){
    var wordArray=self.spltwords(phar);
    self.VectorSize=wordArray.length;
    var stemdWordArray=self.runPotterStemmer(wordArray);
    self.VectoData=self.GroupAndCountWords(stemdWordArray);
    }
    self.VectoData={};
    self.runPotterStemmer=函数(arr){
    //运行波特,如链接中所示
    }
    self.spltwords=函数(arr){
    //分班
    }
    self.GroupAndCountWords=函数(arr){
    
    对于(var i=0;i,这里是我正在为项目评估的一些库(2013年7月)。其中任何库都应该能够提供搜索功能的核心

      • 内置的堵塞、评分
      • 13.8KB缩小
      • 最近更新()
      • 10名撰稿人
      • 没有外部依赖关系
    • (原名为)
      • 模糊搜索
      • 1.58 kb缩小
      • 最近更新()
      • 1贡献者
      • 没有外部依赖关系
      • 使用html5存储,并进行适当的降级
      • 459KB缩小
      • 2013年最后更新()
      • 2贡献者
      • 没有外部依赖关系
      • 分页,内置模板
      • 5.70KB缩小
      • 2014年最后更新()
      • 1贡献者
      • 取决于jquery和下划线
    如果您想构建自己的,以下是两种常用词干提取算法的实现:


    至于处理布尔逻辑搜索运算符,可能会很有用。

    免责声明-我是作者

    你也可以试试ItemsJS。这是一个JavaScript搜索引擎,支持全文、刻面和排序

    下面是一个交互式示例-ItemsJS+VueJS:

    var配置={
    可搜索字段:['title','tags','actors'],
    分类:{
    姓名(asc):{
    字段:“名称”,
    订单:“asc”
    }
    },
    聚合:{
    标签:{
    标题:“标签”,
    尺码:10
    },
    参与者:{
    标题:"演员",,
    尺码:10
    },
    类型:{
    标题:“流派”,
    尺码:10
    }
    }
    }
    //这些行来自外部资源
    // https://github.com/itemsapi/itemsapi-example-data/blob/master/jsfiddle/imdb.js
    itemsjs=itemsjs(行、配置);
    var vm=新的Vue({
    el:“#el”,
    数据:函数(){
    //让它更通用
    变量过滤器={};
    对象.键(配置.聚合).映射(函数(v){
    过滤器[v]=[];
    })
    返回{
    查询:“”,
    //使用空数组初始化筛选器
    过滤器:过滤器,
    }
    },
    方法:{
    重置:功能(){
    变量过滤器={};
    对象.键(配置.聚合).映射(函数(v){
    过滤器[v]=[];
    })
    this.filters=过滤器;
    this.query='';
    }
    },
    计算:{
    搜索结果:函数(){
    var result=itemsjs.search({
    query:this.query,
    过滤器:这个。过滤器
    })
    返回结果
    }
    }
    });
    
    项目列表({{searchResult.pagination.total})
    

    在{{searchResult.timings.Search}ms中执行搜索,在{searchResult.timings.facets}ms中执行facets

    {{facet.title}
    • {{bucket.key}}({{bucket.doc_count}})
    {{item.name}
    {{item.description}} {{tag}}
    我在搜索和NLP领域参与了一些开源javascript项目。这似乎接近wha