- 浏览: 23986 次
- 性别:
- 来自: 北京
最新评论
-
yangfuchao418:
你好 Cartesian Tiers+GeoHash 这部分源 ...
基于Solr的地理位置搜索(3) -
qqggcc:
什么破想法
和日本留学同学聊天想到的 -
hadoopcn:
今年会陆续推出,敬请关注
SOLR技术指南系列文章大纲 -
rfv1116:
学习了 清晰明了
solr之缓存篇 -
qqggcc:
有具体的细节内容吗?
SOLR技术指南系列文章大纲
简单介绍下 在较早版本的 Lucene 中对一定范围内的查询RanageQuery 。该Query 继承于 MulitTermQuery,在重写(rewrite )Query 树的时候将会遵从一个原则:
根据起始区间值获取term, 然后遍历,根据满足条件的term 的数目来决定重写Query 的类型
如下代码所示:
FilteredTermEnum enumerator = query.getEnum(reader);//PrefixTermEnum try { while(true) {////一个循环,取出与MultiTermQuery相关的所有的Term。 Term t = enumerator.term(); if (t != null) { pendingTerms.add(t);//将满足条件的term搜集 // Loading the TermInfo from the terms dict here // should not be costly, because 1) the// query/filter will load the TermInfo when it runs, and 2) the terms dict has a cache: docVisitCount += reader.docFreq(t);//获取词频 } // 方式一 :如果Term数目超限,或者文档数目超限,则可能非常影响倒排表合并的性能,采用Filter方式 if (pendingTerms.size() >= termCountLimit || docVisitCount >= docCountCutoff) { // Too many terms -- make a filter. Query result = new ConstantScoreQuery(new MultiTermQueryWrapperFilter(query)); result.setBoost(query.getBoost()); return result; //方式二:如果Term 数目不太多,而且文档数目也不太多,不会影响倒排表合并的性能 } else if (!enumerator.next()) { // Enumeration is done, and we hit a small // enough number of terms & docs -- just make a // BooleanQuery, now Iterator it = pendingTerms.iterator(); BooleanQuery bq = new BooleanQuery(true);//构建BooleanQuery while(it.hasNext()) {//将区间Query分解成独立的TermQuery后构造成BooleanQuery,最终通过每个TermQuery的结果合并的方式来达到区间查询的目的 TermQuery tq = new TermQuery((Term) it.next()); bq.add(tq, BooleanClause.Occur.SHOULD); } // Strip scores Query result = new ConstantScoreQuery(new QueryWrapperFilter(bq)); result.setBoost(query.getBoost()); query.incTotalNumberOfTerms(pendingTerms.size()); return result; } } } finally { enumerator.close(); }
(图一)具体见M ultiTermQuery.ConstantScoreAutoRewrite.rewrite() 方法
两种方式区别:
方式一:如果区间范围较大,获取terms 较多则采取Filter 过滤的方式遍历以start 开始的term ,获取[start,end] 的范围内的 TermEnum 从而取出docIDSet 。
方式二:如果区间范围不大,获取terms 不多,将区间Query 分解成多个termQuery 独立查询,然后根据BooleanQuery 来合并docId
缺点:
方式一:只支持字符串形式的范围查询,区间满足的term 数据越多,查询性能越差。
方式二:会构造太多termQuery 很可能造成 TooManyClause 异常,而且获取结果再合并将极大影响性能。
因为方式二其实现和普通BooleanQuery --> termQuery 查询方式一致,而本文主要阐述Range 查询,所以将不会方式二实现原理。
OK,那我们看看TermRangeQuery如何实现查询的,我们知道重写Query树后 ,接下来就是生成weight 树,从图一中可以看到方式一中重写的RangeQuey 被包装成 ConstantScoreQuery(new MultiTermQueryWrapperFilter(query)); 那么从下面的代码实现结构可以看到生成的 weight:
ConstantScoreQuery . createWeight()
|
|-- new ConstantScoreQuery.ConstantWeight(searcher);
生成 Weight 树后, weight 树将负责 Scorer 树的生成,如下代码实现结构所示 :
ConstantWeight. Scorer()
|
|-- new ConstantScorer ( similarity , reader, this );
|
|-- DocIdSet docIdSet = MultiTermQueryWrapperFilter .getDocIdSet(reader) ;
|-- DocIdSetIterator iter = docIdSet.iterator();
|-- docIdSetIterator = iter;
Query 树 ->weight 树 ->Scorer 树生成后,将开始打分并收集 docId 的过程。如下所示:
Scorer scorer = weight.scorer();
|
|-- scorer.score(collector);//scorer= ConstantScorer
整个 score 过程是遍历直到取出的值 == NO_MORE_DOCS 。见如下代码所示:
public void score(Collector collector) throws IOException { collector.setScorer(this); int doc; while ((doc = nextDoc()) != NO_MORE_DOCS) { collector.collect(doc); } }
而 nextDoc 由 ConstantScorer 实现:
public int nextDoc() throws IOException { return docIdSetIterator.nextDoc(); }
结合ConstantScorer的构造函数可以看到整个docId的范围过滤都在:
// filter= MultiTermQueryWrapperFilter得到所有的文档号,形成统一的倒排表,参与倒排表合并。 DocIdSet docIdSet = filter.getDocIdSet(reader);
完成,接下来在看看该方法的具体实现:
MultiTermQueryWrapperFilter .getDocIdSet(reader) ;
| // 得到 TermRangeQuery 的 Term 枚举器
|-- final TermEnum enumerator = query .getEnum(reader);
|
|-- new TermRangeTermEnum(reader, field , lowerTerm , upperTerm , includeLower , includeUpper , collator );
TermRangeTermEnum的构造函数 其包含的成员变量如下:
_ String lowerTerm; 左边界字符串
_ String upperTerm; 右边界字符串
_ boolean includeLower; 是否包括左边界
_ boolean includeUpper; 是否包含右边界
_ String field; 域
_ Collator collator; 其允许用户实现其函数 int compare(String source, String target) 来决定怎么样算是大于,怎么样算是小于。
TermRangeTermEnum 来保证满足区间条件的 term 能被 MultiTermQueryWrapperFilter. TermGenerator.generate() 方法收集到OpenBitSet中,如下所示:
public DocIdSet getDocIdSet(IndexReader reader) throws IOException { final TermEnum enumerator = query.getEnum(reader);////得到MultiTermQuery的Term枚举器 try { // if current term in enum is null, the enum is empty -> shortcut if (enumerator.term() == null) return DocIdSet.EMPTY_DOCIDSET; // else fill into a OpenBitSet final OpenBitSet bitSet = new OpenBitSet(reader.maxDoc());//创建包含多个Term的文档号集合 new TermGenerator() { public void handleDoc(int doc) { bitSet.set(doc); } }.generate(reader, enumerator); return bitSet; } finally { enumerator.close(); } }
而generate()具体实现为:
public void generate(IndexReader reader, TermEnum enumerator) throws IOException { final int[] docs = new int[32]; final int[] freqs = new int[32]; TermDocs termDocs = reader.termDocs(); try { int termCount = 0; do {////一个循环,取出对应的所有的Term,取出他们的文档号,加入集合 Term term = enumerator.term(); if (term == null) break; termCount++; termDocs.seek(term);//term定位到搜索条件的指定的Term开始往后遍历 while (true) { final int count = termDocs.read(docs, freqs); if (count != 0) { for(int i=0;i<count;i++) { handleDoc(docs[i]); } } else { break; } } } while (enumerator.next()); query.incTotalNumberOfTerms(termCount); } finally { termDocs.close(); } }
从上述代码可以看出TermRangeTermEnum最关键的2个方法就是term()和next()方法,
(1) TermRangeTermEnum.term()方法是获取遍历过程中当前的term。
(2) TermRangeTermEnum.next()方法是遍历Term的枚举列表
在 TermRangeTermEnum 并没有重写 next() 方法,所以从父类 FilteredTermEnum 中的 next 可以看到:
public boolean next() throws IOException { if (actualEnum == null) return false; // the actual enumerator is not initialized! currentTerm = null; while (currentTerm == null) { if (endEnum()) return false; if (actualEnum.next()) { Term term = actualEnum.term(); if (termCompare(term)) {// 满足前缀就OK currentTerm = term; return true; } } else return false; } currentTerm = null; return false; }
从上述代码可以得知遍历结束取决:
(1) endEnum()==true;// 结束枚举遍历
(2) actualEnum.next()==false;// 整个term 的枚举遍历完毕
(3) termCompare(term)==false;// 当前的term 字符串不在[start,end] 区间范围内
而从termRanageTermEnum 中endEnum 其实也是由termCompare(term) 方法来影响,所以人为能影响的区间查询都由termCompare 方法来决定,代码如下所示:
protected boolean termCompare(Term term) { if (collator == null) {//如果用户没有设定collator,则使用字符串比较。 // Use Unicode code point ordering boolean checkLower = false; if (!includeLower) // make adjustments to set to exclusive checkLower = true; if (term != null && term.field() == field) { // interned comparison if (!checkLower || null==lowerTermText || term.text().compareTo(lowerTermText) > 0) { checkLower = false; if (upperTermText != null) { int compare = upperTermText.compareTo(term.text()); ////最大的termText小于当前的termText值则标示不在区间内所以返回false, //同时置endEnum=true;立即结束整个遍历查询过程 if ((compare < 0) || (!includeUpper && compare==0)) { endEnum = true; return false; } } return true; } } else { // break endEnum = true; return false; } return false; } else {//用户设定自己订阅的collator,从而人为控制term值的大小比较 if (term != null && term.field() == field) { // interned comparison if ((lowerTermText == null || (includeLower ? collator.compare(term.text(), lowerTermText) >= 0 : collator.compare(term.text(), lowerTermText) > 0)) && (upperTermText == null || (includeUpper ? collator.compare(term.text(), upperTermText) <= 0 : collator.compare(term.text(), upperTermText) < 0))) { return true; } return false; } endEnum = true; return false; } }
如上代码所述, 区间查询的时间是和区间范围内term 的个数有关系的,也就是说如果区间范围越大,意味着查询的next() term 的次数也会更多。
另外该范围查询只支持字符串范围查询,并不支持数值型的范围查询。所以 从 Lucene 2.9 开始,Lucene 提供对数字范围的支持,但是然而欲使用此查询,必须使用 NumericField 来添加域。 这也是NumericField和numericRangeQuery结合起来的数值型范围查询。
发表评论
-
基于Solr的地理位置搜索(3)
2013-01-09 13:48 2983接上文,本文将继续介绍基于Solr的地理位置搜索的第二种实现方 ... -
基于Solr的空间搜索学习(2)
2013-01-08 23:07 0<!-- [if gte mso 9]><x ... -
基于Solr的空间搜索学习(2)
2013-01-08 23:06 0<!-- [if gte mso 9]>< ... -
基于Solr的空间搜索学习(2)
2013-01-08 23:05 0<!-- [if gte mso 9]>< ... -
基于Solr的空间搜索学习(2)
2013-01-08 23:04 0<!-- [if gte mso 9]>< ... -
基于Solr的空间搜索学习(2)
2013-01-08 23:03 0<!-- [if gte mso 9]>< ... -
基于Solr的地理位置搜索(1)
2013-01-08 13:25 2776基于Solr的空间搜索学习笔记在Solr中基于空 ... -
SOLR技术指南系列文章大纲
2012-11-26 00:43 1339第一章 初识Solr 1.1理解solr ... -
solr之缓存篇
2012-11-06 01:33 1984Solr在Lucene之上开发了很多Cache功能,从目前提供 ... -
NumericField&NumericRangeQuery原理分析
2012-06-04 21:52 3751NumericField和NumericRangeQuery是 ...
相关推荐
(1) 范围查询(TermRangeQuery) 10 (2) 数字查询(NumericRangeQuery) 11 (3) 前缀查询(PrefixQuery) 11 (4) 通配符查询(WildcardQuery) 11 (5) 多条件查询(BooleanQuery) 12 (6) 短语查询(PhraseQuery) ...
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
30KW三相PFC充电桩项目开发设计方案CCS源码AD原理图bom测试报告
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)JAVA五子棋手机网络对战游戏的设计与实现(源代码+LW)
【项目资源】:汇聚了云计算、区块链、网络安全、前端设计、后端架构、UI/UX设计、游戏开发、移动应用开发、虚拟现实(VR)、增强现实(AR)、3D建模与渲染、云计算服务、网络安全工具等各类技术项目的素材和模板。包括AWS、Azure、Docker、Kubernetes、React、Vue、Angular、Node.js、Django、Flask、Unity、Unreal Engine、Blender、Sketch、Figma、Wireshark、Nmap等项目的素材和模板。【项目质量】:所有素材和模板都经过精心筛选和整理,确保满足专业标准。在发布前,我们已经对功能进行了全面测试,确保其稳定性和可用性。【适用人群】:适合对技术充满热情的初学者、希望提升专业技能的中级开发者、以及寻求创新解决方案的高级工程师。无论是个人项目、团队合作、课程设计还是商业应用,都能在这里找到合适的资源。【附加价值】:这些项目资源不仅具有很高的学习价值,而且能够直接应用于实际项目中,提高开发效率。对于有志于深入研究或拓展新领域的人来说,它们提供了丰富的灵感和基础框架,帮助你快速构建出令人惊艳的作品。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Hnase课程-概念资料
太原理工软件工程Linux与Python编程实验报告,各位当个参考即可,不用过分较真,如果与你们想法不同,请以自己为主。
开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
PiP-Tool-master
保姆式教学,手把手学习,让你清晰认识waf设备
base.apk
电脑游戏,是指在计算机上能够运转的游戏软件。这种软件具有较强的娱乐性。电脑游戏的创新和发展与硬件、软件的发展紧密相关。它能够给玩家提供一个虚拟的环境,使游戏带给了人们很多的享受和欢乐。雷电游戏因为操作简单,节奏明快,一直是纵轴射击游戏的经典之作。经常能够在手机或者计算机中见到这款游戏,深得广大玩家的喜爱,可以说是妇孺皆知的一款益智类游戏。 本游戏基于Eclipse开发平台,以java作为编程语言,整个项目开发旨在模拟雷电游戏的飞机射击游戏。游戏界面的下部是玩家的飞机,可以根据按键控制子弹的发射,上部为敌方飞机,在界面中随机出现。在游戏过程当中,用户飞机的移动是被电脑键盘的方向键所控制的,在整个游戏过程当中,如果用户飞机的子弹与敌方飞机发生相撞时,敌方飞机就会有爆炸的效果产生。游戏中使用到的飞机、子弹均采用对应的类实现。
【作品名称】:基于FPGA的深度学习加速器的设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于FPGA的深度学习加速器的设计与实现