Lucene查询(搜索)语法示例

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。

在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以提供强大的搜索功能。 在这里查看 !

目录

1.简介 2.查询类
2.1术语查询 2.2短语查询 2.3。 布尔查询 2.4。 通配符查询 2.5。 正则表达式查询 2.6。 TermRangeQuery 2.7。 NumberRangeQuery 2.8。 模糊查询

1.简介

在本课程的这一课中,我们将研究Lucene提供的基本查询机制。 您可能会在入门课程中记得,Lucene不会将要搜索的原始文本发送到索引。 它为此使用Query对象。 在本课程中,我们将看到所有关键要素,它们将人类书面搜索短语转换为诸如Queries类的代表性结构。

2.查询类

Query类是一个公共抽象类,它代表对索引的查询。 在本节中,我们将看到最重要的Query子类,您可以使用它们来执行高度定制的查询。

2.1术语查询

这是您可以针对Lucene索引执行的最简单直接的查询。 您只需搜索在特定Field包含单个单词的Documents

基本的TermQuery构造函数定义如下: public TermQuery(Term t) 。 您从第一节课中记得, Term由两部分组成:

  1. 该术语所驻留的Field的名称。
  2. 术语的实际值,在大多数情况下,是通过对某些纯文本的分析得出的单个单词。

因此,如果您想创建一个TermQuery来查找所有在"content" Field中包含"good"字样的Documents ,则可以按照以下方法进行操作

TermQuery termQuery = new TermQuery(new Term("content","good"));

我们可以使用它在先前创建的索引中搜索单词“ static”:

String q = "static"Directory directory = FSDirectory.open(indexDir);IndexReader  indexReader  = DirectoryReader.open(directory);IndexSearcher searcher = new IndexSearcher(indexReader);Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);TermQuery termQuery = new TermQuery(new Term("content",q));TopDocs topDocs =searcher.search(termQuery, maxHits);ScoreDoc[] hits = topDocs.scoreDocs;for (ScoreDoc hit : hits) {int docId = hit.doc;Document d = searcher.doc(docId);System.out.println(d.get("fileName") + " Score :" + hit.score);
}System.out.println("Found " + hits.length);

输出为:

C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\Product.java Score :0.29545835
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleSearcher.java Score :0.27245367
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\PropertyObject.java Score :0.24368995
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleIndexer.java Score :0.14772917
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\TestSerlvet.java Score :0.14621398
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\ShoppingCartServlet.java Score :0.13785185
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\MyServlet.java Score :0.12184498
Found 7

如您所见,我的七个源文件中包含"static"关键字。 就是这样。 自然,如果您尝试在查询字符串中添加另一个单词,则搜索将返回0个结果。 例如,如果您将查询字符串设置为:

String q = "private static"

输出将是:

Found 0

现在,我知道我的许多源文件中都存在"private static" 。 但是,您可能还记得,我们在索引过程中使用了StandarAnalyzer处理从文件中检索的纯文本。 StandardAnalyzer将文本拆分为单个单词,因此每个Term包含一个单词。 您可以选择不标记索引的Field 。 但是我建议您在包含元数据的Fields中执行此操作,而不是在包含其内容的字段中,这些字段包含有关我们文档的信息(例如标题或作者)。 例如,如果您选择不对名称为'author'且值为'James Wilslow'Field进行标记化并编制索引,则Field 'author'将仅包含一个整体值为'James Wilslow' Term 。 如果您对Field进行了标记化,则它将包含两个Terms ,一个的值为'James' ,另一个的值为'Wilslow'

2.2短语查询

使用PhraseQuery您可以搜索包含特定单词序列(又名短语)的Documents

您可以这样创建一个PhraseQuery

PhraseQuery phraseQuery = new PhraseQuery();

然后,您可以向其添加Terms 。 例如,如果您要搜索在其“内容”字段中包含短语“ private static”的Documents ,则可以这样做:

