在响亮的搜索索引中添加功能
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 的调用。 运行 使用浏览器调试器查看输出。
这是正在发生的事情:
- 第一次调用
permuteword
调用 permute(["african","lion"], [], "", 0, []);
permuteword
中的第一个 if
失败,因为 level
(0) != ss.length()
(2) 和 res
== "".
- 然后函数循环遍历
ss
,但从不执行任何操作,因为 level
= 0.
- 最终
permuteword
returns 一个空数组,因此没有索引。
我在 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 的调用。 运行 使用浏览器调试器查看输出。
这是正在发生的事情:
- 第一次调用
permuteword
调用permute(["african","lion"], [], "", 0, []);
permuteword
中的第一个if
失败,因为level
(0) !=ss.length()
(2) 和res
== "".- 然后函数循环遍历
ss
,但从不执行任何操作,因为level
= 0. - 最终
permuteword
returns 一个空数组,因此没有索引。