在响亮的搜索索引中添加函数

时间:2016-04-29 04:46:43

标签: search indexing couchdb cloudant

我在cloudant中有一个Json文档:

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

我想创建一个搜索索引,当我输入查询时,可以搜索此文档,并且#34; afrian lion"或者"狮子非洲",...

我创建了一个函数,可以返回" doc.name"中的所有排列情况。用于索引(此函数运行良好,并且在纯JS环境中也已检查过)。但是,它在cloudant中不起作用,当我输入查询时输出返回 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]);
  }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

<强>更新

您的更新看起来不错,但仍有一个问题:您没有从permuteword功能返回列表。我相信您还需要删除对console.log的来电。一旦我做了这两件事,我就可以使用以下搜索查询来使用Cloudant(我还用&#34;非洲狮子&#34;更改为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的调用。使用浏览器调试器运行以查看输出。

以下是发生的事情:

  1. 第一次拨打permuteword电话permute(["african","lion"], [], "", 0, []);
  2. if中的第一个permuteword失败,因为level(0)!= ss.length()(2)和res ==&#34;&# 34。
  3. 然后函数循环遍历ss,但从不做任何事情,因为level = 0。
  4. 最终permuteword返回一个空数组,因此没有任何内容被编入索引。