PhraseQuery phraseQuery = new PhraseQuery();phraseQuery.add(new Term("content","private"));
phraseQuery.add(new Term("content","static"));TopDocs topDocs =searcher.search(phraseQuery, maxHits);ScoreDoc[] hits = topDocs.scoreDocs;for (ScoreDoc hit : hits) {int docId = hit.doc;Document d = searcher.doc(docId);System.out.println(d.get("fileName") + " Score :" + hit.score);
}System.out.println("Found " + hits.length);

输出将是:

C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\Product.java Score :0.54864377
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\PropertyObject.java Score :0.45251375
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleSearcher.java Score :0.45251375
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\TestSerlvet.java Score :0.27150828
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\ShoppingCartServlet.java Score :0.25598043
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\MyServlet.java Score :0.22625688
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleIndexer.java Score :0.22398287
Found 7

仅当“ Field "static"连续且以该顺序准确包含单词"private""static"Document才进入结果。

因此,如果您以上述方式更改上述代码:

phraseQuery.add(new Term("content","private"));
phraseQuery.add(new Term("content","final"));

你会得到 :

Found 0

这是因为尽管我的源文件包含两个词,但它们不是连续的。 要改变这种行为一点点,你可以添加一个slopPhraseQuery 。 当您增加1的坡度时,您最多可以在词组中的词之间插入一个词。 添加坡度2时,短语中的单词之间最多允许2个单词。

有趣的是: “实际上,坡度是一个编辑距离,其单位对应于查询短语中词条移动的位置。 例如,要切换两个单词的顺序需要两个步骤(第一个步骤将单词彼此放在首位),因此要允许对短语进行重新排序,斜率必须至少为两个。

因此,如果我们这样做:

PhraseQuery phraseQuery = new PhraseQuery();phraseQuery.add(new Term("content","private"));
phraseQuery.add(new Term("content","final"));phraseQuery.setSlop(2);

我们的搜索输出将给出:

C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\Product.java Score :0.38794976
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\PropertyObject.java Score :0.31997555
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleSearcher.java Score :0.31997555
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\TestSerlvet.java Score :0.19198532
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\ShoppingCartServlet.java Score :0.18100551
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\MyServlet.java Score :0.15998778
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleIndexer.java Score :0.15837982

重要的是要提到包含更接近查询确切短语的短语的文档将获得更高的分数。

2.3布尔查询

BooleanQuery是一种更具表现力和功能的工具,因为您可以将多个查询与布尔子句结合在一起。 可以用BooleanClauses填充BoleanQuery。 BooleanClause包含一个Query ,以及Query在布尔搜索中应具有的角色。

更具体地说,布尔子句可以在查询中扮演以下角色:

  1. MUST :这很自我explenatory 。 当且仅当Document包含该子句时,它才会进入结果列表。
  2. MUST NOT :这是完全相反的情况。 对于文档而言,必须将其包含在结果列表中,而不包含该子句。
  3. SHOULD :这是针对Document中可能出现的子句的,但是为了使结果成为结果,它们不必包含这些子句。

如果仅使用SHOULD子句进行布尔查询,则结果至少匹配其中一个子句。 这看起来像经典的OR布尔运算符,但正确使用它并不是那么简单。

现在让我们看一些例子。 让我们找到包含单词“ string”但不包含单词“ int”的源文件。

TermQuery termQuery = new TermQuery(new Term("content","string"));
TermQuery termQuery2 = new TermQuery(new Term("content","int"));BooleanClause booleanClause1 = new BooleanClause(termQuery, BooleanClause.Occur.MUST);
BooleanClause booleanClause2 = new BooleanClause(termQuery2, BooleanClause.Occur.MUST_NOT);BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(booleanClause1);
booleanQuery.add(booleanClause2);TopDocs topDocs =searcher.search(booleanQuery, maxHits);

结果如下:

C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\SimpleEJB.java Score :0.45057273
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\PropertyObject.java Score :0.39020744
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\ShoppingCartServlet.java Score :0.20150226
C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\TestSerlvet.java Score :0.13517183
Found 4

现在,让我们尝试查找包含单词“ nikos”和短语“ httpservletresponse response”的所有文档。 在以下代码片段中,您可以看到如何避免创建BooleanClause实例,从而使您的代码更紧凑。

