lucene相关:

应用领域:

  1. 互联网全文检索引擎(比如百度,  谷歌,  必应)
  2. 站内全文检索引擎(淘宝, 京东搜索功能)
  3. 优化数据库查询(因为数据库中使用like关键字是全表扫描也就是顺序扫描算法,查询慢)

lucene:又叫全文检索,先建立索引,在对索引进行搜索的过程。

Lucene下载

官方网站:http://lucene.apache.org/

版本:lucene4.10.3

Jdk要求:1.7以上


域的各种类型:


 lucene的使用:

1、导入jar包:

2、这里我们使用的IKAnalyzer分词器,导入相关配置:

 3:代码:

新建   IndexManagerTest 类,主要用于新增、删除、修改索引:

  1. package com.dengwei.lucene;
  2.  
  3. import org.apache.commons.io.FileUtils;
  4. import org.apache.lucene.analysis.Analyzer;
  5. import org.apache.lucene.document.Document;
  6. import org.apache.lucene.document.Field.Store;
  7. import org.apache.lucene.document.LongField;
  8. import org.apache.lucene.document.TextField;
  9. import org.apache.lucene.index.IndexWriter;
  10. import org.apache.lucene.index.IndexWriterConfig;
  11. import org.apache.lucene.index.Term;
  12. import org.apache.lucene.store.Directory;
  13. import org.apache.lucene.store.FSDirectory;
  14. import org.apache.lucene.util.Version;
  15. import org.junit.Test;
  16. import org.wltea.analyzer.lucene.IKAnalyzer;
  17.  
  18. import java.io.File;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21.  
  22. public class IndexManagerTest {
  23.  
  24. /*
  25. * testIndexCreate();创建索引,数据来源于txt文件
  26. */
  27. @Test
  28. public void testIndexCreate() throws Exception{
  29. //创建文档列表,保存多个Docuemnt
  30. List<Document> docList = new ArrayList<Document>();
  31.  
  32. //指定txt文件所在目录(需要建立索引的文件)
  33. File dir = new File("E:\\searchsource");
  34. //循环文件夹取出文件
  35. for(File file : dir.listFiles()){
  36. //文件名称
  37. String fileName = file.getName();
  38. //文件内容
  39. String fileContext = FileUtils.readFileToString(file);
  40. //文件大小
  41. Long fileSize = FileUtils.sizeOf(file);
  42.  
  43. //文档对象,文件系统中的一个文件就是一个Docuemnt对象
  44. Document doc = new Document();
  45.  
  46. //第一个参数:域名
  47. //第二个参数:域值
  48. //第三个参数:是否存储,是为yes,不存储为no
  49. /*TextField nameFiled = new TextField("fileName", fileName, Store.YES);
  50. TextField contextFiled = new TextField("fileContext", fileContext, Store.YES);
  51. TextField sizeFiled = new TextField("fileSize", fileSize.toString(), Store.YES);*/
  52.  
  53. //是否分词:要,因为它要索引,并且它不是一个整体,分词有意义
  54. //是否索引:要,因为要通过它来进行搜索
  55. //是否存储:要,因为要直接在页面上显示
  56. TextField nameFiled = new TextField("fileName", fileName, Store.YES);
  57.  
  58. //是否分词: 要,因为要根据内容进行搜索,并且它分词有意义
  59. //是否索引: 要,因为要根据它进行搜索
  60. //是否存储: 可以要也可以不要,不存储搜索完内容就提取不出来
  61. TextField contextFiled = new TextField("fileContext", fileContext, Store.NO);
  62.  
  63. //是否分词: 要, 因为数字要对比,搜索文档的时候可以搜大小, lunene内部对数字进行了分词算法
  64. //是否索引: 要, 因为要根据大小进行搜索
  65. //是否存储: 要, 因为要显示文档大小
  66. LongField sizeFiled = new LongField("fileSize", fileSize, Store.YES);
  67.  
  68. //将所有的域都存入文档中
  69. doc.add(nameFiled);
  70. doc.add(contextFiled);
  71. doc.add(sizeFiled);
  72.  
  73. //将文档存入文档集合中
  74. docList.add(doc);
  75. }
  76.  
  77. //创建分词器,StandardAnalyzer标准分词器,标准分词器对英文分词效果很好,对中文是单字分词
  78. Analyzer analyzer = new IKAnalyzer();
  79. //指定索引和文档存储的目录
  80. Directory directory = FSDirectory.open(new File("E:\\dic"));
  81. //创建写对象的初始化对象
  82. IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
  83. //创建索引和文档写对象
  84. IndexWriter indexWriter = new IndexWriter(directory, config);
  85.  
  86. //将文档加入到索引和文档的写对象中
  87. for(Document doc : docList){
  88. indexWriter.addDocument(doc);
  89. }
  90. //提交
  91. indexWriter.commit();
  92. //关闭流
  93. indexWriter.close();
  94. }
  95.  
  96. /*
  97. * testIndexDel();删除所有和根据词源进行删除。
  98. */
  99. @Test
  100. public void testIndexDel() throws Exception{
  101. //创建分词器,StandardAnalyzer标准分词器,标准分词器对英文分词效果很好,对中文是单字分词
  102. Analyzer analyzer = new IKAnalyzer();
  103. //指定索引和文档存储的目录
  104. Directory directory = FSDirectory.open(new File("E:\\dic"));
  105. //创建写对象的初始化对象
  106. IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
  107. //创建索引和文档写对象
  108. IndexWriter indexWriter = new IndexWriter(directory, config);
  109.  
  110. //删除所有
  111. //indexWriter.deleteAll();
  112.  
  113. //根据名称进行删除
  114. //Term词元,就是一个词, 第一个参数:域名, 第二个参数:要删除含有此关键词的数据
  115. indexWriter.deleteDocuments(new Term("fileName", "apache"));
  116.  
  117. //提交
  118. indexWriter.commit();
  119. //关闭
  120. indexWriter.close();
  121. }
  122.  
  123. /**
  124. * testIndexUpdate();更新:
  125. * 更新就是按照传入的Term进行搜索,如果找到结果那么删除,将更新的内容重新生成一个Document对象
  126. * 如果没有搜索到结果,那么将更新的内容直接添加一个新的Document对象
  127. * @throws Exception
  128. */
  129. @Test
  130. public void testIndexUpdate() throws Exception{
  131. //创建分词器,StandardAnalyzer标准分词器,标准分词器对英文分词效果很好,对中文是单字分词
  132. Analyzer analyzer = new IKAnalyzer();
  133. //指定索引和文档存储的目录
  134. Directory directory = FSDirectory.open(new File("E:\\dic"));
  135. //创建写对象的初始化对象
  136. IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
  137. //创建索引和文档写对象
  138. IndexWriter indexWriter = new IndexWriter(directory, config);
  139.  
  140. //根据文件名称进行更新
  141. Term term = new Term("fileName", "web");
  142. //更新的对象
  143. Document doc = new Document();
  144. doc.add(new TextField("fileName", "xxxxxx", Store.YES));
  145. doc.add(new TextField("fileContext", "think in java xxxxxxx", Store.NO));
  146. doc.add(new LongField("fileSize", 100L, Store.YES));
  147.  
  148. //更新
  149. indexWriter.updateDocument(term, doc);
  150.  
  151. //提交
  152. indexWriter.commit();
  153. //关闭
  154. indexWriter.close();
  155. }
  156. }

