CouchDB (Cloudant) - 在多个字段上进行"starts with"搜索获得唯一结果



我正在尝试使用相同的搜索键从"开头为"或搜索多个字段中获得唯一结果。
结果应该是原始文档中的唯一子节点。
等效的 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*

默认情况下,值将在非字母数字字符上标记化 - 您可能希望使用字段级分析器配置以获得适当的结果。

相关内容

  • 没有找到相关文章

最新更新