TermQuery termQuery = new TermQuery(new Term("content","nikos"));PhraseQuery phraseQuery = new PhraseQuery();
phraseQuery.add(new Term("content","httpservletresponse"));
phraseQuery.add(new Term("content","response"));BooleanQuery booleanQuery = new BooleanQuery();booleanQuery.add(phraseQuery,BooleanClause.Occur.MUST);
booleanQuery.add(termQuery,BooleanClause.Occur.MUST);TopDocs topDocs =searcher.search(booleanQuery, maxHits);

结果如下:

C:\\Users\\nikos\\Desktop\\LuceneFolders\\LuceneHelloWorld\\SourceFiles\\ShoppingCartServlet.java Score :0.3148332
Found 1

让我们找到所有包含单词“ int”或单词“ nikos”的文档。您可能会想到,必须以某种方式使用SHOULD规范:

TermQuery termQuery = new TermQuery(new Term("content","int"));
TermQuery termQuery2 = new TermQuery(new Term("content","nikos"));BooleanQuery booleanQuery = new BooleanQuery();booleanQuery.add(termQuery,BooleanClause.Occur.SHOULD);
booleanQuery.add(termQuery2,BooleanClause.Occur.SHOULD);TopDocs topDocs =searcher.search(booleanQuery, maxHits);

这虽然不太困难,但是创建更复杂的析取查询有点棘手。 如何正确使用它并不总是那么简单。

例如,让我们尝试查找所有包含单词“ nikos”和短语“ httpservletresponse response”或单词“ int”的文档。 可以这样写:

TermQuery termQuery = new TermQuery(new Term("content","nikos"));PhraseQuery phraseQuery = new PhraseQuery();
phraseQuery.add(new Term("content","httpservletresponse"));
phraseQuery.add(new Term("content","response"));BooleanQuery booleanQuery = new BooleanQuery();booleanQuery.add(phraseQuery,BooleanClause.Occur.MUST);
booleanQuery.add(termQuery,BooleanClause.Occur.MUST);
booleanQuery.add(new TermQuery(new Term("content","int")),BooleanClause.Occur.SHOULD);TopDocs topDocs =searcher.search(booleanQuery, maxHits);

但是查询将无法提供所需的结果。 请记住,如我们所构造的那样,该查询的结果必须同时包含单词"nikos"并且必须同时包含短语"httpservletresponse response" 。 但这不是您想要的。 您需要包含nikos单词和短语"httpservletresponse response"文档,但也想要独立包含单词"int"文档,无论它们是否包含其他子句。 公平地说,上述布尔查询有点错误。 因为在直接的布尔语法中,您永远不会写类似的内容:A AND B ORC。您应该写(A AND B)ORC。或者A AND(B OR C)。 看到不同?

因此,您应该编写所需的查询,例如:(“ nikos”和“ httpservletresponse response”)或“ int”。

您可以将BooleanQueries组合在一起。 使用上面严格的语法,很难想象这将如何进行:

TermQuery termQuery = new TermQuery(new Term("content","nikos"));PhraseQuery phraseQuery = new PhraseQuery();
phraseQuery.add(new Term("content","httpservletresponse"));
phraseQuery.add(new Term("content","response"));// (A AND B)
BooleanQuery conjunctiveQuery = new BooleanQuery();
conjunctiveQuery.add(termQuery,BooleanClause.Occur.MUST);
conjunctiveQuery.add(phraseQuery,BooleanClause.Occur.MUST);BooleanQuery disjunctiveQuery = new BooleanQuery();// (A AND B) OR C
disjunctiveQuery.add(conjunctiveQuery,BooleanClause.Occur.SHOULD);
disjunctiveQuery.add(new TermQuery(new Term("content","int")),BooleanClause.Occur.SHOULD);TopDocs topDocs =searcher.search(disjunctiveQuery, maxHits);

这是使用BooleanQuery类构造布尔查询时可以遵循的快速指南:

  • X和Y
