Talk is Cheap, Show me the Code! <<网站首页文章列表

  • 搜索引擎入门——ElasticSearch的基本查询

    快速预览不管处于什么年龄阶段,我个人在学习新事物的时候总会有一个迫切的诉求,那就是希望新事物能以旧方式呈现。所以,我也希望在搭建好ElasticSearch之后,它能像其它数据存储引擎一样,让我快速的进行数据的预览、查询、新增。不知道是不是我的思想过于陈旧了,总觉得熟悉的面貌能让我快速进入角色,开始学习。好在我也找到了一款Chrome插件,让我们对ElasticSearch数据进行预览等操作。![图片](https://oomabc.com/staticsrc/img/201910/28/15722296647314c5ee3921d514ec5adb1f11d0477d175.jpg) Dejavu The Missing Data Browser and Web UI for Elasticsearch.它是一款ElasticSearch专用的浏览器插件,支持ES的查询、数据导入、语句分析等功能:+ 导入数据的方式支持在线JSON,JSON文件、CSV文件+ 在线进行数据查询、过滤、数据统计+ 进行数据的CRUD操作![blockimg](https://oomabc.com/staticsrc/img/201910/28/157222969364193b245fadd104a179943e05659981aab.jpg)上图就是插件打开之后的主页面,需要输入ES的地址,以及我们需要预览的index的名称,这里是position,截图中的数据都是在我通过json文件导入之后的。当然,我们可以使用官方推荐的Kibana。 Import Data![blockimg](https://oomabc.com/staticsrc/img/201910/28/15722299661141f3137807f8b4d109c22755bfc80af6d.jpg)点击Upload File按钮边上的问号,可以看下格式说明。简单来说,Json格式就是一个Java对象的Json字符串。准备好文件直接上传就行了,不过建议文件大小不要过大,几十兆就行了,否则浏览器容易卡死。其它功能,我也没做过多的使用,这里就不展开介绍了,大伙自己个儿去试试看吧。 查询SearchElasticSearch提供的RESTful

    搜索引擎   ES   ElasticSearch   2019-10-29 浏览(147) 阅读原文>>
  • 搜索引擎入门——启动第一个ElasticSearch单机节点

    地转天旋,万事开头难。 斗霜傲雪二十年,堂堂剑气尚寒。 戎马倥偬一生,多少失败成功? 试看大千世界,依旧海阔天空。其实吧,启动一个单机的Elasticsearch(下文称ES)节点,非常简单。之所以会有这么一首诗,完全是为了装,贱笑,贱笑了! Elasticsearch简介ES是应用非常广泛的分布式搜索引擎和分析引擎。著名的ELK中的E就是ES,L指的是Logstah,它用于收集数据(日志),K指的是Kibana,它是一个可视化的操作和分析工具。ES可以为几乎所有类型的数据提供实时搜索和分析功能。无论是结构化数据、非结构化数据、数值型数据、甚至是空间地理数据,ES都能以支持快速搜索为前提,有效的对其进行存储和索引。通过它,我们不进行可以进行快速搜索,还能通过聚合、统计等功能来发现数据中隐藏的趋势。ES的分布式特性可以很轻松的进行集群扩展,以解决数据量和查询量快速增长带来的问题。ES解决的不仅仅是搜索的问题:+ 给我们的网址添加一个搜索框,当然这解决的是基础的搜索问题+ 储存和分析海量数据,比如访问日志、性能指标或其它案例数据+ 可以实时的通过机器学习为用户行为数据进行建模+ 作为业务上自动化工作流的存储引擎+ 作为空间地理信息管理系统(GIS),为空间数据进行管理、集成和分析+ 为其它场景的海量数据查询、分析提供基本能力使用ES的场景千变万化,但是其基本的索引和查询方式都是一样的。 数据输入作为一个分布式的文档存储引擎,ES不会按行(一行包含多列)来存储数据,取而代之的是更为复杂的且序列化过的JSON文本。如果你运行的是一个多节的ES集群,那么索引数据将会分布在各个节点,而且可以通过任意节点访问到所有数据。 为什么这里是JSON,应该是ES进行了封装,屏蔽了Lucene层面的D

    搜索引擎   ES   ElasticSearch   2019-10-28 浏览(138) 阅读原文>>
  • 搜索引擎入门——什么是中文分词以及它对于搜索引擎的意义

    什么是分词分词就是将连续的字序列,按照一定的规范重新拆分、组合成词序列的过程。通常字序列是无意义或者弱意义的,而词序列是具有完整意义表达的最小单元,它比字序列饱满但比短语简练。所以分词的直接目的就是将一段文本,提取出一系列最符合文本本意的词序列。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,但是词之间是没有形式上的分界符的,所以中文分词大多借助词库字典来进行分词。比如一句话:我是一个年过半甲的程序员,比较合理的分词结果就是我、是、一个、年过半甲、的、程序员。不过,分词的最终结果受应用场景、分词技术综合影响,具体的结果会稍有不同。比如,垂直领域的搜索引擎大多行业相关,所以其停用词(stopword)范围也不一样。上面例子中的我、是、的都被看做停用词,不会被索引,因为搜索这些关键字会被认为是无意义搜索。而对于年过半甲这个词,由于不是一个通用的词语,所以在基于词库的分词器中可能也不会被分出。 停用词(stopword)人类语言包含很多功能词。与其他词相比,功能词没有什么实际含义。最普遍的功能词比如限定词(“这”、“那”、“个”、“啊”等),这些词帮助在文本中描述名词和表达概念,如地点或数量。介词如:“下”,“上” 等表示两个词的相对位置。这些功能词的两个特征促使在搜索引擎的文本处理过程中对其特殊对待。第一,这些功能词极其普遍(词的文档频率很高)。记录这些词在每一个文档中的数量需要很大的磁盘空间。第二,由于它们的普遍性和功能,这些词很少单独表达文档相关程度的信息。如果在检索过程中考虑每一个词而不是短语,这些功能词基本没有什么帮助。在信息检

    搜索引擎   分词   中文分词   2019-08-13 浏览(282) 阅读原文>>
  • 搜索引擎入门——Solr查询参数详解以及如何使用Java完成对接

    零、前言经过文章[《搜索引擎入门——启动第一个Solr应用 》](https://oomabc.com/articledetail?atclidf9b37293ec184ab6ad4d672327057dd7)的介绍,我们已经成功搭建了一个搜索引擎服务。通过使用Solr提供的rest接口,我们已经能够完成索引重建、更新以及查询的功能。本章主要介绍以下几个方面的内容:+ 查询界面的基本使用:基本关键字查询、二次查询、排序、分页、默认查询字段、返回字段设置等等。+ 查询语句的调试:主要是进行关键字查询得分的调试,可以清楚的看到每一个结果所匹配的条件以及详细得分计算情况。+ 关键字高亮与摘要:搜索引擎常见的功能,对命中的关键字进行高亮展示。+ 高级自定义查询:主要是借助solr封装的一些函数进行字段的简单计算,最终干预文档得分。------ 一、基本查询![图片](https://oomabc.com/staticsrc/img/201907/24/15639473826215ea242bf30ce49149aad6480e98c91a3.jpg)上图是我们项目中使用的一个职位索引的查询页面,这是Solr启动之后我们所要重点关注的查询页面。 普通查询语句 q这个参数可以直接输入关键字,那么它查询的字段就是schema.xml中配置的默认查询字段keyword。关于schema.xml的相关配置可以参考另一篇文章[《搜索引擎入门——聊聊schema.xml配置》](https://oomabc.com/articledetail?atclidadb7b81f31ca4b45b1315b3af89a9c23)。那么,qjava的查询结果与qkeyword:java的查询结果是一样的。这个q里面可以设置任意多组查询条件,比如qpositiontitle:java cityname:上海 functionname:技术,就是搜索上海的技术职能下的java岗位。多组条件可以用AND符号连接,如果都是AND可以用空格代替,系统自动使用defaultOperator配置的连接符。当然我们也可以进行

    Java   搜索引擎   edismax   查询条件   solrj   2019-07-24 浏览(475) 阅读原文>>
  • 搜索引擎入门——聊聊schema.xml配置

    Java   搜索引擎   schema   分词器   2019-07-24 浏览(245) 阅读原文>>
  • 搜索引擎入门——启动第一个Solr应用

    零、关于Solr摘自维基百科: Solr(读作“solar”)是[Apache Lucene](https://zh.wikipedia.org/wiki/Lucene)项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr 4还增加了NoSQL支持。 Solr是用Java编写、运行在Servlet容器(如[Apache Tomcat](https://zh.wikipedia.org/wiki/ApacheTomcat)或Jetty)的一个独立的全文搜索服务器。 Solr采用了[Lucene](https://zh.wikipedia.org/wiki/Lucene) Java搜索库为核心的全文索引和搜索,并具有类似REST的HTTP/XML和JSON的API。 Solr强大的外部配置功能使得无需进行Java编码,便可对其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。 因为2010年Apache Lucene和Apache Solr项目合并,两个项目是由同一个[Apache软件基金会](https://zh.wikipedia.org/wiki/Apache%E8%BD%AF%E4%BB%B6%E5%9F%BA%E9%87%91%E4%BC%9A)开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。 Solr的历史2004年,Solr作为CNET Networks为公司网站添加搜索功能的一个内部项目,由Yonik Seeley创建。 后来Yonik Seeley随Grant Ingersoll和Erik Hatcher创建了LucidWorks(原名Lucid Imagination),公司提供商业支持、咨询和Apache Solr搜索技术的培训。2006年1月,CNET Networks决定捐赠其到Apache软件基金会顶级项目Lucene,公开发布其源代码。像在Apache软件基金会的任何新项目一样,其进入了一个潜伏期,以助于解决组织、法律和金融问题。2007年1月,Solr结束

    Solr   Java   搜索引擎   2019-07-24 浏览(286) 阅读原文>>
  • Java对象结构以及Java锁

    java对象结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 对象头(Header)对象头又可以分为两个部分:MarkWord和Klass+ Markword第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开指针启压缩)中分别为32bit和64bit,官方称它为“MarkWord”。+ Klass Pointer对象头的另外一部分是Klass类型指针,即对象指向它的类元数据的指针(所以也可以称为元数据指针),虚拟机通过这个指针来确定这个对象是哪个类的实例。所占空间大小为64bit,即8字节(开启指针压缩,大小为4字节)。+ 数组长度(只有数组对象有)如果对象是一个数组, 那在对象头中还必须有一块数据用于记录数组长度。这是一个int类型的数值,所占空间为4字节。 实例数据(Instance Data)这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定,比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是8个字节(开启指针压缩,reference是4字节)。 静态属性的所占空间不计算在对象内存的大小中,因为它们存放在方法区。 对齐填充(Padding)第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot的虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或者2倍),因此当对象实例数据部分没有对齐时,就需要通过对齐填充(P

    Java   对象结构      MarkWord   2019-07-23 浏览(204) 阅读原文>>
  • 重温Java设计模式——适配器模式

    前言程序设计模式其实是前人在不断探索过程中总结出来的,符合一定的开闭原则并且相对来说足够优雅的代码范式。经历过足够长的项目洗礼,其实用性自然是不用怀疑。既然是在编码过程中衍化而来的范式,那么我辈在开发过程中也会或多或少的用到,或者说自然而然的写出来。所以,关于Java设计模式的介绍,主要是帮大家规范平时的代码。换句话说,帮助大家缩短从自热而然的初窥门径到熟练运用的所花费时间。至于具体的代码,大家其实不用过于在意,关键是领会其思想,解决了什么问题。 关于适配器模式百度百科对适配器一词的解释: 适配器是英语Adapter/adaptor的汉语翻译。适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。Java的适配器模式中的适配器,也是起到了一个转换的作用,将目前手头有单不匹配的功能接口转换成适用的目标接口。更专业的解释是: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。话不多说,下面记录一些我借鉴一些技术文章并结合自己的想法,而进行的一些测试。![图片](https://oomabc.com/staticsrc/img/201906/21/1561088076827de97c411b3d9476b8d35ab82e426b2c6.jpg) 电脑电源适配器我先根据我们最常接触的电源适配器来进行抽象,应用下适配器模式。首先定义一个供电电源接口类PowerSource.java:Javapackage designpatterns.adapter.e3;/ @author Smile.Wu @version 2015-10-19 电源接口 /public interface PowerSource { int supplyPower();}定义一

    Java   设计模式   适配器   2019-07-01 浏览(912) 阅读原文>>
  • Docker学习——创建一个JDK+Tomcat的Solr服务镜像

    前言这里没有前言,我发现网上关于Docker的介绍文章一大堆,我写的肯定没他们好。本想去官网翻一下相关重点内容,看了文档,发现自己4.5级的英文实在难以准确翻译,大伙还是直接去[Docker官网](https://www.docker.com/)吧。 Docker安装以下是Mac版本Docker安装,完全按照[官网](https://www.docker.com/get-started)指示行事。 创建Docker账号![图片](https://oomabc.com/staticsrc/img/201905/06/1557146057796cb47a1da2da6449e8eac420fa04ad2bb.jpg)它会让你创建一个Docker账号,如果有就点击“Sign In”直接登录。![图片](https://oomabc.com/staticsrc/img/201905/06/155714614472691abe3c0ffa44bfea656932230b61072.jpg) 下载Docker.dmg登录之后点击"Get started with Docker Desktop"去下载dmg文件即可安装。![图片](https://oomabc.com/staticsrc/img/201905/06/1557146634809daaf31bd3c6942b38eeb522b02d07fc6.jpg)![图片](https://oomabc.com/staticsrc/img/201905/06/1557146681391b33ae0b1104d4c1782e4657da4bc27e4.jpg)下载页面已经告诉你后续步骤了:1. 下载并安装Docker2. 克隆一个样例git3. build自己第一个镜像4. 运行这个镜像5. 推送镜像到远程仓库---- 样例测试安装好Docker之后,我们从第2个步骤开始 克隆doodle.gitbash% git clone https://github.com/docker/doodle.git正克隆到 'doodle'...remote: Enumerating objects: 36, done.remote: Counting objects: 100% (36/36), done.remote: Compressing objects: 100% (27/27), done.remote: Total 36 (delta 13), reused 27 (delta 7), pack-reused 0展开对象中: 100% (36/36), 完成.20:49 wjyuian@wjyuianMacBookPro /Users/wjyuia

    Docker   Solr   Dubbo   2019-05-10 浏览(568) 阅读原文>>
  • SpringBoot2(四)Docker+Consul+Cloud+Feign

    前言距离上一篇SpringBoot2的文章,已经过去很久了,今天终于有时间继续写一篇基于SpringBoot2+SpringCloud+consul+feign的入门文章。 Spring Cloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。[SpringCloud](https://springcloud.cc/) Spring Cloud Feign Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。通过Feign,Java项目可以轻松实现跨语言的基于Http的服务接口。[Fegin](https://github.com/OpenFeign/feign) Consul Consul是一个服务发现与配置工具,与Docker容器可以无缝集成,同时它自身也是分布式的、高可用的、可扩展的。+ 服务发现:通过Consul,服务提供方可以轻而易举的将自己的服务进行注册,同时可以通过DNS或者HTTP接口来发现其他服务。SaaS等其他服务同样可以注册上来。+ 健康检查:当Consul集群发生任何异常时,健康检查功能可以迅速将异常信息通知给其它节点。它可以防止请求被路由到非健康节点,同时可以提供服务级别的熔断。+ 基于键值的存储:类似Zookeeper,Consul也可

    SpringCloud   Consul   Feign   Docker   SpringBoot   2019-09-22 浏览(752) 阅读原文>>
  • JVM——Java内存模型

    前言大部分Java程序员(包括我自己)大部分时间接触的都还是单线程代码,虽然JVM本身是支持多线程并发执行的。在JVM中,多个线程在执行代码(操作变量或对象)的时候,都是通过操作共享的主内存来实现的。多线程并发可能通过多个硬件处理器实现,也可能是在单处理器上通过切换CPU时钟实现,或者是在多个处理器上切换CPU时钟实现。对于程序员来说,只能通过创建一个Thread类的实例对象来创建一个线程;每个线程都会存在一个与之对于的实例对象。通过实例对象的start()方法来启动对应的线程:java//每个线程都是通过创建Thread的实例对象来定义的Thread firstThread new Thread();//只有调用的线程的start方法,才能启动线程(不管是这里的主动调用或者其他组件的隐式调用)firstThread.start();如果没有对多线程操作进行合理的同步(synchronized、volatile等)控制,就会出现一些匪夷所思的问题。本章会介绍Java多线程编码相关的语义,比如共享内存中多线程对变量进行更新之后的可见性。许多硬件体系结构中也存在类似内存模型的概念,而我们本章讨论的是Java语言中的内存模型,称为Java programming language memory model(JMM),下文简称内存模型。---- 同步(Synchronization)Java为多线程通信提供了不同级别的同步机制,最常用的就是同步原语(synchronized)了,它是通过监视器(准确的说是monitors,下文都称为监视器)实现的。每个Java对象(包括常见的类实例对象和Class对象)都有一个对应的监视器,同一个时刻只能有一个线程进获得某一个对象的监视器锁。此时,其它在尝试获得该监视器锁的线程都会堵塞,直到该锁被释放。特别注意的是,这种方式实现的锁是非公平锁:同一个线程可以多次重复获得同

    内存模型   JVM   2019-03-29 浏览(300) 阅读原文>>
  • JVM——初探内存结构(基于JDK8)

    Java是一门通用的、支持并发的面向对象的编程语言。它借鉴了C和C++的语法,但是舍弃了一些令它们变得复杂的、不安全的容易使人产生迷惑的特性。而JVM(Java Virtual Machine)则是Java平台的基石。正因为它,Java平台才能使用少量的编译代码就能实现跨硬件、跨操作系统特性,而且让用户免受恶意程序的攻击。虽然是一个虚拟的计算机器,但JVM与真实的物理计算机一样,也有自己的指令集,也会在运行时操作不同的内存区域。通过虚拟机来实现编程语言是很常见的,比如UCSD Pascal语言就是通过P-Code虚拟机实现的。第一个JVM原型是由Sun公司实现的。----- JVM内存结构——运行时数据区(Run-Time Data Areas)JVM规范定义了在程序运行期间的若干个不同的运行时数据区(内存)。有些区域的生命周期与JVM一致,随着JVM的启动而创建,又随着JVM的退出而销毁。有些区域是线程私有的,线程私有的数据区生命周期与线程的生命周期一致。+ 程序计数器(Program Counter Register)+ Java虚拟机栈(Java Virtual Machine Stacks)+ Java堆(Java Heap)+ 方法区(Method Area) + 运行时常量池(Runtime Constant Pool)+ 本地方法栈(Native Method Stacks)![图片](https://oomabc.com/staticsrc/img/201903/22/1553244569400192ca2a5a24840d6948c14e4137ac2d1.jpg)--- 程序计数器(Program Counter Register)JVM的能支持多线程并发,就是通过线程轮流切换并分配CPU时间来实现的。每个JVM线程都有各自独立的程序计数器,只有这样才能在多线程轮流切换之后恢复到正确的执行位置。同一时刻,只有一个线程可以执行当前方法对应的机器指令。如果当前执行的不是native方法,则程序计数器的值就是当前正在执行的JVM指令的内

    JVM   Java   内存结构   JDK8   2019-03-28 浏览(340) 阅读原文>>
  • 乡村风味——KMP算法通俗解释

    题目给出两个字符串main和sub,要求查找sub在main中第一次出现的位置(从0开始)。未出现过,则返回-1。 样例 例子 1 : 输入:main "1235J235J234", sub "235J234" 输出:5 例子 2 : 输入:main "12345Q2345", sub "2345J" 输出:-1 解题这个题目其实比较简单,我们直接定义两个指针,一次进行字符比较。如果相同者指针一起后移,否则重置指针(sub指针大于0的时候,main的指针不需用动;否则只要main的指针后移即可),再次比较。其实main的指针是没有回头路的,只能后移或者不动。而sub的指针就很浪了,前前后后的移动。 程序员版1. 定义i为main的下标,j为sub的下标。current为main字符串在i处的字符,同样search是sub在j位置的字符;start是主串在一轮匹配中的开始位置。2. 如果两个下标都未超出各自字符串范围(下标小于字符串长度),则跳到步骤 3 ;否则跳到步骤 5 。3. 如果current与search相同,则表示当前位置一致。此时i和j下标都加一,然后跳到步骤 2;否则跳到 4 。4. 需要对i或者j下标进行重置:如果j本身就指向sub的第一个字符,则需要将start进行加一,i从start开始;否则,j下标重置为0,i下标不动;然后回到步骤 2 。5. 如果此时j的大小与sub子串长度一致,表示匹配成功,返回i减去sub长度即可(或者说i减去j)。 大爷大妈版1. 大爷有10张麻将牌,乱序排列好,依次在每张牌后面贴上序号,从0开始,递增。2. 大妈有4张麻将牌,乱序排列好,依次在每张牌后面贴上序号,从0开始,递增。3. 如果两个人手里都有牌,则大爷大妈分别打出序号最小的牌,然后跳到步骤 4;否则跳到步骤6 。4. 如果是相同的牌,则跳到步骤 3;否则跳到步骤 5 。5. 此时如果大妈只打出一张牌

    KMP   字符串比较   优化   2019-05-05 浏览(205) 阅读原文>>
  • 搜索引擎进阶——Lucene链表操作解析

    说到搜索引擎,大家都不会陌生,尤其是互联网从业者更是如此。而大部分程序员都能对其基本原理说个七七八八,比如分词、倒排链表、空间向量模型、余弦定理、Top-N......。而且对于全文检索的两个过程索引和查询也都知道个大概。+ 索引:对数据进行分词,然后按照分词结果生成倒排链表(包含词频、位置等信息),最后生成索引文件。+ 查询:对查询语句进行分词,综合其他查询条件生成查询树并优化;对查询树进行倒排链表匹配,将匹配到的链表按照查询语义进行操作(交集、并集、差集等);最后按照打分规则进行排序并分页返回结果。当然真正的实现细节会复杂许多,比如数据结构、数据类型定义、索引存储、数据压缩、相关链表操作算法、跳跃表、打分模型、内存索引切换等等,都是需要考虑的地方。 链表操作前面介绍的那些内容中,有一个是非常重要而且相对来说比较容易看懂和说明白的就是链表操作。何为链表操作?每个Term后面都挂有一个链表,链表的元素主要包含的内容有元素的DocId(这是Lucene给每个文档的自增编号)、Frequency(这是分词在对应文档中出现的频率)。实际上,每个链表元素就对应一篇当初索引的文档,所以链表操作就是对这些文档进行交集、差集、并集的操作。例,有如下几篇文档: A:机器学习最通俗的解释就是让机器学会决策。 B:支持向量机(SVM)是90年代中期发展起来的基于统计学习理论的一种机器学习方法。 C:随机森林的基本单元是决策树。 D:分类和回归是机器学习解决的两大主要问题。 E:古典决策理论盛行于20世纪初到50年代期间。 F:分类树(决策树)是一种十分常用的分类方法,是一种有监督的机器学习方法。现在我们只考虑其中几个分词,而且暂时忽略分词的歧义性,那么简易

    链表   交集   并集   差集   Lucene   Java   搜索引擎   2019-08-13 浏览(526) 阅读原文>>
  • JVM——Java类的加载机制以及生命周期

    一、什么是类的加载类的加载,就是将.class文件中的二进制数据读取到内存中,其实是存放于运行时的方法区。然后在堆中创建一个java.lang.Class对象(该对象封装了符合方法区定义的数据结构),同时向用户提供访问方法区内的数据结构的接口。JVM允许类加载器对某个类进行预加载。预加载过程发生错误(.class文件缺失或者有错误),类加载器需要在程序首次主动使用该类时报告错误(LinkageError),如果程序一直没有主动使用这个类,则类加载器不会报告这个错误。类加载器的加载方式:本地文件系统、网络.class文件、压缩包中的.class文件、Java源文件动态编译的.class文件。 二、类的生命周期类的生命周期包括加载、验证、准备、解析、初始化五个阶段。其中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的。而解析可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。 加载(Loading):查找对应目录中的类,并加载二进制字节流 1. 通过classpath和类的完整签名来读取对应的二进制字节流。 2. 将二进制字节流所代表的存储结构转化为方法区的数据结构。 3. 在堆中生成一个代表这个类的java.lang.Class对象,作为访问方法区数据结构的入口。此阶段结束之后,JVM外部的二进制字节流文件就按照规范存储在方法区了,而且堆中存在一个可以访问这些方法区中的数据的对象。 -------- 连接-验证(Linking-Verification):确保被加载的类的正确性(符合当前虚拟机版本规范,且不会造成危害) 1. 文件格式验证:验证字节流是

    JVM   类加载   ClassLoader   Java   2019-03-15 浏览(582) 阅读原文>>
  • 1  2  3 
    blogTest
    分享文章
     
    使用APP的"扫一扫"功能,扫描左边的二维码,即可将网页分享给别人。
    你也可以扫描右边本博客的小程序二维码,实时关注最新文章。