2:新建   IndexSearchTest 类,主要用于搜索索引:

  1. package com.dengwei.lucene;
  2.  
  3. import java.io.File;
  4.  
  5. import org.apache.lucene.analysis.Analyzer;
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  7. import org.apache.lucene.document.Document;
  8. import org.apache.lucene.index.IndexReader;
  9. import org.apache.lucene.index.Term;
  10. import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
  11. import org.apache.lucene.queryparser.classic.QueryParser;
  12. import org.apache.lucene.search.BooleanClause.Occur;
  13. import org.apache.lucene.search.BooleanQuery;
  14. import org.apache.lucene.search.IndexSearcher;
  15. import org.apache.lucene.search.MatchAllDocsQuery;
  16. import org.apache.lucene.search.NumericRangeQuery;
  17. import org.apache.lucene.search.Query;
  18. import org.apache.lucene.search.ScoreDoc;
  19. import org.apache.lucene.search.TermQuery;
  20. import org.apache.lucene.search.TopDocs;
  21. import org.apache.lucene.store.Directory;
  22. import org.apache.lucene.store.FSDirectory;
  23. import org.junit.Test;
  24. import org.wltea.analyzer.lucene.IKAnalyzer;
  25.  
  26. public class IndexSearchTest {
  27. /*
  28. *testIndexSearch()
  29. * 根据关键字搜索,并指定默认域
  30. */
  31. @Test
  32. public void testIndexSearch() throws Exception{
  33.  
  34. //创建分词器(创建索引和所有时所用的分词器必须一致)
  35. Analyzer analyzer = new IKAnalyzer();
  36. //创建查询对象,第一个参数:默认搜索域, 第二个参数:分词器
  37. //默认搜索域作用:如果搜索语法中指定域名从指定域中搜索,如果搜索时只写了查询关键字,则从默认搜索域中进行搜索
  38. QueryParser queryParser = new QueryParser("fileContext", analyzer);
  39. //查询语法=域名:搜索的关键字
  40. Query query = queryParser.parse("fileName:web");
  41.  
  42. //指定索引和文档的目录
  43. Directory dir = FSDirectory.open(new File("E:\\dic"));
  44. //索引和文档的读取对象
  45. IndexReader indexReader = IndexReader.open(dir);
  46. //创建索引的搜索对象
  47. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  48. //搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
  49. TopDocs topdocs = indexSearcher.search(query, 5);
  50. //一共搜索到多少条记录
  51. System.out.println("=====count=====" + topdocs.totalHits);
  52. //从搜索结果对象中获取结果集
  53. ScoreDoc[] scoreDocs = topdocs.scoreDocs;
  54.  
  55. for(ScoreDoc scoreDoc : scoreDocs){
  56. //获取docID
  57. int docID = scoreDoc.doc;
  58. //通过文档ID从硬盘中读取出对应的文档
  59. Document document = indexReader.document(docID);
  60. //get域名可以取出值 打印
  61. System.out.println("fileName:" + document.get("fileName"));
  62. System.out.println("fileSize:" + document.get("fileSize"));
  63. System.out.println("============================================================");
  64. }
  65.  
  66. }
  67.  
  68. /*
  69. *testIndexTermQuery()
  70. * 根据关键字进行搜索,需要指定域名,和上面的对比起来,更推荐
  71. * 使用上面的(可以指定默认域名的)
  72. */
  73.  
  74. @Test
  75. public void testIndexTermQuery() throws Exception{
  76. //创建分词器(创建索引和所有时所用的分词器必须一致)
  77. Analyzer analyzer = new IKAnalyzer();
  78. //创建词元:就是词,
  79. Term term = new Term("fileName", "apache");
  80. //使用TermQuery查询,根据term对象进行查询
  81. TermQuery termQuery = new TermQuery(term);
  82.  
  83. //指定索引和文档的目录
  84. Directory dir = FSDirectory.open(new File("E:\\dic"));
  85. //索引和文档的读取对象
  86. IndexReader indexReader = IndexReader.open(dir);
  87. //创建索引的搜索对象
  88. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  89. //搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
  90. TopDocs topdocs = indexSearcher.search(termQuery, 5);
  91. //一共搜索到多少条记录
  92. System.out.println("=====count=====" + topdocs.totalHits);
  93. //从搜索结果对象中获取结果集
  94. ScoreDoc[] scoreDocs = topdocs.scoreDocs;
  95.  
  96. for(ScoreDoc scoreDoc : scoreDocs){
  97. //获取docID
  98. int docID = scoreDoc.doc;
  99. //通过文档ID从硬盘中读取出对应的文档
  100. Document document = indexReader.document(docID);
  101. //get域名可以取出值 打印
  102. System.out.println("fileName:" + document.get("fileName"));
  103. System.out.println("fileSize:" + document.get("fileSize"));
  104. System.out.println("============================================================");
  105. }
  106. }
  107.  
  108. /*
  109. *testNumericRangeQuery();
  110. * 用于搜索价格、大小等数值区间
  111. */
  112. @Test
  113. public void testNumericRangeQuery() throws Exception{
  114. //创建分词器(创建索引和所有时所用的分词器必须一致)
  115. Analyzer analyzer = new IKAnalyzer();
  116.  
  117. //根据数字范围查询
  118. //查询文件大小,大于100 小于1000的文章
  119. //第一个参数:域名 第二个参数:最小值, 第三个参数:最大值, 第四个参数:是否包含最小值, 第五个参数:是否包含最大值
  120. Query query = NumericRangeQuery.newLongRange("fileSize", 100L, 1000L, true, true);
  121.  
  122. //指定索引和文档的目录
  123. Directory dir = FSDirectory.open(new File("E:\\dic"));
  124. //索引和文档的读取对象
  125. IndexReader indexReader = IndexReader.open(dir);
  126. //创建索引的搜索对象
  127. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  128. //搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
  129. TopDocs topdocs = indexSearcher.search(query, 5);
  130. //一共搜索到多少条记录
  131. System.out.println("=====count=====" + topdocs.totalHits);
  132. //从搜索结果对象中获取结果集
  133. ScoreDoc[] scoreDocs = topdocs.scoreDocs;
  134.  
  135. for(ScoreDoc scoreDoc : scoreDocs){
  136. //获取docID
  137. int docID = scoreDoc.doc;
  138. //通过文档ID从硬盘中读取出对应的文档
  139. Document document = indexReader.document(docID);
  140. //get域名可以取出值 打印
  141. System.out.println("fileName:" + document.get("fileName"));
  142. System.out.println("fileSize:" + document.get("fileSize"));
  143. System.out.println("============================================================");
  144. }
  145. }
  146.  
  147. /*
  148. *testBooleanQuery();
  149. * 组合查询,可以根据多条件进行查询
  150. */
  151. @Test
  152. public void testBooleanQuery() throws Exception{
  153. //创建分词器(创建索引和所有时所用的分词器必须一致)
  154. Analyzer analyzer = new IKAnalyzer();
  155.  
  156. //布尔查询,就是可以根据多个条件组合进行查询
  157. //文件名称包含apache的,并且文件大小大于等于100 小于等于1000字节的文章
  158. BooleanQuery query = new BooleanQuery();
  159.  
  160. //根据数字范围查询
  161. //查询文件大小,大于100 小于1000的文章
  162. //第一个参数:域名 第二个参数:最小值, 第三个参数:最大值, 第四个参数:是否包含最小值, 第五个参数:是否包含最大值
  163. Query numericQuery = NumericRangeQuery.newLongRange("fileSize", 100L, 1000L, true, true);
  164.  
  165. //创建词元:就是词,
  166. Term term = new Term("fileName", "apache");
  167. //使用TermQuery查询,根据term对象进行查询
  168. TermQuery termQuery = new TermQuery(term);
  169.  
  170. //Occur是逻辑条件
  171. //must相当于and关键字,是并且的意思
  172. //should,相当于or关键字或者的意思
  173. //must_not相当于not关键字, 非的意思
  174. //注意:单独使用must_not 或者 独自使用must_not没有任何意义
  175. query.add(termQuery, Occur.MUST);
  176. query.add(numericQuery, Occur.MUST);
  177.  
  178. //指定索引和文档的目录
  179. Directory dir = FSDirectory.open(new File("E:\\dic"));
  180. //索引和文档的读取对象
  181. IndexReader indexReader = IndexReader.open(dir);
  182. //创建索引的搜索对象
  183. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  184. //搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
  185. TopDocs topdocs = indexSearcher.search(query, 5);
  186. //一共搜索到多少条记录
  187. System.out.println("=====count=====" + topdocs.totalHits);
  188. //从搜索结果对象中获取结果集
  189. ScoreDoc[] scoreDocs = topdocs.scoreDocs;
  190.  
  191. for(ScoreDoc scoreDoc : scoreDocs){
  192. //获取docID
  193. int docID = scoreDoc.doc;
  194. //通过文档ID从硬盘中读取出对应的文档
  195. Document document = indexReader.document(docID);
  196. //get域名可以取出值 打印
  197. System.out.println("fileName:" + document.get("fileName"));
  198. System.out.println("fileSize:" + document.get("fileSize"));
  199. System.out.println("============================================================");
  200. }
  201. }
  202.  
  203. /*
  204. *testMathAllQuery();
  205. * 查询所有:
  206. */
  207. @Test
  208. public void testMathAllQuery() throws Exception{
  209. //创建分词器(创建索引和所有时所用的分词器必须一致)
  210. Analyzer analyzer = new IKAnalyzer();
  211.  
  212. //查询所有文档
  213. MatchAllDocsQuery query = new MatchAllDocsQuery();
  214.  
  215. //指定索引和文档的目录
  216. Directory dir = FSDirectory.open(new File("E:\\dic"));
  217. //索引和文档的读取对象
  218. IndexReader indexReader = IndexReader.open(dir);
  219. //创建索引的搜索对象
  220. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  221. //搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
  222. TopDocs topdocs = indexSearcher.search(query, 5);
  223. //一共搜索到多少条记录
  224. System.out.println("=====count=====" + topdocs.totalHits);
  225. //从搜索结果对象中获取结果集
  226. ScoreDoc[] scoreDocs = topdocs.scoreDocs;
  227.  
  228. for(ScoreDoc scoreDoc : scoreDocs){
  229. //获取docID
  230. int docID = scoreDoc.doc;
  231. //通过文档ID从硬盘中读取出对应的文档
  232. Document document = indexReader.document(docID);
  233. //get域名可以取出值 打印
  234. System.out.println("fileName:" + document.get("fileName"));
  235. System.out.println("fileSize:" + document.get("fileSize"));
  236. System.out.println("============================================================");
  237. }
  238. }
  239.  
  240. /*
  241. *testMultiFieldQueryParser();
  242. * 从多个域中进行查询
  243. */
  244. @Test
  245. public void testMultiFieldQueryParser() throws Exception{
  246. //创建分词器(创建索引和所有时所用的分词器必须一致)
  247. Analyzer analyzer = new IKAnalyzer();
  248.  
  249. String [] fields = {"fileName","fileContext"};
  250. //从文件名称和文件内容中查询,只有含有apache的就查出来
  251. MultiFieldQueryParser multiQuery = new MultiFieldQueryParser(fields, analyzer);
  252. //输入需要搜索的关键字
  253. Query query = multiQuery.parse("apache");
  254.  
  255. //指定索引和文档的目录
  256. Directory dir = FSDirectory.open(new File("E:\\dic"));
  257. //索引和文档的读取对象
  258. IndexReader indexReader = IndexReader.open(dir);
  259. //创建索引的搜索对象
  260. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  261. //搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
  262. TopDocs topdocs = indexSearcher.search(query, 5);
  263. //一共搜索到多少条记录
  264. System.out.println("=====count=====" + topdocs.totalHits);
  265. //从搜索结果对象中获取结果集
  266. ScoreDoc[] scoreDocs = topdocs.scoreDocs;
  267.  
  268. for(ScoreDoc scoreDoc : scoreDocs){
  269. //获取docID
  270. int docID = scoreDoc.doc;
  271. //通过文档ID从硬盘中读取出对应的文档
  272. Document document = indexReader.document(docID);
  273. //get域名可以取出值 打印
  274. System.out.println("fileName:" + document.get("fileName"));
  275. System.out.println("fileSize:" + document.get("fileSize"));
  276. System.out.println("============================================================");
  277. }
  278. }
  279. }

