在响亮的搜索索引中添加功能

Adding functions in search index of loudant

我在 cloudant 中有一个 Json 文档:

{
  "_id": "3-f812228f45b5f4e4962505561953ew245",
  "_rev": "3-f812228f45b5f4e496250556195372b2",
  "wiki_page": "http://en.wikipedia.org/wiki/African_lion",
  "name": "african lion",
  "class": "mammal",
  "diet": "herbivore"
}

我想创建一个搜索索引,当我输入 "afrian lion" 或 "lion african" 查询时,可以搜索此文档,...

我做了一个函数,可以return所有"doc.name"排列的情况进行索引(这个函数运行良好,也已经在纯JS环境中检查过了)。但是,它在 cloudant 中不起作用,当我输入查询时输出 return null

这是我在搜索索引中制作的代码:

function(doc){
  var list = [];
  function permute(ss, used, res, level, list){
    if(level==ss.length&&res!==""){
        list.push(res);
        return;
    }
    for(var i=0; i<ss.length; i++){
    console.log("loops");
        if (used[i]===true){
          continue;
        }

        if(level>=0){
          if (res!="" && list.indexOf(res)<0){
              list.push(res.trim());
          }

          used[i]=true;
          permute(ss, used, res+" "+ss[i], level+1, list)
          used[i]=false;
        }
      }
  }
  function permuteword(s){
      var ss=s.split(" ");
      var used = [];
    var res = "";
    list = [];
    permute(ss, used, res, 0, list);
    console.log(list);
  }

  var contentIndex=[];
  contentIndex=permuteword("african lion");
  for(var i=0; i<contentIndex.length; i++){
    index("default", contentIndex[i]);
  }
}

我该如何解决这个问题?

更新

您的更新看起来不错,但仍有一个问题:您没有从 permuteword 函数返回列表。我相信您还需要删除对 console.log 的调用。完成这两件事后,我就能够使用以下搜索查询让它与 Cloudant 一起工作(我还将使用 "african lion" 的硬编码调用改回 doc.name):

default:"african"
default:"african lion"
default:"lion"
default:"lion african"

这是最终脚本:

function(doc){
  var list = [];
  function permute(ss, used, res, level, list){
    if(level==ss.length&&res!==""){
        list.push(res);
        return;
    }
    for(var i=0; i<ss.length; i++){
        if (used[i]===true){
          continue;
        }

        if(level>=0){
          if (res!="" && list.indexOf(res)<0){
              list.push(res.trim());
          }

          used[i]=true;
          permute(ss, used, res+" "+ss[i], level+1, list)
          used[i]=false;
        }
      }
  }
  function permuteword(s){
    var ss=s.split(" ");
    var used = [];
    var res = "";
    list = [];
    permute(ss, used, res, 0, list);
    return list;
  }

  if (doc.name) {
    var contentIndex=permuteword(doc.name);
    for(var i=0; i<contentIndex.length; i++){
      index("default", contentIndex[i]);
    }
  }
}

已更新 JSFiddle:

https://jsfiddle.net/14e7L3gw/1/

原答案

我认为您的 Javascript 存在问题。 permuteword 函数没有返回任何结果。请参阅此 JSFiddle:

https://jsfiddle.net/14e7L3gw/

注意:我添加了一些日志记录并注释掉了对 index.html 的调用。 运行 使用浏览器调试器查看输出。

这是正在发生的事情:

  1. 第一次调用 permuteword 调用 permute(["african","lion"], [], "", 0, []);
  2. permuteword 中的第一个 if 失败,因为 level (0) != ss.length() (2) 和 res == "".
  3. 然后函数循环遍历 ss,但从不执行任何操作,因为 level = 0.
  4. 最终 permuteword returns 一个空数组,因此没有索引。