针对Java文档的搜索引擎

4 篇文章 0 订阅
订阅专栏

项目介绍

       本项目是一个基于SpringBoot的针对Java文档的站内搜索引擎,当用户在页面上输入查询词后,就会快速的查询出相关的文档然后跳转至在线页面,弥补了Java在线文档中没有搜索查询的缺陷

因为当前这个项目只是针对 Java 官方文档设计的一个搜索引擎,总共也就一万多条记录,所以我们可以提前将 Java官方文档下载到本地, 然后对其进行预处理。
此处的预处理就是构建正排索引,倒排索引

  1. 正排索引 : 给一个 id,可以查出对应文档的基本信息,包括文档标题,文档正文,文档 URL
  2. 倒排索引 : 给一个查询词,查那些文档和这个词有关联,文档肯定很多,所以返会一个List

项目模块划分及分析

1.索引模块

  • 整个索引模块主要涉及2个类 . Parser类主要负责解析文件 , Index类主要负责把在内存中构造好的索引数据结构,保存到指定的文件中

Parser 类核心业务

在这里插入图片描述

  1. 根据指定的路径,使用 enumFile() 枚举 出该路径中所有的 html 文件,这个过程需要把所有子目录中的文件都能获取到
  private  void enumFile(String inputPath, ArrayList<File> fileList) {
        File rootPath = new File(inputPath);

        //使用 listFiles 只能看到一级目录,看不到子目录里的内容
        //要想看到子目录里的内容,还要进行递归
        File[] files = rootPath.listFiles();//listFiles 能够获取到 rootPath 当前目录下所包含的文件/目录
        for(File f : files){
            //根据当前 f 的类型,是否要来递归
            //如果 f 是一个普通文件,就把 f 加入到 listFiles 结果中
            //如果 f 是一个目录,就递归的调用 enumFile 这个方法,进一步获取子目录中的内容
            if(f.isDirectory()){
                enumFile(f.getAbsolutePath(),fileList);
            }else{
                if(f.getAbsolutePath().endsWith(".html")){
                    //有些是图片,文字等等,js文件
                    //找到以 .html结尾的文件,然后在添加
                    fileList.add(f);
                }
            }
            }
        }
  1. 针对上面罗列出的文件的路径,打开文件,读取文件内容并进行解析parseHTML(),并构建索引
  2. 把解析的结果调用index里面的addDoc 方法,构建倒排和正排索引
  private  void parseHTML(File f) {
        //1.解析标题
        String title = parseTitle(f);
        //2.解析对应的URL
        String url = parseUrl(f);
        //3.解析对应的正文(描述)
        //String content = parseContent(f);
        String content = parseContentByRegex(f);
        //4.把解析出来的信息,加入到索引当中
        index.addDoc(title,url,content);
    }
  1. 保存索引

在这里插入图片描述

  1. 解析URL
    在这里插入图片描述

Index 核心业务

在这里插入图片描述

  1. 构建正排索引 ,给定一个id,查对应文档的详细信息返回DocInfo类的对象
    在这里插入图片描述
public class DocInfo {

    private int docId;
    private String title;
    private  String url;
    private  String content;
}

