美文网首页关于搜索,我们聊聊
关于搜索功能的一些感想

关于搜索功能的一些感想

作者: TCJ | 来源:发表于2015-06-28 13:25 被阅读195次

    搜索是任何项目中必不可少的一项功能。在大多数应用场景中,由于需要检索的条件并不多,我们可以方便地使用get请求结合一些搜索类的gem(比如ransack),轻松实现搜索功能,再配合will_paginate实现分页功能。

    但是,对于一些高级搜索页面,往往会出现特殊的需求,比如:

    1.搜索的条件数量非常多——此时继续用get请求来搜索,会导致url过长而报错(不同浏览器支持的url最大长度也不一样);
    2.需要在多张表之间join查询——不能的搜索条件需要join不同的表,如果一次性全部join,效率必然很低。根据不同搜索条件来针对性地join,可提升搜索效率;
    3.需要优化搜索代码来提升搜索速度——比如搜索省份城市,需要对获取的搜索数据进行处理分解;
    4.需要搜索的字段,需要在数据库中拼接几个字段后再比较——比如搜索一个电话号码,数据表中的电话号码分为区号、号码、分机三个字段存储,如果需要实现电话号码的模糊搜索,必然需要用到类似于mysql中的concat功能;
    5.分页问题——will_paginate默认只提供get方式的分页,需要自己手动改造;

    想要克服上述五个问题,就需要自己手动来写搜索,以下是针对上述五个问题的我个人的解决方案:

    1.改用post提交——post提交不会出现url过长的问题,比如原来的一个index页,系统默认的路由,如果用post,会自动识别成create动作,此时有两个方法解决,弃用index,自己建一个比如list的action,定义为post,避开系统的自动识别;如果继续想用ndex,如果快速搜索也需要用到get的index,则可以:

    def index
    list
    end
    然后
    def index
    xxxx
    render template: "/xxx/index"
    end

    2.手动写搜索代码,判断每个查询参数是否被赋值,比如只有当params[:province_ids]存在并有指时,才去join provinces表。搜索最终取决于三个变量 sql(拼接的sql语句)、joins(拼接的join语句)以及传过来的搜索参数。sql和joins是两个空数组,当某个搜索参数有值时,相应地想这两个数组push sql和join语句,最后通过下面的代码实现搜索功能:

    @objects = Example::Object.where([sql,@q]).joins(joins).paginate(per_page:20,page:params[:page])

    3.对于省份城市的搜索,由于省份城市可分为好几级,比如区域(华东、华北、华西、华南),省份(34个省级行政区),和每个省份下的二级城市。我们可以同时搜索区域、省份、城市。如果为了写代码方便,统一分解成二级城市来搜索,那where city_id in (city_ids_string)机会非常长,导致搜索效率很低。因此需要分解。我的解决方案是:无论搜索哪一级,都将其id拼接成:“区域id_省份id_城市id”的格式,如果只搜区域,则后面两位都是0。比如光搜区域的,归入@region数组中,搜到省份的,无视区域其区域,直接归入@province数组中,搜到二级城市的,无视其区域和省份,直接归入@city中。通过分解,最终可以得到这样的搜索代码:

    where (region_id in @region or province_id in @province or city_id in @city)

    4.这个问题相对好解决,直接使用使用数据库的拼接字符串功能:

    where concat(region_number, phone_number, ext_number) like '%xxx%'

    5.这个问题我的解决方案是用jquery来重写分页链接的点击事件,然后再页面中设定一个隐藏的表单,表单里有两个隐藏的input,一个存储上一次高级搜索所有的搜索参数(比如params[:q]),并且压缩成json。还有一个就是page参数。当点击分页链接时,用jquery去取出这个分页链接的page参数,然后赋值给表单中的page的input,最后以post形式再次提交表单(别忘了最后需要return false来阻止本身分页链接功能)

    至此,关于上述遇到的5个问题,我都给出了相应的解决方案,可能不是优秀的解决方案,但的确可以解决眼前的问题,欢迎大家一起讨论或给出更加优秀的解决方案。

    相关文章

      网友评论

        本文标题:关于搜索功能的一些感想

        本文链接:https://www.haomeiwen.com/subject/gvpeqttx.html