BooleanQuery bool = new BooleanQuery();
bool.add(X,BooleanClause.Occur.MUST);
bool.add(Y,BooleanClause.Occur.MUST);
  • X或Y
  • BooleanQuery bool = new BooleanQuery();
    bool.add(X,BooleanClause.Occur.SHOULD);
    bool.add(Y,BooleanClause.Occur.SHOULD);
  • X AND(不是Y)
  • BooleanQuery bool = new BooleanQuery();
    bool.add(X,BooleanClause.Occur.MUST);
    bool.add(Y,BooleanClause.Occur.MUST_NOT);
  • (X和Y)或Z
  • BooleanQuery conj = new BooleanQuery();conj.add(X,BooleanClause.Occur.MUST);
    conj.add(Y,BooleanClause.Occur.MUST);BooleanQuery disj = new BooleanQuery();
    disj.add(conj,BooleanClause.Occur.SHOULD)
    disj.add(Z,BooleanClause.Occur.SHOULD)
  • (X或Y)和Z
  • BooleanQuery conj = new BooleanQuery();conj.add(X,BooleanClause.Occur.SHOULD);
    conj.add(Y,BooleanClause.Occur.SHOULD);BooleanQuery disj = new BooleanQuery();
    disj.add(conj,BooleanClause.Occur.MUST)
    disj.add(Z,BooleanClause.Occur.MUST)
  • X或(非Z)
  • BooleanQuery neg = new BooleanQuery();neg.add(Z,BooleanClause.Occur.MUST_OT);BooleanQuery disj = new BooleanQuery();
    disj.add(neg,BooleanClause.Occur.SHOULD)
    disj.add(X,BooleanClause.Occur.SHOULD)

    上面的代码可用于创建越来越复杂的布尔查询。

    2.4通配符查询

    顾名思义,您可以使用WildcardQuery类使用“ *”或“?”执行通配符查询。 字符。 例如,如果您要o搜索包含以'ni'开头的词条,然后是其他任何字符序列的文档,则可以搜索'ni *'。 如果要搜索以“ jamie”开头(后跟(任意)一个字符)的术语,则可以搜索“ jamie?”。 就那么简单。 自然地, WildcardQueries效率低下,因为搜索可能要经过很多不同的术语才能找到匹配项。 通常,最好避免将通配符放在单词的开头,例如“ * abcde”。

    让我们来看一个例子:

    Query wildcardQuery = new WildcardQuery(new Term("content","n*os"));
    TopDocs topDocs =searcher.search(wildcardQuery, maxHits);

    Query wildcardQuery = new WildcardQuery(new Term("content","niko?"));
    TopDocs topDocs =searcher.search(wildcardQuery, maxHits);

    2.5 RegexpQuery

    使用RegexpQuery ,您可以执行快速的正则表达式查询,并通过Lucene的快速自动机实现对其进行评估。 这是一个例子

    Query regexpQuery = new RegexpQuery(new Term("content","n[a-z]+"));TopDocs topDocs =searcher.search(regexpQuery, maxHits);

    2.6 TermRangeQuery

    当对字符串术语执行范围查询时,此查询子类很有用。 例如,您可以搜索“ abc”和“ xyz”两个词之间的字词。 字的比较是使用Byte.compareTo(Byte)执行的。 您可能会发现这对于在文档的元数据(例如标题甚至日期)中进行范围查询特别有用(如果使用日期,请小心使用DateTools )。

    您可以在这里找到上周创建的所有文档:

    Calendar c = Calendar.getInstance();
    c.add(Calendar.DATE, -7);
    Date lastWeek = c.getTime();Query termRangeQuery = TermRangeQuery.newStringRange("date", DateTools.dateToString(new Date(), DateTools.Resolution.DAY),DateTools.dateToString(lastWeek, DateTools.Resolution.DAY),true,true);

    当然,在为“日期”字段建立索引时必须小心。 您还必须将DateTools.dateToString应用于它,并指定该字段不进行分析(因此不会被标记化并拆分为单词)。

    2.7 NumberRangeQuery

    这用于执行数字范围查询。 想象一下,您有一个“ wordcount”字段,用于存储该文档的单词数,并且您要检索的单词数在2000至10000之间:

    Query numericRangeQuery = NumericRangeQuery.newIntRange("wordcount",2000,10000,true,true);

    布尔参数规定范围内包括上限和下限。

    2.8模糊查询

    这是一个非常有趣的查询子类。 该查询根据邻近度量(例如众所周知的Damerau-Levenshtein距离)评估字词。 这将找到词典顺序接近的单词。 如果您想执行大量的词典应用程序,例如词典或“您要说的”单词建议功能,则可以使用SpellChecker API 。

    让我们看看如何执行不幸的“字符串”拼写错误的模糊查询搜索:

    Query fuzzyQuery = new FuzzyQuery(new Term("content","srng"));

    翻译自: https://www.javacodegeeks.com/2015/09/lucene-query-search-syntax-examples.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程桌面在自己电脑显示很小的解决办法