在这里插入图片描述

  1. 构建倒排索引,给定一个词,查那些文档和这个词有关联,文档肯定很多,所以返会一个List
    在这里插入图片描述
 private void buildInverted(DocInfo docInfo) {

        class WordCnt{//内部类
            public int titleCount;//表示这个词在标题中出现的次数
            public int contentCount;//表示这个词在正文中出现的次数
        }
        HashMap<String,WordCnt> wordCntHashMap = new HashMap<>();//这个数据结构用来统计词频

        //1.针对文档标题进行分词
       List<Term>  terms = ToAnalysis.parse(docInfo.getTitle()).getTerms();
        //2.遍历分词结果,统计每个词出现的次数
        for(Term term:terms){
            //先判定 term 是否存在
            String word = term.getName();
            WordCnt wordCnt = wordCntHashMap.get(word);
            if(wordCnt == null){
                //如果不存在,就创建一个新的键值对,插入进去,
                WordCnt newWordCnt = new WordCnt();
                newWordCnt.titleCount = 1;//标题中出现的次数+1
                newWordCnt.contentCount = 0;
                wordCntHashMap.put(word,newWordCnt);
            }else{
                //如果存在,就找到之前的值,然后把对应的 titleCount +1
                wordCnt.titleCount += 1;
            }
        }
        //3.针对正文进行分词
        terms = ToAnalysis.parse(docInfo.getContent()).getTerms();
        //4.遍历分词结果,统计每个词出现的次数
        for(Term term:terms){
            //先判定 term 是否存在
            String word = term.getName();
            WordCnt wordCnt = wordCntHashMap.get(word);
            if(wordCnt == null){
                //如果不存在,就创建一个新的键值对,插入进去,
                WordCnt newWordCnt = new WordCnt();
                newWordCnt.titleCount = 0;
                newWordCnt.contentCount = 1;//文章中出现的次数+1
                wordCntHashMap.put(word,newWordCnt);
            }else{
                //如果存在,就找到之前的值,然后把对应的 titleCount +1
                wordCnt.contentCount += 1;
            }
        }
        //5.把上面的结果汇总到一个HashMap中,最终文档的权重,就设定成 标题中出现的次数*10+正文中出现的次数
        //6.遍历这个HashMap,依次更新倒排索引中的结构
        for (Map.Entry<String ,WordCnt> entry: wordCntHashMap.entrySet()) {
            //Map不好遍历,先把Map转成Set然后才可以进行遍历
            synchronized (locker2){
                List<Weight>  invertedList = invertedIndex.get(entry.getKey());//一个值
                if(invertedList == null){
                    //如果为空,插入新的键值对
                    ArrayList<Weight> newInvertedList = new ArrayList<>();
                    //把新的文档(当前DocInfo)构造成 search.Weight 对象,插入进来
                    Weight  weight = new Weight();
                    weight.setDocId(docInfo.getDocId());
                    weight.setWeight(entry.getValue().titleCount * 10 + entry.getValue().contentCount);
                    newInvertedList.add(weight);
                    invertedIndex.put(entry.getKey(),newInvertedList);
                }else {
                    //如果非空,就把当前文档,构造成一个 search.Weight 对象,
                    Weight  weight = new Weight();
                    weight.setDocId(docInfo.getDocId());
                    weight.setWeight(entry.getValue().titleCount * 10 + entry.getValue().contentCount);
                    invertedList.add(weight);
                }
            }
        }
    }

  • 添加文档,parser类在构建索引的时候调用该方法
    在这里插入图片描述

  • 查正排

  • 因为我们在存放正排索引时 , 已经将文章按照顺序保存在 ArrayList 中 , 所以可以直接根据get(i)方法获取到文章信息

