我正在尝试使用相同的搜索键从"开头为"或搜索多个字段中获得唯一结果。
结果应该是原始文档中的唯一子节点。
等效的 SQL 应该是这样的:SELECT DISTINCT Name, Email FROM users WHERE Name LIKE 'key%' OR Email LIKE 'key%'
我的视图功能:
Map: function(doc){
if (doc.userDetails.firstName)
emit([doc.userDetails.firstName.toLowerCase(), doc.userDetails], null);
if (doc.userDetails.lastName)
emit([doc.userDetails.lastName.toLowerCase(), doc.userDetails], null);
}
Reduce: function(key, values, rereduce) {
return null;
}
问题是,在键与每个用户文档的两个字段匹配的情况下,它会返回重复的结果。例如:
JSON文档:
{
"userDetails":{
"email": "johnny@domain.com",
"name": "John Smith"
},
"privateFields": { ... }
}
查询:myView?reduce=true&group=true&startkey=["joh"]&endkey=["johufff0", {}]&inclusive_end=true
上面返回重复项,一次用于匹配电子邮件字段,另一个用于名称字段。
有什么建议吗?
我建议为此使用搜索索引。你如何从名字和姓氏生成名字?假设它们是串联的,您的索引将如下所示:
function(doc) {
if(doc.userDetails.email) {
index("email", doc.userDetails.email);
}
var name = doc.userDetails.firstName + " " + doc.userDetails.lastName;
name = name.trim();
if(name) {
index("name", name);
}
}
那么查询将是 myIndex?q=email:joh* 或 name:joh*
默认情况下,值将在非字母数字字符上标记化 - 您可能希望使用字段级分析器配置以获得适当的结果。