背景:最近在某银行办公,使用的是云桌面,疫情期间有一周是在加班办公,使用自己的电脑登录云桌面,然后电脑屏幕显示云桌面很小,看文档及代码十分难受。问问同事,这个问题终于得到了解决。 显示如下: 这个云桌面在我电脑就显示2/3宽度的大小,看代码太难受了,排除右上角向…

《JavaScript100例|01》之javaScript实现俄罗斯方块,唤起了女朋友儿时的回忆!

导读:小时候我们经常打游戏玩俄罗斯方块,用的是游戏机。 现在我们学会了敲代码,简单用JS实现一下这个游戏把。 目录 先看效果 操作说明 代码实现 完整代码 先看效果 操作说明 打开编译器,讲代码复制进去,在浏览…

JBOSS内存溢出处理

JBOSS内存溢出处理 前几天公司一个项目的服务器坏了,就换了一个备份服务器顶替一下,但是没有跑一会就宕机了,一直报java.lang.OutOfMemoryError。。。。一看到这里,就知道是内存溢出,但是JBoss的内存配置已经达到1024M…

linux命令之seq

seq命令简述 seq命令比较常用,在需要做循环的时候用于产生一个序列是再合适不过的工具了,常用方法也比较简单:Usage:seq [OPTION]... LASTseq [OPTION]... FIRST LASTseq [OPTION]... FIRST INCREMENT LASTPrint numbers from FIRST to LAST,…

史上最全高级Java教程总结版(强烈建议收藏)

本篇文章主要用于分享java相关的视频,课程等,涉及面比较广,建议先收藏再慢慢观看,信息量比较大。适合新手,老手各阶段Java程序员。 订阅本专栏 《高级java教程系列》 的福利! 目录 java知识体系列表 面试题库 java各知识点综合面试题

adf4351使用_ADF:将UI类别与动态表单一起使用

adf4351使用JDev 11g R2具有有趣的新功能“ UI类别”。 它使我们可以在视图对象定义级别上以声明方式对VO的属性进行分组。 例如,我的VEmployees视图对象的“ UI Categories”选项卡如下所示: 默认情况下,每个视图对象都有一个预定义的类别“…

使用JavaScript将小写金额转化为大写金额的两种常见方法

