Lucene詳解

一.lucene原理

??? Lucene 是apache軟件基金會一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。它不是一個完整的搜索應用程序,而是為你的應用程序提供索引和搜索功能。lucene 能夠為文本類型的數據建立索引,所以你只要能把你要索引的數據格式轉化的文本的,Lucene 就能對你的文檔進行索引和搜索。比如你要對一些 HTML 文檔,PDF 文檔進行索引的話你就首先需要把 HTML 文檔和 PDF 文檔轉化成文本格式的,然后將轉化后的內容交給 Lucene 進行索引,然后把創建好的索引文件保存到磁盤或者內存中,最后根據用戶輸入的查詢條件在索引文件上進行查詢。

搜索應用程序和 Lucene?之間的關系,也反映了利用 Lucene 構建搜索應用程序的流程:

二. 索引和搜索

?? 索引是現代搜索引擎的核心,建立索引的過程就是把源數據處理成非常方便查詢的索引文件的過程。為什么索引這么重要呢,試想你現在要在大量的文檔中搜索含有某個關鍵詞的文檔,那么如果不建立索引的話你就需要把這些文檔順序的讀入內存,然后檢查這個文章中是不是含有要查找的關鍵詞,這樣的話就會耗費非常多的時間,想想搜索引擎可是在毫秒級的時間內查找出要搜索的結果的。這就是由于建立了索引的原因,你可以把索引想象成這樣一種數據結構,他能夠使你快速的隨機訪問存儲在索引中的關鍵詞,進而找到該關鍵詞所關聯的文檔。Lucene?采用的是一種稱為反向索引(inverted index)的機制。反向索引就是說我們維護了一個詞 / 短語表,對于這個表中的每個詞 / 短語,都有一個鏈表描述了有哪些文檔包含了這個詞 / 短語。這樣在用戶輸入查詢條件的時候,就能非常快的得到搜索結果。搜索引擎首先會對搜索的關鍵詞進行解析,然后再在建立好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。對于中文用戶來說,最關心的問題是其是否支持中文的全文檢索。由于Lucene良好架構設計,對中文的支持只需對其語言詞法分析接口進行擴展就能實現對中文檢索的支持。

三. 索引步驟

  1. 獲取內容:?Lucene本身沒有提供獲取內容的工具或者組件,內容是要開發者自己提供相應的程序。這一步包括使用網絡爬蟲或蜘蛛程序來搜索和界定需要索引的內容。當然,數據來源可能包括數據庫、分布式文件系統、本地xml等等。lucene作為一款核心搜索庫,不提供任何功能來實現內容獲取。目前有大量的開源爬蟲軟件可以實現這個功能,例如:Solr,lucene的子項;Nutch,apache項目,包含大規模的爬蟲工具,抓取和分辨web站點數據;Grub,比較流行的開源web爬蟲工具;Heritrix,一款開源的Internet文檔搜索程序;Aperture,支持從web站點、文件系統和郵箱中抓取,并解析和索引其中的文本數據。
  2. 建立文檔:獲取原始內容后,需要對這些內容進行索引,必須將這些內容轉換成部件(文檔)。文檔主要包括幾個帶值的域,比如標題,正文,摘要,作者和鏈接。如果文檔和域比較重要的話,還可以添加權值。設計完方案后,需要將原始內容中的文本提取出來寫入各個文檔,這一步可以使用文檔過濾器,開源項目如Tika,實現很好的文檔過濾。如果要獲取的原始內容存儲于數據庫中,有一些項目通過無縫鏈接內容獲取步驟和文檔建立步驟就能輕易地對數據庫表進行航所以操作和搜索操作,例如DBSight,Hibernate Search,LuSQL,Compass和Oracle/Lucene集成項目。
  3. 文檔分析:?搜索引擎不能直接對文本進行索引:必須將文本分割成一系列被稱為語匯單元的獨立的原子元素。每一個語匯單元能大致與語言中的“單詞”對應起來,這個步驟決定文檔中的文本域如何分割成語匯單元系列。lucene提供了大量內嵌的分析器可以輕松控制這步操作。
  4. 文檔索引:?將文檔加入到索引列表中。Lucene在這一步驟中提供了強檔的API,只需簡單調用提供的幾個方法就可以實現出文檔索引的建立。為了提供好的用戶體驗,索引是必須要處理好的一環:在設計和定制索引程序時必須圍繞如何提高用戶的搜索體驗來進行。

