TB级社工库搭建

2013年07月16日 安全技术 热度1611 查看评论

习科论坛挖来的,虽然我也看不太懂,先留着吧

  1. 世界的本质,就是数据                                   --不知道谁说的

复制代码

我们由上面一句话来引入我们今天所要讨论的主题。


这几年最火的项目是什么?当然是各种海量据量的处理,存储。我们已经迎来了大数据时代
大数据的科学价值和社会价值体现在于可以将数据转化为经济价值的来源。当然不仅仅是这样。

  1. 2009年H1N1流感爆发的时候,谷歌通过45亿数据建模分析每天保存的30亿条搜索指令,率先于疾病控制中心,判断出流感的传播的源头

  2. 2012年Farecast恭喜2000亿条飞行数据记录,分析出每一条航线上每一架飞机内的每一个位置一年内最便宜的价位。

  3. ....

复制代码

当然,上述大数据的例子都设计到数据挖掘,这是我们以后可以讨论的
我相信,各位资深黑阔手上有不少裤子,像我们这种电脑硬盘才320G的渣渣,估计一个裤子就能装满- -。裤子大了,数据量大了,相信在查找的时候,那种卡个
一天半夜才搜索出结果的感觉,肯定是非常不爽。
不知道大家看没看过道哥写的一篇关于中国地下某黑客:中国黑客传说:游走在黑暗中的精灵
文中有一段是这样的:

对于V来说,想知道谁的密码,只需要在库中简单的查询一下,马上就得到了。有时候密码经过了哈希算法的处理,需要经过彩虹表的反查,或者V会拿到一个云计算中心去用分布式计算框架破解(对技术有疑惑或者有兴趣的读者可以参阅拙作《白帽子讲Web安全》)。所以V能够直接查到女孩的邮箱密码。


     V估计使用的就是某搜索引擎框架(或者其他方法),搜索分布式存储的裤子。如果有加密,则通过分布式计算框架进行破解(比如hadoop)      由于我自己手上的几个项目,有涉及到搭建分布式计算集群(hadoop),分布式缓存nosql数据库(redis),数据挖掘R语言,搜索引擎(lucene) 等等,所以对这方面稍微了解一点点、
所以今天我们的主题是,咱也装个b,搭建一个超快速TB级的社工库,简单的说,就是自己搭建一个搜索引擎,利用搜索引擎快速查找海量裤子中的数据(裤子当然得自己找),由于不涉及到数据挖掘,所以相对来说比较简单。
我们来看一下数据单位的换算关系:


  1.      最小的基本单位是Byte,按顺序给出所有单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB,

  2.   它们按照进率1024(2的十次方)来计算:

  3.   1Byte = 8 Bit

  4.   1 KB = 1,024 Bytes 

  5.   1 MB = 1,024 KB = 1,048,576 Bytes 

  6.   1 GB = 1,024 MB = 1,048,576 KB = 1,073,741,824 Bytes

  7.   1 TB = 1,024 GB = 1,048,576 MB = 1,073,741,824 KB = 1,099,511,627,776 Bytes

复制代码

那么我们要用到的搜索引擎框架是基于Lucene的Hibernate Search.
lucene查询效率分析:

  1. http://www.stanford.edu/class/archive/cs/cs276a/cs276a.1032/projects/reports/dsu800.pdf

复制代码

使用lucene的公司有apple,ibm,eclipse,wiki,twitter等等

我们先来看看twitter对搜索性能的要求:
  1. Our demands on the new system are immense: With over 1,000 TPS (Tweets/sec) and 12,000 QPS (queries/sec) = over 1 billion queries per day (!) we already put a very high load on our machines. As we want the new system to last for several years, the goal was to support at least an order of magnitude more load.

复制代码

所以大家不用质疑lucene搜索引擎的效率。由于Lucene是不完整的搜索引擎,它是一个java的工具包。所以需要我们去开发。下面我们来开始进入今天最重要的部分。搭建以及编码。


噢,忘了说,我们用的语言是java,搭配SSH框架,mysql数据库(不使用数据库,直接索引文件也是可以的).

首先导入所有jar包,包括lucene:


SSH配置文件,包含了数据库的账号密码连接信息:
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4.       xmlns:context="http://www.springframework.org/schema/context"

  5.       xsi:schemaLocation="http://www.springframework.org/schema/beans

  6.           http://www.springframework.org/schema/beans/spring-beans.xsd

  7.           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

  8.        

  9.         <!-- DAO -->

  10.        <context:annotation-config/>

  11.        <context:component-scan base-package="cn.edu">

  12.    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />

  13.  </context:component-scan>

  14.        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

  15.                destroy-method="close">

  16.                <property name="driverClassName" value="com.mysql.jdbc.Driver" />

  17.                <property name="url" value="jdbc:mysql://localhost:3306/h_search" />

  18.                <property name="username" value="root" />

  19.                <property name="password" value="123" />

  20.        </bean>

  21.        <bean id="sessionFactory"

  22.                class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

  23.                <property name="dataSource" ref="dataSource" />

  24.                <property name="annotatedClasses">

  25.                        <list>

  26.                                <value>cn.edu.fjnu.Victim</value>

  27.                        </list>

  28.                </property>

  29.                <property name="hibernateProperties">

  30.                        <value>

  31.                                hibernate.dialect=org.hibernate.dialect.MySQLDialect

  32.                                hibernate.show_sql=true

  33.                                hibernate.hbm2ddl.auto=update

  34.                                current_session_context_class=thread

  35.                                javax.persistence.validation.mode=none

  36.                                hibernate.format_sql=true

  37.                                hibernate.use_sql_comments=true

  38.                                hibernate.search.default.directory_provider=filesystem

  39.                                hibernate.search.default.indexBase=E:\\java\\lucene_index


  40.                     </value>

  41.                </property>

  42.        </bean>

  43. <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

  44.    <property name="sessionFactory" ref="sessionFactory" />

  45.    <property name="dataSource" ref="dataSource" />

  46.  </bean>

  47.        

  48.        

  49. </beans>


复制代码
接着创建一个被搜索类(在实体上标志@Indexed,表示被索引),我们假设为Victim,拥有id和name两个字段属性:
  1. @Indexed

  2. @Entity

  3. public class Victim {


  4.  public Integer getId() {

  5.                return id;

  6.        }


  7.        public void setId(Integer id) {

  8.                this.id = id;

  9.        }


  10.        public String getName() {

  11.                return name;

  12.        }


  13.        public void setName(String name) {

  14.                this.name = name;

  15.        }


  16.  @Id

  17.  @GeneratedValue

  18.  private Integer id;


  19.  @Field(index=Index.YES, store=Store.YES)

  20.  private String name;


  21.  public Victim() {}


  22.  // standard getters/setters follow here

  23. }

复制代码
好了,我们可以进行测试。默认情况下,在你进行数据库插入更新等操作,Lucene会自动监听并且更新索引:
  1. @Test

  2.        public void testAdd() {

  3.                SessionFactory sessionFactory = (SessionFactory) TestUtil.ctx

  4.                                .getBean("sessionFactory");

  5.                Session session = sessionFactory.openSession();

  6.                int i = 20;

  7.                Transaction trans = null;

  8.                trans = session.beginTransaction();

  9.                while (i < 40) {

  10. Victim victim= new Victim();

  11.                        author.setName("王尼玛" + i);

  12.                        i++;

  13.                        session.save(victim);

  14.                }

  15.                trans.commit();


  16.        }

复制代码
我们可以用luke这个工具来查看lucene生成的索引:


成功生成索引。
我们可以通过以下方法查询:
  1. @Test

  2.        public void testSearch() {

  3.                SessionFactory sessionFactory = (SessionFactory) TestUtil.ctx

  4.                                .getBean("sessionFactory");

  5.                Session session = sessionFactory.openSession();

  6.                FullTextSession fullTextSession = Search.getFullTextSession(session);

  7.                QueryBuilder qb = fullTextSession.getSearchFactory()

  8.            .buildQueryBuilder().forEntity( Victim.class ).get();

  9.        org.apache.lucene.search.Query query = qb

  10.          .keyword()

  11. //要搜素name字段

  12.          .onFields("name")

  13.          .matching("王尼玛")

  14.          .createQuery();


  15.        // wrap Lucene query in a org.hibernate.Query

  16.        org.hibernate.Query hibQuery =

  17.            fullTextSession.createFullTextQuery(query, Book.class);


  18.        // execute search,返回结果到result中

  19.        List result = hibQuery.list();

复制代码
当然我们只是在自己一台机子上,lucene支持分布式扩展,也就是说,你加入的机子越多,速度也越来越快。理论上无限量扩展。包括把裤子扔到分布式存储上。


« 上一篇 下一篇 » 影原创文章,转载请注明出处! 标签:

相关日志:

说两句吧:

必填

选填

选填

«    2023年8月    »
123456
78910111213
14151617181920
21222324252627
28293031
搜索
文章归档
最近发表
站点信息
  • 文章总数:782
  • 页面总数:2
  • 分类总数:14
  • 标签总数:522
  • 评论总数:359
  • 浏览总数:624719