导读:在一些支付或者银行确认信息中经常需要将小写金额转换为大写金额,这里做一下归纳, 目录 效果图: 方法一:使用正则表达式 方法二:常规JavaScript实现 效果图: 前面小写,后面大写,这里使用vue测试,其它框架同理.小写是传值的字段money,大写直接调用函数dealBigMoney(money…

h5-列表

<header> <!-- a,div,header,span {-webkit-tap-highlight-color: rgba(255, 255, 255, 0); /*修改a、input和button点击时的蓝色外边框和灰色半透明背景*/ } --><div class"header"> <!-- .header {height: 44px;background: #ff8200;position…

什么是突变测试?

最近&#xff0c;我反复提到“ 突变测试 ”一词。 因为可以说这种方法能够以超出代码覆盖范围的方式检测测试安全网的空白&#xff0c;所以我花了一些时间来追赶这个话题&#xff0c;然后尝试一下。 这篇文章总结了我的发现&#xff0c;作为对该主题的快速介绍。 什么是变异测…

JavaScript数组常用的方法总结

导读&#xff1a;在实际开发中&#xff0c;前端工程师除了写页面布局及样式还要对后端返回的数据进行处理&#xff0c;返回的数据大多数是json格式&#xff0c;一般都是返回一个对象或者数组&#xff0c;下面对常用的数组的使用方法进行总结&#xff0c;方便在开发中手到擒来&a…

Python黑魔法,一行实现并行化

Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题&#xff0c;例如线程的实现和 GIL&#xff0c;我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏“重”。而且往往隔靴搔痒&#xff0c;没有深入探讨日常工作中最有用的内容。 传统…

javaScript对账号卡号进行脱敏处理

导读&#xff1a;一般8位以上账号&#xff0c;显示首尾各4位&#xff0c;中间固定用8位*代替&#xff1b;8位及以下账号&#xff0c;显示首尾各2位&#xff0c;中间固定用8位*代替。 这里简单处理一下16位及以上的账号&#xff0c;卡号&#xff0c;其它的情况同理&#xff0c; …

2. python 参数个数可变的函数

如果想要定义一个参数个数不确定的函数&#xff0c; 可以通过*args,**kwargs实现&#xff1a; *args的使用&#xff1a; **kwargs的使用&#xff1a; 二者的混合使用&#xff1a; 另外还有一些关于调用函数时候的时候常用的技巧&#xff1a; 其和是等价的。 其和是等价的 当然也…

JavaScript常用工具类整理(总结版)

导读&#xff1a;在前端开发过程中需要对常用的功能模块进行封装&#xff0c;常用的方法多次调用需要整合&#xff0c;保证组件的复用性与程序的可维护性&#xff0c;这里总结一下&#xff0c;便于后续的使用&#xff01; 目录 1.全局声明工具类 2.定时器 3.判断变量是否是一…

axis2 json_带有Java和Axis2的JSON Web服务

axis2 json我最近遇到一位客户&#xff0c;要求我使用Java Web服务重建其旧产品。 他们希望它模块化并且易于使用。 我想到的第一件事是使用宁静的方法。 但是让我烦恼的是&#xff0c;Java宁静的方法是使用XML !&#xff0c;我更喜欢一种更简单的通信方式&#xff0c;易于理解…

如何对技术视频转换文章投稿进行二次创作

导读&#xff1a;在技术社区经常会收到一些大的平台&#xff08;华为云博客、infoq等平台的投稿任务&#xff09;&#xff0c;经过对数千篇通用技术稿件&#xff0c;积攒了一些小技巧。所以&#xff0c;在你创作之前还是要好好的看一下&#xff0c;希望对你有帮助&#xff01;看…

iOS开发-UIScrollView原理

转载:http://www.cnblogs.com/xiaofeixiang/p/5144256.html UIScrollView 在开发中是不可避免&#xff0c;关于UIScrollView都有自己一定的理解。滚动视图有两个需要理解的属性&#xff0c;frame和bounds&#xff0c;frame是定义了视 图在窗口的大小和位置&#xff0c;bounds表…

使用Spring MVC进行资源版本控制

提供静态资源时&#xff0c;通常的做法是将某种版本信息附加到资源URL。 这使浏览器可以无限期地缓存资源。 每当资源的内容更改时&#xff0c;URL中的版本信息也会更改。 更新的URL会强制客户端浏览器放弃缓存的资源&#xff0c;并从服务器重新加载最新的资源版本。 使用Spri…

边缘计算如何实现海量IoT数据就地处理

1.什么是IoT边缘&#xff1f;Gartner数据显示&#xff0c;到2021年底将有超过50&#xff05;的大型企业部署至少一个边缘计算应用&#xff1b;到2023年底&#xff0c;50&#xff05;以上的大型企业将至少部署6个用于物联网或沉浸式体验的边缘计算应用。工业一体机的售价一般在1…

.propertie文件注释

在.properties文件中注释,前边加#就可以转载于:https://www.cnblogs.com/toSeeMyDream/p/5539322.html