public  DocInfo getDocInfo(int docId){
        return forwardIndex.get(docId);
    }
  • 查倒排
  • 直接通过 key 获取 value , 返回 Weight 类 数组 , 每个 Weight 存放该词所在的文章及在这篇文章中的权重(或者说与这篇文章的关联性)

  • 我们认为一个词 在标题中出现比在文章中出现重要的多,最终文档的权重,就设定成

  • weight = 标题中出现的次数 *20 + 正文中出现的次数

 public List<Weight> getInverted(String term){
        return invertedIndex.get(term);
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多线程制作索引

  • 创建固定数量的线程池
  • 使用submit 提交任务到线程池中

提交任务,是否存在submit已经提交完任务了,但是线程池还没有把文档解析完
必须要等待所有的线程把所有的文档任务都处理完,才能保存索引

  • 使用CountDownLatch方法,引入计数器

在这里插入图片描述

构建索引的核心是解析HTML文件

  • 构建正排可能会有几个线程同时向1个位置添加,因此会出现线程安全问题
    构建倒排更新倒排索引的时候,也有可能会有线程安全问题
  • 如果直接把Synchronized 加到parseHTML,那只能顺序的执行解析标题,解析正文,添加索引,速度又慢了,并且解析标题,和解析正文,并不会有线程安全问题,
    或者直接锁到 addDoc()这样的方法上,锁的粒度太粗了,并发程度不高
    都针对index 实例加锁,构建正排的时候,就不能构建倒排
  • 构建正排和构建倒排,操作不同的对象,不应该产生锁竞争,因此加上不同的锁

2.搜索模块

调用索引模块,来完成搜索的核心过程

  1. 分词:针对用户输入的查询词进行分词,(因为用户输入的查询词,可能不是一个词,可能是一句话)
  2. 触发:拿着每个分词结果, 去倒排索引中查,找到具有相关性的文档(调用Index类里面的查倒排的方法)
 List<Weight> allTermResult = new ArrayList<>();
        for(Term term : terms){
            String word = term.getName();//获取每个词的内容
            List<Weight> invertedList = index.getInverted(word);
            if(invertedList == null){
                continue;
            }
            allTermResult.addAll(invertedList);
        }
  1. 排序,针对上面触发的结果,按照相关性,降序排序
    在这里插入图片描述

  2. 包装结果,根据排序后的结果,依次去查正排,获取到每个文档的详细信息,保装成一定结构的数据返回去

 List<Result> results = new ArrayList<>();
        for (Weight weight : allTermResult){
            DocInfo docInfo = index.getDocInfo(weight.getDocId());
            Result result = new Result();

            result.setTitle(docInfo.getTitle());
            result.setUrl(docInfo.getUrl());
            result.setDesc(GenDesc(docInfo.getContent(),terms));

            results.add(result);
        }
        return results;

分词

  • 用户在搜索引擎中输入的可能是一个词,也可能是一句话,并不会按照你的理想情况进行输入,因此要进行分词
  • 针对标题进行分词,针对文档进行分词
  • 遍历分词结果,统计每个词出现的次数

        //1.针对文档标题进行分词
       List<Term>  terms = ToAnalysis.parse(docInfo.getTitle()).getTerms();
        //2.遍历分词结果,统计每个词出现的次数
        for(Term term:terms){
            //先判定 term 是否存在
            String word = term.getName();
            WordCnt wordCnt = wordCntHashMap.get(word);
            if(wordCnt == null){
                //如果不存在,就创建一个新的键值对,插入进去,
                WordCnt newWordCnt = new WordCnt();
                newWordCnt.titleCount = 1;//标题中出现的次数+1
                newWordCnt.contentCount = 0;
                wordCntHashMap.put(word,newWordCnt);
            }else{
                //如果存在,就找到之前的值,然后把对应的 titleCount +1
                wordCnt.titleCount += 1;
            }
        }

生成描述

  • 前端页面展示的有标题,描述,URL
    描述就是正文的一段摘要,摘要来自于正文,可以获取到所有查询词的分词结果,遍历分词结果,看哪个结果在正文中出现
  • 针对当前这个文档 来说,不一定会包含所有的分词结果
    就针对这个被包含的分词结果,去正文中查找,找到对应的位置,以这个词的位置为中心,往前截取40个字符,作为描述的开始,再从描述开始,往后截取190个字符,作为整个描述
  • 这个数字不是唯一的,可以根据情况来定
 private String GenDesc(String content, List<Term> terms) {
        //先遍历分词结果,看看那个结果是在 content 中存在
        int firstPos = -1;
        for(Term term : terms){
            String word = term.getName();
            firstPos = content.toLowerCase().indexOf(" "+ word+" ");//正文转成小写
            if(firstPos >= 0){
                break;
            }
        }
        if(firstPos == -1){
            //所有的分词结果都不在正文中存在
            if(content.length() > 160){
                return content.substring(0,160) + "...";
            }
            return content;
        }
        String desc ="";
        int descBegin = firstPos < 60 ? 0:firstPos-60;//找描述的起始位置,firstPos 小于 60直接返回0,否则向前找60个字符
        if(descBegin + 160 > content.length()){
            //  descBegin + 160 大于正文的长度了,直接就是从它开始一直截到末尾
            desc = content.substring(descBegin);
        }else{
            //否则的话,就往后再找160个字符
            desc = content.substring(descBegin,descBegin + 160) + "...";
        }

停用词

  • 当我们的查询词为array空格list的时候,分词结果为:array,空格,list
    因此会出现,不含array,list 但是包含空格的搜索结果,这样的就叫停用词,就是很高频,但是又没有什么意义,比如,a,is,hava,
  • 把暂停词加载到内存的HashSet里面
    针对查询词分词以后,使用暂停词表处理分词后的查询词,遍历分词结果,在暂停词里面查找
  • 如果该词在暂停词表里面存在,则该词无意义删掉,
    如果不存在,就把它加入新的分词结果List里面
    在这里插入图片描述

3.Web模块

  • 即就是前端页面,编写一个简单的页面,展示搜索结果,点击搜索结果标题能跳转到对应的 Java API 文档页面

展示

在这里插入图片描述

9个基于Java搜索引擎框架
dhytk6647的博客
03-07 905
转自:http://blog.csdn.net/xiaomin1991222/article/details/50980573 1、Java 全文搜索引擎框架Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene为开发人员提供了相当完整的工具包,可以非常方便地实现...
mango:一个基于lucene的搜索引擎
05-02
是一个较为完善的搜索引擎.使用heritrix爬虫爬去网页信息,这里针对人民网进行了相关的爬去策略定制,其他网站的爬去,可自行根据相关网站的具体情况进行定制爬去策略.在搜索索引的建立是使用Lucene进行的.前端使用...
基于Java的新闻全文搜索引擎的设计与实现
阿坨的博客
08-06 2264
本文以学术研究为目的,针对新闻行业迫切需求和全文搜索引擎技术的优越性,设计并实现了一个针对新闻领域的全文搜索引擎。该搜索引擎通过Scrapy网络爬虫工具获取新闻页面,将新闻内容存储在分布式存储系统HBase中,并利用倒排索引及轮排索引等索引技术对新闻内容进行索引,实现了常用的新闻搜索功能,如短语查询、布尔查询、通配符查询等。同时为了获得更快的检索速度,该系统使用了B+树来构建索引树;为了提升用户浏览体验,引入了事件图谱可视化技术,帮助用户直观易懂地浏览相关新闻事件;
项目篇——java文档搜索引擎
qq_54219272的博客
09-23 737
是计算机中进行字符串处理/匹配的常见手法。核心就是通过一些特殊的符号来描述字符串的特征,然后看某个字符串是否符合这些特征。代码经过测试检验,出现了 JavaScript 的代码,这不是我们想要的结果,在处理文档的时候,只是对正文进行了“去标签”但是HTML里面是会有 script 标签,就导致去了标签后,JS的代码也被整理进了索引里面,为了取消 JavaScript 代码,我们需要使用这则表达式来解决问题。正则表达式有很多符号,具体可以看看这个链接 🏷。
基于Java实现本地数据搜索引擎(附带简易交互界面)
weixin_52828997的博客
07-10 1352
深圳大学信息检索课程作业。
Java轻量级全文检索引擎Lucene使用及优化
BXA
05-29 4044
Lucene是一个开源的全文检索引擎工具包由Doug Cutting编写。它被设计用于实现全文搜索功能,即读入一堆文本文件并将其转换为易于搜索的数据结构。Lucene提供了一组简单而强大的API,使得索引和搜索过程变得非常方便。
ElasticSearch全文搜索引擎入门到入土
weixin_48133130的博客
10-21 226
ElasticSearch全文搜索引擎,- 全文搜索Lucene入门 - ElasticSearch概述和安装 - ElasticSearch的基本使用 - ElasticSearch在Java中使用
人工智能-项目实践-搜索引擎-针对于JDK1.8的文档做的搜索引擎
最新发布
02-26
针对于JDK1.8的文档做的搜索引擎
使用Java实现一个基于内存的英文全文检索搜索引擎【100012394】
05-24
针对搜索引擎的倒排索引结构,已经定义好了创建索引和全文检索所需要的抽象类和接口。学生必须继承这些预定义的抽象类和和实现预定义接口来完成实验的功能,不能修改抽象类和接口里规定好的数据成员、抽象方法;也不...
企业搜索引擎SearchdaimonES.zip
07-18
Searchdaimon ES是一个针对公司数据和网站的搜索引擎,拥有一个功能强大的管理员界面。ES可以索引一些常用的企业系统中的数据,比如SharePoint、Exchange、SQL数据库、Windows文件共享等,它还支持多种数据源,比如...
java文件搜索器(完整)
12-29
使用java实现的一个文件搜索器,该搜素器能够自动读出电脑上面已有的盘,使用者可以通过选择指定盘,输入需要搜索的关键字进行搜索,也可以通过文件选择器进行选择,在指定的文件夹中进行搜索,且该过程可中断。
java实现的文件搜索器
12-10
java的FilenameFilter实现的文件过滤
基于JAVA的文本搜索引擎的设计与实现
06-25
本文主要是承接上一个项目文本预处理(资源中已经给出)的数据来作为支撑进行设计与实现的文本搜索引擎,采用的是Lucene工具包来进行实现的,同时还进行了余弦相似度的检测以及K-Means聚类分析,本报告是比较详细的给出了设计与实现步骤以及源代码。 如果需要具体的项目文件以及数据的请加QQ:404125822,
基于Java的全文检索引擎简介
09-24
Lucene是一个基于Java的全文索引工具包。 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么
JAVA上百实例源码以及开源项目
01-03
 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java 写了一个搜索引擎系统,这个太强了。。。
Java技术栈,分享最主流的Java技术
05-10 743
来源:https://blog.csdn.net/m0_57315623 前言 咱们如果用我们的小服务器去搞百度,搜狗那种引擎肯定是不行的,内属于全站搜索,我们这里做一个站内搜索。这个还是可以的,就类似于我们对网站里的资源进行搜索。 一.搜索引擎怎么搜索 搜索引擎就像一个小蜜蜂每天不停的采摘蜂蜜,就是去爬虫各个网页,然后通过爬取之后建立索引,以供于我们去搜索。 这里我们可以使用Python,或者下载文档压缩包。这里我们下包把,快多了。本来想搞一个英雄联盟的,实在找不见,要是后续有老铁找到可以分享一下。 建议
JavaSearch搜索引擎
Lucky_mzc的博客
08-16 3081
该项目只针对 JDK API 文档库中的 html 做搜索。文档下载主要实现以下两个模块:构建索引模块(不需要使用web功能)搜索模块(依赖构建索引完成之后才能进行,需要web功能)
基于JAVAAPI的站内搜索引擎
weixin_61518137的博客
08-29 2413
搜索引擎
基于Java搜索引擎系统设计与实现
m0_62396648的博客
12-02 1105
基于Java搜索引擎系统的设计与实现,通过合理的功能模块划分、技术选型和系统实现步骤,提高了搜索引擎的搜索性能和用户体验。然而,由于篇幅限制,本文仅展示了数据抓取模块、索引构建模块和搜索模块的代码示例,其他模块的代码未在本文中展示。因此,未来可以进一步完善和扩展系统功能,如排名模块和分布式部署模块的实现,提供更为全面和完善的搜索引擎解决方案。本文设计和实现了一个基于Java搜索引擎系统,通过对系统需求的分析和功能设计,利用Java语言和相关技术实现了系统的核心模块,提高了搜索引擎的搜索性能和用户体验。
java管家婆的主要参考文献
07-15
如果您正在寻找Java开发管家婆相关的参考文献,以下是一些推荐的资源: 1. 管家婆Java官方文档:官方文档提供了关于管家婆Java开发框架的详细信息、API参考、示例代码等。您可以在管家婆Java的官方网站上找到文档链接。 2. 《Java编程思想》(Thinking in Java):Bruce Eckel撰写的这本书是一本经典的Java编程指南,涵盖了Java语言的各个方面,包括面向对象编程、继承、多态、异常处理等。虽然不是专门针对管家婆Java的,但对Java语言的理解和应用有很大帮助。 3. 《Java核心技术卷I》(Core Java Volume I):Cay S. Horstmann和Gary Cornell合著的这本书是Java开发领域的经典教材之一。它详细介绍了Java语言的基础知识、核心库、并发编程等内容,对Java开发者来说是一本必备参考书。 4. 管家婆Java社区论坛:参与管家婆Java社区论坛可以与其他开发者交流经验、分享技术问题和解决方案。您可以在论坛上找到更多实际案例、教程和开发经验。 5. 网络资源:在互联网上还有许多博客、教程和视频教学提供关于管家婆Java开发的指导和示例。您可以通过搜索引擎查询相关的学习资源。 请注意,具体的参考文献可能会根据您的具体需求和管家婆Java的版本而有所不同。建议在开始项目之前,根据您的需求和管家婆Java文档资料进行深入研究和学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
44
原创
30
点赞
37
收藏
4
粉丝
关注
私信
写文章

热门文章

  • nested exception is org.apache.ibatis.exceptions.PersistenceException: \n### Error querying database 3482
  • MySQL如何修改字段类型和字段长度 2327
  • Parameter ‘id‘ not found. Available parameters are [id , param1] 2085
  • 数二用书推荐以及避雷 1627
  • Disconnected from the target VM, address: ‘127.0.0.1:54931‘, transport: ‘socket‘ 1075

分类专栏

  • 项目 4篇
  • JVM 1篇
  • Linux 1篇
  • 测试 3篇
  • 笔记 4篇
  • Java笔记 4篇
  • Spring 6篇
  • idea 1篇
  • 考研 2篇

最新评论

  • C语言控制语句

    大袖揽清风。: 你这笔记写的挺认真的 面试官都给我录取这个女子。

  • 针对Java文档的搜索引擎

    qq_57184348: 学到了新知识!

  • 针对博客项目进行web自动化测试

    qq_57184348: Up 方便分享测试源码吗

  • 为自己的 SSM项目设计评论功能

    qq_57184348: 我的代码,为啥一直不对啊,

  • 【Idea】创建包自动分层

    qq_57184348: 感谢作者,我的问题解决了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 使用正则表达式解析正文
  • Linux如何改变文件的权限
  • 为自己的 SSM项目设计评论功能
2023年31篇
2022年9篇
2021年4篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司广州网站seo优化哪家好南京关键词按天计费公司常州网站搜索优化公司中卫seo排名推荐沧州网站关键词优化价格仙桃百度竞价公司诸城关键词排名哪家好盐城关键词排名包年推广报价大理关键词按天计费公司商洛seo优化报价福州seo网站优化公司兰州优化价格汉中网站推广系统哪家好常德推广网站公司保定百度seo哪家好海口建网站报价哈尔滨企业网站建设价格阿坝网站优化按天收费公司崇左网站优化按天扣费哪家好盐田网站推广系统公司乐山网站优化按天收费推荐安顺网站推广系统推荐宝鸡网站推广系统多少钱大芬外贸网站建设价格贵港关键词排名推荐西乡seo优化价格鹤岗关键词排名包年推广哪家好白山网站推广系统报价洛阳网站建设多少钱衡水至尊标王哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化