【问题标题】:Search for case insensitive data from Parse using javascript使用 javascript 从 Parse 中搜索不区分大小写的数据
【发布时间】:2013-09-12 11:22:50
【问题描述】:

我正在使用Parse.com 并使用Javascript 访问它。我想以一种不会搜索区分大小写的方式搜索数据,例如如果我搜索abc,那么它将给出abc, Abc, ABC,aBc etc all。但目前它只提供abc

JavaScript:

var search_data="Temp";
var product = Parse.Object.extend("product");
var query = new Parse.Query(product);

query.contains("name",search_data); 
query.find({
     success: function(results) {
        console.log("Total Product Found : "+results.length);
        printSearchProducts(results,query);  //custom method to print product detail
     },
     error: function(error) {
         console.log("Error: " + error.code + " " + error.message);
     }
 });

实际结果: Temp1,Temp2,Temp3,ProductTemp3,Temp4Product etc

所需结果: Temp1,Temp2,Temp3,ProductTemp3,Temp4Product,temp5,producttemp6,TEMP7,tEMp8 etc

【问题讨论】:

    标签: javascript parse-platform


    【解决方案1】:

    为此,您可以使用Parse.Query's matches() 函数,即使它的文档页面中没有说明,但您可以像这样使用它:

    query.matches(key, value, 'i');
    

    希望能有所帮助。

    【讨论】:

    • 完美运行!谢谢!
    • 这是正确的答案,但它在 JSON、REST 中如何工作
    • 如何查询多个字段?如果我一个接一个地添加matches,即使查询为空,我也不会得到任何结果。
    • @Chrillewoodz 我认为你可以使用compound queries ...
    【解决方案2】:

    此时,您无法通过查询执行不区分大小写的搜索。

    然而,一个非常简单的解决方法是存储您需要执行此查询的字段的小写版本。

    创建项目

    var Product = Parse.Object.extend("product");
    var newProduct = new Product();
    var productName = "Temp4Product";
    newProduct.set("name",productName);
    newProduct.set("name_lowercase",productName.toLowerCase());
    newProduct.save(); 
    

    执行查询

    var search_data="Temp";
    var product = Parse.Object.extend("product");
    var query = new Parse.Query(product);
    
    query.contains("name_lowercase",search_data.toLowerCase()); 
    query.find({
         success: function(results) {
            console.log("Total Product Found : "+results.length);
            printSearchProducts(results,query);  //custom method to print product detail
         },
         error: function(error) {
             console.log("Error: " + error.code + " " + error.message);
         }
     });
    

    请注意,在上面的示例中,我使用了 string.toLowerCase() 函数,但是可能有更合适的函数供您使用。基本上,您想找到一种“简化”数据的方法,以便您可以执行适当的查询。

    【讨论】:

    • 感谢 @ahar083 的回复,但我不想在 parse.com 上的产品类中更改大小写。
    • @Shashi 我不建议您更改仅存储小写值。请注意,在上面的示例中,我保存了“name”(保留大小写)以及“name_lowercase”。此解决方案的唯一缺点是您在表中存储的数据略多,这应该不是什么大问题。此时没有其他选择,因为 Parse 目前不支持不区分大小写的查询。他们可能会在未来添加它,但它会对后端性能产生影响。
    • @Shashi - 我仍然没有足够的代表来回复您在下面提出的答案。虽然您的答案确实有效,但效率非常低!您正在从 Parse.com 将 500 个项目下拉到您的服务器(或客户端的机器,如果这是在客户端浏览器中运行的 javascript)。您可能会拉下 1MB 的数据,而不是 2KB,因此用户可能会等待 1 分钟的响应,而不是 1 秒。 (这些数字是任意的,但只是为了给你一个想法)。
    • 我只有 400 个产品,根据要求,我们不能在产品类中添加一个额外的列,它以小写形式存储名称,这就是为什么下面的方法最适合我我知道它不是最佳解决方案,因为每次它都会获取所有产品数据,这可能会降低性能。
    • @Shashi - 很公平,只要您意识到延迟增加和下载量增加,总会有取舍。如果是桌面应用,这可能完全没问题。
    【解决方案3】:

    建议使用小写值的额外存储字段的解决方案具有需要额外存储空间的缺点。 matches 方法有效,但性能开销较小。

    避免这两个问题的更好解决方法是在投影中使用带有 $toLower 表达式的聚合。

    【讨论】:

    • 嗨!我不明白你的解决方案,你能添加代码吗?或者指出“在投影中使用带有 $toLower 表达式的聚合”是什么意思?
    【解决方案4】:

    我已经解决了这个问题。 我删除约束 query.contains("name",search_data); 并在 printSearchProducts 方法中使用 java 脚本应用手动搜索,例如:

    var search_data="Temp";
    var product = Parse.Object.extend("product");
    var query = new Parse.Query(product);
    query.limit(500);
    query.find({
        success: function(results) {
             printSearchProducts(results,query,search_data); 
        }, 
        error: function(error) {
             console.log("Error: " + error.code + " " + error.message);
       } 
    });
    

    printSearchProducts 方法 where 通过 Java Script 手动搜索。

    function printSearchProducts(results,query,search_data) {
        var counter = results.length; 
        var productName = '',i=0; 
        search_data = search_data.toLowerCase(); 
        if(counter){
            while(i<counter){
                var found = -1;
                productName = results[i].get("name");
                var lower_name = productName.replace(/[^a-zA-Z]/g,'_').toLowerCase();
                found = lower_name.indexOf(search_data);
                if(found>=0) {
                      //Access or print the required result here 
                } 
                i++;
            }
        }  
    }
    

    【讨论】:

    • 我强烈建议不要使用这种方法,每次搜索时你总是会拉下所有产品,如果你最终得到超过 500 种产品(如果是 1000您将限制增加到最大值)。如果您需要页面其他部分的所有产品,这可能是可以接受的,但并不理想。
    • @TimothyWalters:我只有 400 个产品,根据要求,我们不能在产品类中添加一个额外的列,该列以小写形式存储名称,这就是我知道上述方法最适合我的原因这不是最佳解决方案,因为每次它都会获取所有产品数据,这可能会降低性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-05-09
    相关资源
    最近更新 更多