四. 搜索組件

? 搜索組件即為輸入搜索短語,然后進行分詞,然從索引中查找單詞,從而找到包含該單詞的文檔。搜索質量由查準率和查全率來衡量。搜索組件主要包括以下內容:

  1. 用戶搜索界面:主要是和用戶進行交互的頁面,也就是呈現在瀏覽器中能看到的東西,這里主要考慮的就是頁面UI設計了。一個良好的UI設計是吸引用戶的重要組成部分。
  2. 建立查詢:建立查詢主要是指用戶輸入所要查詢的短語,以普通HTML表單或者ajax的方式提交到后臺服務器端。然后把詞語傳遞給后臺搜索引擎。這就是一個簡單建立查詢的過程。
  3. 搜索查詢:即為查詢檢索索引然后返回與查詢詞語匹配的文檔。然后把返回來的結構按照查詢請求來排序。搜索查詢組件覆蓋了搜索引擎中大部分的復雜內容。
  4. 展現結果:所謂展現結果,和第一個搜索界面類似。都是一個與用戶交互的前端展示頁面,作為一個搜索引擎,用戶體驗永遠是第一位。其中前端展示在用戶體現上占據了重要地位。

五. 官網實例解析

Lucene的使用主要體現在兩個步驟:

  1. 創建索引,通過IndexWriter對不同的文件進行索引的創建,并將其保存在索引相關文件存儲的位置中。
  2. 通過索引查尋關鍵字相關文檔。

下面針對官網上面給出的一個例子,進行分析:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);// Store the index in memory:Directory directory = new RAMDirectory();// To store an index on disk, use this instead://Directory directory = FSDirectory.open("/tmp/testindex");IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);IndexWriter iwriter = new IndexWriter(directory, config);Document doc = new Document();String text = "This is the text to be indexed.";doc.add(new Field("fieldname", text, TextField.TYPE_STORED));iwriter.addDocument(doc);iwriter.close();// Now search the index:DirectoryReader ireader = DirectoryReader.open(directory);IndexSearcher isearcher = new IndexSearcher(ireader);// Parse a simple query that searches for "text":QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);Query query = parser.parse("text");ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;assertEquals(1, hits.length);// Iterate through the results:for (int i = 0; i < hits.length; i++) {Document hitDoc = isearcher.doc(hits[i].doc);assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));}ireader.close();directory.close();

索引的創建

  首先,我們需要定義一個詞法分析器。

  比如一句話,“我愛我們的中國!”,如何對他拆分,扣掉停頓詞“的”,提取關鍵字“我”“我們”“中國”等等。這就要借助的詞法分析器Analyzer來實現。這里面使用的是標準的詞法分析器,如果專門針對漢語,還可以搭配paoding,進行使用。

1 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

  參數中的Version.LUCENE_CURRENT,代表使用當前的Lucene版本,本文環境中也可以寫成Version.LUCENE_40。

  第二步,確定索引文件存儲的位置,Lucene提供給我們兩種方式:

  1 本地文件存儲?

Directory directory = FSDirectory.open("/tmp/testindex");

  2 內存存儲

Directory directory = new RAMDirectory();

  可以根據自己的需要進行設定。

  第三步,創建IndexWriter,進行索引文件的寫入。

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
IndexWriter iwriter = new IndexWriter(directory, config);

  這里的IndexWriterConfig,據官方文檔介紹,是對indexWriter的配置,其中包含了兩個參數,第一個是目前的版本,第二個是詞法分析器Analyzer。 

  第四步,內容提取,進行索引的存儲。

Document doc = new Document();
String text = "This is the text to be indexed.";
doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
iwriter.addDocument(doc);
iwriter.close();

  第一行,申請了一個document對象,這個類似于數據庫中的表中的一行。

  第二行,是我們即將索引的字符串。

  第三行,把字符串存儲起來(因為設置了TextField.TYPE_STORED,如果不想存儲,可以使用其他參數,詳情參考官方文檔),并存儲“表明”為"fieldname".

  第四行,把doc對象加入到索引創建中。

  第五行,關閉IndexWriter,提交創建內容。

  這就是索引創建的過程。