lucene相关的更多相关文章

  1. Lucene 基础理论 (zhuan)

    http://www.blogjava.net/hoojo/archive/2012/09/06/387140.html**************************************** ...

  2. Lucene全文检索技术

    Lucene全文检索技术 今日大纲 ●    搜索的概念.搜索引擎原理.倒排索引 ●    全文索引的概念 ●    使用Lucene对索引进行CRUD操作 ●    Lucene常用API详解 ●  ...

  3. lucene 核心概念及入门

    lucene Lucene介绍及核心概念 什么是Lucene Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程序接口 ...

  4. lucene教程【转】【补】

    现实流程 lucene 相关jar包 第一个:Lucene-core-4.0.0.jar, 其中包括了常用的文档,索引,搜索,存储等相关核心代码. 第二个:Lucene-analyzers-commo ...

  5. Lucene 3.0 输出相似度

    http://www.cnblogs.com/ibook360/archive/2011/10/19/2217638.html Lucene3.0之结果排序(原理篇) 传统上,人们将信息检索系统返回结 ...

  6. lucene 学习之编码篇

    本文环境:lucene5.2     JDK1.7   IKAnalyzer 引入lucene相关包 <!-- lucene核心包 --> <dependency> <g ...

  7. lucene构建restful风格的简单搜索引擎服务

    来自于本人博客: lucene构建restful风格的简单搜索引擎服务 本人的博客如今也要改成使用lucene进行全文检索的功能,因此在这里把代码贴出来与大家分享 一,文件夹结构: 二,配置文件: 总 ...

  8. springboot+lucene实现公众号关键词回复智能问答

    一.场景简介 最近在做公众号关键词回复方面的智能问答相关功能,发现用户输入提问内容和我们运营配置的关键词匹配回复率极低,原因是我们采用的是数据库的Like匹配. 这种模糊匹配首先不是很智能,而且也没有 ...

  9. Lucene入门+实现

    Lucene简介详情见:(https://blog.csdn.net/Regan_Hoo/article/details/78802897) lucene实现原理 其实网上很多资料表明了,lucene ...

随机推荐

  1. 实验六 MapReduce实验:二次排序

    实验指导: 6.1 实验目的基于MapReduce思想,编写SecondarySort程序. 6.2 实验要求要能理解MapReduce编程思想,会编写MapReduce版本二次排序程序,然后将其执行 ...

  2. nfs的配置文件/etc/exports

    /etc/exports  文件格式 <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)] a. 输出目录:输出目录是指NFS系统中 ...

  3. Codeforces | CF1041F 【Ray in the tube】

    昨天晚上全机房集体开\(Div2\),因为人傻挂两次\(B\)题的我开场就\(rank2000+\dots qwq\)于是慌乱之中的我就开始胡乱看题(口胡),于是看了\(F\dots\)(全机房似乎也 ...

  4. Centos 6.x/7.x yum安装php5.6.X

    鉴于Centos 默认yum源的php版本太低了,手动编译安装又有点一些麻烦,那么如何采用Yum安装的方案安装最新版呢.那么,今天我们就来学习下如何用yum安装php最新版. 1.检查当前安装的PHP ...

  5. 如何刻录cd音乐

    用nero,选择cd,音乐光盘(第一个)可以添加入wav,MP3等.刻录即可.

  6. PHP 生成水印图片

    这段时间因工作需要,学习了下用PHP来给背景图上添加公司logo,宣传语之类的图片合并功能.话不多说,直接上代码. <?php public function getImage() { $dat ...

  7. javascript学习一、js的初步了解

    1.javascript的简介: *javascript 是一种基于对象和事件驱动的语言,主要应用于客户端. -- 基于对象:  ** 提供了很多对象,可以直接使用. --事件驱动: ** html做 ...

  8. js弹出层

    js弹出层 1.div附近显示 <div id="message"></div> $().delay().hide(); 2.遮罩层 表单提交后遮住页面,等 ...

  9. rm刷机 root

    http://www.miui.com/download-290.html http://www.miui.com/shuaji-329.html    小米稳定版 不可以root 只有升级到上面的开 ...

  10. webDriver文档阅读笔记

    一些雷 浏览器版本和对应的Driver的版本是一一对应的,有时候跑不起来,主要是因为driver和浏览器版本对不上. e.g: chrome和driver版本映射表:https://blog.csdn ...