關鍵字查詢:

  第一步,打開存儲位置

DirectoryReader ireader = DirectoryReader.open(directory);

  第二步,創建搜索器

IndexSearcher isearcher = new IndexSearcher(ireader);

  第三步,類似SQL,進行關鍵字查詢

復制代碼
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);
Query query = parser.parse("text");
ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
assertEquals(1, hits.length);
for (int i = 0; i < hits.length; i++) {Document hitDoc = isearcher.doc(hits[i].doc);assertEquals("This is the text to be indexed.",hitDoc.get("fieldname"));
}
復制代碼

  這里,我們創建了一個查詢器,并設置其詞法分析器,以及查詢的“表名“為”fieldname“。查詢結果會返回一個集合,類似SQL的ResultSet,我們可以提取其中存儲的內容。

  關于各種不同的查詢方式,可以參考官方手冊,或者推薦的PPT

  第四步,關閉查詢器等。

ireader.close();
directory.close();

自己實現的一個小實例:對一個文件夾內的內容進行索引的創建,并根據關鍵字篩選文件,并讀取其中的內容

?

package cn.lnu.edu.yxk;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
/*** 對一個文件夾內的內容進行索引的創建,并根據關鍵字篩選文件,讀取其中的內容。* @author yxk**/
public class IndexManager {private static String content = "";//文件里面的內容private static String INDEX_DIR = "D:\\test\\luceneIndex";//索引創建的存儲目錄private static String DATA_DIR = "D:\\test\\luceneData";//文件夾的目錄private static Analyzer analyzer = null;//詞法分析器private static Directory directory = null;//索引文件存儲的位置private static IndexWriter indexWriter = null;//創建索引器,索引文件的寫入/*** 創建當前文件目錄的索引* @param path當前目錄的文件* @return 返回是否創建成功*/public static Boolean createIndex(String path) {Date date1 = new Date();//創建需要的時間List<File> files = listFile(path);// 獲取指定目錄下得所有符合條件的文件// 獲取文件的內容for (File file : files) {content = "";//通過文件類型獲取文件的內容String type = file.getName().substring(file.getName().lastIndexOf(".") + 1);if ("txt".equalsIgnoreCase(type)) {content += txt2String(file);} else if ("doc".equalsIgnoreCase(type)) {content += doc2String(file);} else if ("xls".equalsIgnoreCase(type)) {content += xls2String(file);}System.out.println("name"+file.getName());System.out.println("path"+file.getPath());//System.out.println(file.getName().getBytes().toString());System.out.println();try {analyzer = new StandardAnalyzer();//詞法分析器directory = FSDirectory.open(new File(INDEX_DIR).toPath());//索引創建存儲的位置// System.out.println("ssss"// + new File(INDEX_DIR).toPath().toString());//自動創建索引目錄File indexFile = new File(INDEX_DIR);if (!indexFile.exists()) {indexFile.mkdirs();}//索引文件的寫入IndexWriterConfig config = new IndexWriterConfig(analyzer);indexWriter = new IndexWriter(directory, config);/** 內容提取,進行索引的存儲*///申請了一個document對象,這個類似于數據庫中的表中的一行。Document document = new Document();//把字符串存儲起來(因為設置了TextField.TYPE_STORED,如果不想存儲,可以使用其他參數,詳情參考官方文檔),并存儲“表明”為"fieldname".document.add(new org.apache.lucene.document.TextField("filename", file.getName(), Field.Store.YES));//文件名索引創建document.add(new org.apache.lucene.document.TextField("content", content, Field.Store.YES));//文件內容索引創建document.add(new org.apache.lucene.document.TextField("path",file.getPath(), Field.Store.YES));//文件路徑索引的創建//把document對象加入到索引創建中indexWriter.addDocument(document);//關閉IndexWriter,提交創建內容。indexWriter.commit();closeWriter();} catch (IOException e) {e.printStackTrace();}content = "";}Date date2 = new Date();System.out.println("創建索引-----耗時:" + (date2.getTime() - date1.getTime())+ "ms\n");return true;}/*** 查詢索引,返回符合條件的文件* * @param 查詢的字符串* @return 符合條件的結果* @throws IOException*/public static void serarchIndex(String text) {Date date1 = new Date();try {//打開存儲位置directory = FSDirectory.open(new File(INDEX_DIR).toPath());analyzer = new StandardAnalyzer();DirectoryReader ireader = DirectoryReader.open(directory);//創建搜索器IndexSearcher isearcher = new IndexSearcher(ireader);/** 類似SQL,進行關鍵字查詢*/QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse(text);//創建了一個查詢器,并設置其詞法分析器,以及查詢的“表名“為”fieldname“。查詢結果會返回一個集合,類似SQL的ResultSet,我們可以提取其中存儲的內容。ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;for (int i = 0; i < hits.length; i++) {Document hitDoc = isearcher.doc(hits[i].doc);System.out.println("-----------");System.out.println(hitDoc.get("filename"));System.out.println(hitDoc.get("content"));System.out.println(hitDoc.get("path"));System.out.println("------------");}//關閉查詢器ireader.close();directory.close();} catch (IOException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}Date date2 = new Date();System.out.println("關鍵字查詢-----耗時:" + (date2.getTime() - date1.getTime())+ "ms\n");}/*** * @throws IOException*/private static void closeWriter() throws IOException {if (indexWriter != null)indexWriter.close();}/*** 讀取xls文件內容,引入jxl.jar類型的包* @param file* @return 返回內容*/private static String xls2String(File file) {String result = "";try {FileInputStream fis = new FileInputStream(file);StringBuilder sb = new StringBuilder();jxl.Workbook rwb = Workbook.getWorkbook(fis);Sheet[] sheet = rwb.getSheets();for (int i = 0; i < sheet.length; i++) {Sheet rs = rwb.getSheet(i);for (int j = 0; i < rs.getRows(); j++) {Cell[] cells = rs.getRow(j);for (int k = 0; k < cells.length; k++) {sb.append(cells[k].getContents());}}}fis.close();result += sb.toString();} catch (FileNotFoundException e) {e.printStackTrace();} catch (BiffException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}/*** 讀取doc類型文件的內容,通過poi.jar* @param file的類型* @return 返回文件的內容*/private static String doc2String(File file) {String result = "";try {FileInputStream fis = new FileInputStream(file);//文件輸入流HWPFDocument document = new HWPFDocument(fis);Range range = document.getRange();result += range.text();fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}/*** 讀取txt文件的內容* * @param file想要讀取的文件類型* @return 返回文件內容*/private static String txt2String(File file) {String result = "";try {BufferedReader reader = new BufferedReader(new FileReader(file));String s = "";while ((s = reader.readLine()) != null) {result += result + "\n" + s;}reader.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}/*** 過濾當前目錄下得文件* @param path 當前目錄下得文件* @return 返回符合條件的文件*/private static List<File> listFile(String path) {File[] files = new File(path).listFiles();List<File> fileList = new ArrayList<File>();for (File file : files) {if (isTxtFile(file.getName())) {fileList.add(file);}}return fileList;}/*** 判斷是否為目標文件,支持的格式為.txt,.doc,.xls文件格式 如果是文件類型滿足過濾條件,返回true;否則返回false* @param name 根據文件名的后綴* @return 是否符合格式規范*/private static boolean isTxtFile(String name) {if (name.lastIndexOf(".txt") > 0)return true;else if (name.lastIndexOf(".doc") > 0)return true;else if (name.lastIndexOf(".xls") > 0)return true;return false;}public static void main(String[] args) {//創建索引目錄,運行一次,重新創建一次File fileIndex = new File(INDEX_DIR);if (deleteIndex(fileIndex)) {fileIndex.mkdir();} else {fileIndex.mkdir();}//創建索引文件createIndex(DATA_DIR);//通過關鍵字查詢serarchIndex("中華");}/*** 刪除文件目錄下得所有文件* * @param fileIndex 當前索引目錄下得文件* @return 返回是否刪除重新創建*/private static boolean deleteIndex(File fileIndex) {if (fileIndex.isDirectory()) {File[] files = fileIndex.listFiles();for (int i = 0; i < files.length; i++) {deleteIndex(files[i]);}}fileIndex.delete();return true;}}
通過對幾位博文的分析進行總結;

原文博客出自:http://blog.csdn.net/csh624366188/article/category/895342

和https://www.cnblogs.com/xing901022/p/3933675.html


---------------------
作者:jofjhh
來源:CSDN
原文:https://blog.csdn.net/m0_37913549/article/details/78989078
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET 6.0中使用Identity框架實現JWT身份認證與授權

原文作者&#xff1a;Sarathlal Saseendran原文鏈接&#xff1a;https://www.c-sharpcorner.com/article/jwt-authentication-and-authorization-in-net-6-0-with-identity-framework/翻譯&#xff1a;沙漠盡頭的狼&#xff08;谷歌翻譯加持&#xff09;介紹微軟于 2021 年 11 …

adb devices 里面有很多 emulator-XXXX的解決方法

2019獨角獸企業重金招聘Python工程師標準>>> adb kill-server 轉載于:https://my.oschina.net/sfshine/blog/700354

MQ(Message Queue)簡介

一、何為MQ&#xff1f; MQ全稱為Message Queue, 消息隊列&#xff08;MQ&#xff09;是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息&#xff08;針對應用程序的數據&#xff09;來通信&#xff0c;而無需專用連接來鏈接它們。消息傳遞指的是程序之間通…

【GlobalMapper精品教程】015:矢量面圖層的創建及數字化操作

本文講解在Globalmapper中文23.0中創建矢量面狀數據(政區數據),并進行面狀數據采集及編輯的詳細操作流程,數據為配套案例數據包中的data015.rar。 參考閱讀: ArcGIS實驗教程——實驗三:矢量數據采集與編輯(矢量化) 文章目錄 一、認識工具條1. 數字化(創建)工具條2. 選…

Blazor University (39)JavaScript 互操作 —— 更新 document title

原文鏈接&#xff1a;https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/updating-the-document-title/更新 document title源代碼[1]在創建 Blazor 布局[2]部分中&#xff0c;我們看到了 Blazor 應用程序如何存在于 HTML&#xff08;或 cshtm…

IIS 日志文件位置

IIS 6 Log files location IIS 6中日志文件的位置%windir%\System32\LogFilesIIS 7 Log files location IIS的日志文件的位置%SystemDrive%\inetpub\logs\LogFiles用戶每打開一次網頁&#xff0c;iis 都會記錄用戶IP、訪問的網頁地址、訪問時間、訪問狀態等信息&#xff0c;這些…

APP測試流程和測試點

1 APP測試基本流程 1.1流程圖 1.2測試周期 測試周期可按項目的開發周期來確定測試時間&#xff0c;一般測試時間為兩三周&#xff08;即15個工作日&#xff09;&#xff0c;根據項目情況以及版本質量可適當縮短或延長測試時間。正式測試前先向主管確認項目排期。 1.3測試資源 測…

39所強基計劃試點高校已全部公布招生簡章

截至目前(4月8日下午) 39所強基計劃試點高校 已全部公布招生簡章 各高校招生要求是什么&#xff1f; 招生專業有哪些&#xff1f; 什么時候報名&#xff1f; 一起來看 北京大學 招生對象及報名條件 各省&#xff08;區、市&#xff09;符合2022年全國普通高等學校招生統…

【ArcGIS錯誤異常100問】之001:License服務無法啟動權威解決辦法

測試環境&#xff1a; 操作系統&#xff1a;Windows10ArcGIS版本&#xff1a;10.X結果&#xff1a;通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法3.1 關閉Windows Defender3.2 關閉系統防火墻3.3 刪除邁克菲&#xff08;McAfee&#xff09;殺毒軟件3.4 在系統服務中啟動…

Appium wait等待的三種方法

1、sleep()方法Thread.sleep&#xff08;60000&#xff09;強制等待60s2、隱式等待implicitlyWait()driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);全局等待30s不管元素是否已經加載1) 當使用了隱式等待執行測試的時候&#xff0c;如果WebDriver沒有在DOM中…

ASP.NET Core 技術內幕與項目實戰讀后感

前幾天拿到了楊中科老師的新書《ASP.NET Core 技術內幕與項目實戰》&#xff0c;迫不及待的“兩”口氣讀完了。用一句話來總結&#xff0c;這是一本寫給.NET開發者的非常實用的接地氣的好書&#xff0c;感覺有必要自發為這本書宣傳一波。楊老師在 .NET 開發者社區中的知名度非常…

avalon2學習教程15指令總結

avalon的指令在上一節已經全部介紹完畢&#xff0c;當然有的語焉不詳&#xff0c;如ms-js。本節主要總結我對這方面的思考與探索。 MVVM的成功很大一語分是來自于其指令&#xff0c;或叫綁定。讓操作視圖的功能交由形形式式的指令來代勞。VM&#xff0c;成了一個大管家。它只一…

【ArcGIS錯誤異常100問】之002:Error 000735 簡化容差:值是必需的(簡化線、簡化面工具)

測試環境&#xff1a; 操作系統&#xff1a;windows7ArcGIS版本&#xff1a;10.2結果&#xff1a;通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法4. 問題驗證1. 錯誤提示 在ArcGIS中使用簡化面或者簡化線工具時&#xff0c;點擊確定會提示Error 000735&#xff1a;簡化容…

mybatis中mysql轉義講解

本文為博主原創&#xff0c;未經允許不得轉載&#xff1a; 在mybatis中寫sql的時候&#xff0c;遇到特殊字符在加載解析的時候&#xff0c;會進行轉義&#xff0c;所以在mybatis中 寫sql語句的時候&#xff0c;遇到特殊字符進行轉義處理。 需要注意的是&#xff0c;轉義的字符為…

用Python執行js文件代碼并獲取返回結果

js代碼&#xff08;myjs.js&#xff09;&#xff1a; /** Title: This is a file for ……* Author: JackieZheng* Date: 2022-04-12 09:24:13* LastEditTime: 2022-04-12 09:40:55* LastEditors: Please set LastEditors* Description:* FilePath: myjs.js*/function hello(…

.NET桌面開發的一些思考

在22日&#xff0c;我在公眾號上發布了一條短文字&#xff0c;內容如下&#xff1a;其實在.NET開發大軍中&#xff0c;還有一股力量&#xff0c;那就是桌面程序的開發者們。他們很少發聲&#xff0c;可能技術成熟&#xff0c;可能太企業化了&#xff0c;也可能我沒關注到。最近…

【ArcGIS錯誤異常100問】之003:屬性表中文亂碼解決辦法總結

測試環境&#xff1a; 操作系統&#xff1a;windows7ArcGIS版本&#xff1a;10.X、Pro結果&#xff1a;通過測試 文章目錄1. 錯誤提示2. 原因分析3. 解決方法4. 問題驗證1. 錯誤提示 如圖所示&#xff0c;安裝完ArcGIS Pro后&#xff0c;由于計算機系統和應用軟件字符編碼的問…

大型網站架構演化(二)——應用服務和數據服務分離

隨著網站業務的發展&#xff0c;一臺服務器逐漸不能滿足需求&#xff1a;越來越多的用戶訪問導致性能越來越差&#xff0c;越來越多的數據導致存儲空間不足。這時就需要將應用和數據分離。應用和數據分離后整個網站使用三臺服務器&#xff1a;應用服務器、文件服務器和數據庫服…

再不自動化就晚啦!優云教你4步打造基于CentOS的產品鏡像

隨著Linux程序的增多&#xff0c;軟件的安裝過程中經常出現如下問題&#xff1a; 1、硬件配置類似或者相同時&#xff0c;批量安裝系統和軟件&#xff0c;希望實現自動化安裝&#xff0c;減少安裝時間和人為出錯。 2、工程實施人員在不同客戶現場進行系統和軟件安裝(硬件配置不…

【ArcGIS錯誤異常100問】之004:ArcGIS表轉Excel超了65535限制解決辦法

測試環境&#xff1a; 操作系統&#xff1a;windows7ArcGIS版本&#xff1a;10.2 文章目錄1. 錯誤提示2. 原因分析3. 解決方法1. 錯誤提示 如下圖&#xff0c;當矢量shp圖斑數目過多&#xff0c;文件超過了65535條記錄時&#xff0c;利用ArcGIS的表轉Excel工具處理成Excel文件…