北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序

本文主要是介绍北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有前面注释我们可以知道查询关键字和字典文件准备好好后,将进入用户关键字分词阶段

//TSESearch.cpp中:

view plain copy to clipboard print ?
  1. CHzSeg iHzSeg;      //include ChSeg/HzSeg.h   
  2.   
  3. //   
  4. iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);  //将get到的查询变量分词分成 "我/        爱/      你们/ 的/      格式"   
  5.   
  6. vector<STRING></STRING> vecTerm;   
  7. iQuery.ParseQuery(vecTerm);     //将以"/"划分开的关键字一一顺序放入一个向量容器中   
  8.   
  9. set<STRING></STRING> setRelevantRst;    
  10. iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst);    
  11.   
  12. gettimeofday(&end_tv,&tz);   
  13. // search end   
  14. //搜索完毕  
	CHzSeg iHzSeg;		//include ChSeg/HzSeg.h
//
iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);	//将get到的查询变量分词分成 "我/		爱/		你们/	的/		格式"
vector vecTerm;
iQuery.ParseQuery(vecTerm);		//将以"/"划分开的关键字一一顺序放入一个向量容器中
set setRelevantRst; 
iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst); 
gettimeofday(&end_tv,&tz);
// search end
//搜索完毕
view plain copy to clipboard print ?
  1. 看CHzSeg 中的这个方法  
看CHzSeg 中的这个方法
view plain copy to clipboard print ?
  1. //ChSeg/HzSeg.h  
//ChSeg/HzSeg.h
view plain copy to clipboard print ?
  1. /**   
  2.  * 程序翻译说明   
  3.  * 进一步净化数据,转换汉字   
  4.  * @access  public   
  5.  * @param   CDict, string 参数的汉字说明:字典,查询字符串   
  6.  * @return  string 0   
  7.  */   
  8. // process a sentence before segmentation   
  9. //在分词前处理句子   
  10. string CHzSeg::SegmentSentenceMM (CDict &dict, string s1) const   
  11. {   
  12.     string s2="";   
  13.     unsigned int i,len;   
  14.   
  15.     while (!s1.empty())    
  16.     {   
  17.         unsigned char ch=(unsigned char) s1[0];   
  18.         if(ch<128)    
  19.         { // deal with ASCII   
  20.             i=1;   
  21.             len = s1.size();   
  22.             while (i<LEN len="s1.length();" i="0;" 中文标点等非汉字字符="" if="" else="" yhf="" s1="s1.substr(i);" by="" added="" ch="=13)" s2="" cr=""></LEN>=161)   
  23.               && (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=162 && (unsigned char)s1[i+1]<=168)))   
  24.               && (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=171 && (unsigned char)s1[i+1]<=191)))   
  25.               && (!((unsigned char)s1[i]==163 && ((unsigned char)s1[i+1]==172 || (unsigned char)s1[i+1]==161)    
  26.               || (unsigned char)s1[i+1]==168 || (unsigned char)s1[i+1]==169 || (unsigned char)s1[i+1]==186   
  27.               || (unsigned char)s1[i+1]==187 || (unsigned char)s1[i+1]==191)))    
  28.                 {    
  29.                     ii=i+2; // 假定没有半个汉字   
  30.                 }   
  31.   
  32.                 if (i==0) ii=i+2;   
  33.   
  34.                 // 不处理中文空格   
  35.                 if (!(ch==161 && (unsigned char)s1[1]==161))    
  36.                 {    
  37.                     if (i <= s1.size())  // yhf   
  38.                         // 其他的非汉字双字节字符可能连续输出   
  39.                         s2 += s1.substr(0, i) + SEPARATOR;    
  40.                     else break; // yhf   
  41.                 }   
  42.   
  43.                 if (i <= s1.size())  // yhf   
  44.                     s1s1=s1.substr(i);   
  45.                 else break;     //yhf   
  46.   
  47.                 continue;   
  48.             }   
  49.         }   
  50.        
  51.   
  52.     // 以下处理汉字串   
  53.   
  54.         i = 2;   
  55.         len = s1.length();   
  56.   
  57.         while(i<LEN></LEN>=176)    
  58. //    while(i<LEN></LEN>=128 && (unsigned char)s1[i]!=161)   
  59.             i+=2;   
  60.   
  61.         s2+=SegmentHzStrMM(dict, s1.substr(0,i));   
  62.   
  63.         if (i <= len)    // yhf   
  64.             s1s1=s1.substr(i);   
  65.         else break; // yhf   
  66.     }   
  67.   
  68.     return s2;   
  69. }  
/**
* 程序翻译说明
* 进一步净化数据,转换汉字
* @access  public
* @param   CDict, string 参数的汉字说明:字典,查询字符串
* @return  string 0
*/
// process a sentence before segmentation
//在分词前处理句子
string CHzSeg::SegmentSentenceMM (CDict &dict, string s1) const
{
string s2="";
unsigned int i,len;
while (!s1.empty()) 
{
unsigned char ch=(unsigned char) s1[0];
if(ch<128) 
{ // deal with ASCII
i=1;
len = s1.size();
while (i=161)
&& (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=162 && (unsigned char)s1[i+1]<=168)))
&& (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=171 && (unsigned char)s1[i+1]<=191)))
&& (!((unsigned char)s1[i]==163 && ((unsigned char)s1[i+1]==172 || (unsigned char)s1[i+1]==161) 
|| (unsigned char)s1[i+1]==168 || (unsigned char)s1[i+1]==169 || (unsigned char)s1[i+1]==186
|| (unsigned char)s1[i+1]==187 || (unsigned char)s1[i+1]==191))) 
{ 
i=i+2; // 假定没有半个汉字
}
if (i==0) i=i+2;
// 不处理中文空格
if (!(ch==161 && (unsigned char)s1[1]==161)) 
{ 
if (i <= s1.size())	// yhf
// 其他的非汉字双字节字符可能连续输出
s2 += s1.substr(0, i) + SEPARATOR; 
else break; // yhf
}
if (i <= s1.size())	// yhf
s1=s1.substr(i);
else break;		//yhf
continue;
}
}
// 以下处理汉字串
i = 2;
len = s1.length();
while(i=176) 
//    while(i=128 && (unsigned char)s1[i]!=161)
i+=2;
s2+=SegmentHzStrMM(dict, s1.substr(0,i));
if (i <= len)	// yhf
s1=s1.substr(i);
else break;	// yhf
}
return s2;
}
view plain copy to clipboard print ?
  1.    
 
view plain copy to clipboard print ?
  1. //Query.cpp  
//Query.cpp
view plain copy to clipboard print ?
  1. <PRE class=csharp name="code">/**   
  2.  * 程序翻译说明   
  3.  * 将以"/"划分开的关键字一一顺序放入一个向量容器中   
  4.  *   
  5.  * @access  public   
  6.  * @param   vector<STRING></STRING> 参数的汉字说明:向量容器   
  7.  * @return  void   
  8.  */   
  9. void CQuery::ParseQuery(vector<STRING></STRING> &vecTerm)   
  10. {   
  11.     string::size_type idx;    
  12.     while ( (idx = m_sSegQuery.find("/  ")) != string::npos ) {    
  13.         vecTerm.push_back(m_sSegQuery.substr(0,idx));    
  14.         m_sSegQuerym_sSegQuery = m_sSegQuery.substr(idx+3);    
  15.     }   
  16. }   
  17. </PRE>  
  18. <PRE class=csharp name="code"> </PRE>  
  19. <PRE class=csharp name="code"><PRE class=csharp name="code">/**   
  20.  * 程序翻译说明   
  21.  * 相关性分析查询,构造结果集合setRelevantRst //瓶颈所在   
  22.  *   
  23.  * @access  public   
  24.  * @param   vector<STRING></STRING> map set<STRING></STRING> 参数的汉字说明: 用户提交关键字的分词组,倒排索引映射,相关性结果集合   
  25.  * @return  string 0   
  26.  */   
  27. bool CQuery::GetRelevantRst   
  28. (   
  29.     vector<STRING></STRING> &vecTerm,    
  30.     map &mapBuckets,    
  31.     set<STRING></STRING> &setRelevantRst   
  32. ) const   
  33. {   
  34.     set<STRING></STRING> setSRst;   
  35.   
  36.     bool bFirst=true;   
  37.     vector<STRING></STRING>::iterator itTerm = vecTerm.begin();   
  38.   
  39.     for ( ; itTerm != vecTerm.end(); ++itTerm )   
  40.     {   
  41.   
  42.         setSRst.clear();   
  43.         copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));   
  44.   
  45.         map mapRstDoc;   
  46.         string docid;   
  47.         int doccnt;   
  48.   
  49.         map::iterator itBuckets = mapBuckets.find(*itTerm);   
  50.         if (itBuckets != mapBuckets.end())   
  51.         {   
  52.             string strBucket = (*itBuckets).second;   
  53.             string::size_type idx;   
  54.             idx = strBucket.find_first_not_of(" ");   
  55.             strBucketstrBucket = strBucket.substr(idx);   
  56.   
  57.             while ( (idx = strBucket.find(" ")) != string::npos )    
  58.             {   
  59.                 docid = strBucket.substr(0,idx);   
  60.                 doccnt = 0;   
  61.   
  62.                 if (docid.empty()) continue;   
  63.   
  64.                 map::iterator it = mapRstDoc.find(docid);   
  65.                 if ( it != mapRstDoc.end() )   
  66.                 {   
  67.                     doccnt = (*it).second + 1;   
  68.                     mapRstDoc.erase(it);   
  69.                 }   
  70.                 mapRstDoc.insert( pair(docid,doccnt) );   
  71.   
  72.                 strBucketstrBucket = strBucket.substr(idx+1);   
  73.             }   
  74.   
  75.             // remember the last one   
  76.             docid = strBucket;   
  77.             doccnt = 0;   
  78.             map::iterator it = mapRstDoc.find(docid);   
  79.             if ( it != mapRstDoc.end() )   
  80.             {   
  81.                 doccnt = (*it).second + 1;   
  82.                 mapRstDoc.erase(it);   
  83.             }   
  84.             mapRstDoc.insert( pair(docid,doccnt) );   
  85.         }   
  86.   
  87.         // sort by term frequencty   
  88.         multimap > newRstDoc;   
  89.         map::iterator it0 = mapRstDoc.begin();   
  90.         for ( ; it0 != mapRstDoc.end(); ++it0 ){   
  91.             newRstDoc.insert( pair((*it0).second,(*it0).first) );   
  92.         }   
  93.   
  94.         multimap::iterator itNewRstDoc = newRstDoc.begin();   
  95.         setRelevantRst.clear();   
  96.         for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){   
  97.             string docid = (*itNewRstDoc).second;   
  98.   
  99.             if (bFirst==true) {   
  100.                 setRelevantRst.insert(docid);   
  101.                 continue;   
  102.             }   
  103.   
  104.             if ( setSRst.find(docid) != setSRst.end() ){       
  105.                 setRelevantRst.insert(docid);   
  106.             }   
  107.         }   
  108.   
  109.         //cout << "setRelevantRst.size(): " << setRelevantRst.size() << "<BR>";   
  110.         bFirst = false;   
  111.     }   
  112.     return true;   
  113. }</PRE>  
  114. </PRE>  
  115. 接下来的就是现实了,前面都只是处理数据得到 setRelevantRst 这个查询结构集合,这里就不多说了下面就和php之类的脚本语言差不多,格式化结果集合并显示出来。  
view plaincopy to clipboardprint?
  1. /**  
  2.  * 程序翻译说明  
  3.  * 将以"/"划分开的关键字一一顺序放入一个向量容器中  
  4.  *  
  5.  * @access  public  
  6.  * @param   vector<STRING></STRING> 参数的汉字说明:向量容器  
  7.  * @return  void  
  8.  */  
  9. void CQuery::ParseQuery(vector<STRING></STRING> &vecTerm)   
  10. {   
  11.     string::size_type idx;    
  12.     while ( (idx = m_sSegQuery.find("/  ")) != string::npos ) {    
  13.         vecTerm.push_back(m_sSegQuery.substr(0,idx));    
  14.         m_sSegQuery = m_sSegQuery.substr(idx+3);    
  15.     }   
  16. }  
view plaincopy to clipboardprint?
  1.    
 
view plaincopy to clipboardprint?
  1. <PRE class=csharp name="code">/**  
  2.  * 程序翻译说明  
  3.  * 相关性分析查询,构造结果集合setRelevantRst //瓶颈所在  
  4.  *  
  5.  * @access  public  
  6.  * @param   vector<STRING></STRING> map set<STRING></STRING> 参数的汉字说明: 用户提交关键字的分词组,倒排索引映射,相关性结果集合  
  7.  * @return  string 0  
  8.  */  
  9. bool CQuery::GetRelevantRst   
  10. (   
  11.     vector<STRING></STRING> &vecTerm,    
  12.     map &mapBuckets,    
  13.     set<STRING></STRING> &setRelevantRst   
  14. const  
  15. {   
  16.     set<STRING></STRING> setSRst;   
  17.   
  18.     bool bFirst=true;   
  19.     vector<STRING></STRING>::iterator itTerm = vecTerm.begin();   
  20.   
  21.     for ( ; itTerm != vecTerm.end(); ++itTerm )   
  22.     {   
  23.   
  24.         setSRst.clear();   
  25.         copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));   
  26.   
  27.         map mapRstDoc;   
  28.         string docid;   
  29.         int doccnt;   
  30.   
  31.         map::iterator itBuckets = mapBuckets.find(*itTerm);   
  32.         if (itBuckets != mapBuckets.end())   
  33.         {   
  34.             string strBucket = (*itBuckets).second;   
  35.             string::size_type idx;   
  36.             idx = strBucket.find_first_not_of(" ");   
  37.             strBucket = strBucket.substr(idx);   
  38.   
  39.             while ( (idx = strBucket.find(" ")) != string::npos )    
  40.             {   
  41.                 docid = strBucket.substr(0,idx);   
  42.                 doccnt = 0;   
  43.   
  44.                 if (docid.empty()) continue;   
  45.   
  46.                 map::iterator it = mapRstDoc.find(docid);   
  47.                 if ( it != mapRstDoc.end() )   
  48.                 {   
  49.                     doccnt = (*it).second + 1;   
  50.                     mapRstDoc.erase(it);   
  51.                 }   
  52.                 mapRstDoc.insert( pair(docid,doccnt) );   
  53.   
  54.                 strBucket = strBucket.substr(idx+1);   
  55.             }   
  56.   
  57.             // remember the last one   
  58.             docid = strBucket;   
  59.             doccnt = 0;   
  60.             map::iterator it = mapRstDoc.find(docid);   
  61.             if ( it != mapRstDoc.end() )   
  62.             {   
  63.                 doccnt = (*it).second + 1;   
  64.                 mapRstDoc.erase(it);   
  65.             }   
  66.             mapRstDoc.insert( pair(docid,doccnt) );   
  67.         }   
  68.   
  69.         // sort by term frequencty   
  70.         multimap > newRstDoc;   
  71.         map::iterator it0 = mapRstDoc.begin();   
  72.         for ( ; it0 != mapRstDoc.end(); ++it0 ){   
  73.             newRstDoc.insert( pair((*it0).second,(*it0).first) );   
  74.         }   
  75.   
  76.         multimap::iterator itNewRstDoc = newRstDoc.begin();   
  77.         setRelevantRst.clear();   
  78.         for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){   
  79.             string docid = (*itNewRstDoc).second;   
  80.   
  81.             if (bFirst==true) {   
  82.                 setRelevantRst.insert(docid);   
  83.                 continue;   
  84.             }   
  85.   
  86.             if ( setSRst.find(docid) != setSRst.end() ){       
  87.                 setRelevantRst.insert(docid);   
  88.             }   
  89.         }   
  90.   
  91.         //cout << "setRelevantRst.size(): " << setRelevantRst.size() << "<BR>";   
  92.         bFirst = false;   
  93.     }   
  94.     return true;   
  95. }</PRE>  
view plaincopy to clipboardprint?
  1. /**  
  2.  * 程序翻译说明  
  3.  * 相关性分析查询,构造结果集合setRelevantRst //瓶颈所在  
  4.  *  
  5.  * @access  public  
  6.  * @param   vector<STRING></STRING> map set<STRING></STRING> 参数的汉字说明: 用户提交关键字的分词组,倒排索引映射,相关性结果集合  
  7.  * @return  string 0  
  8.  */  
  9. bool CQuery::GetRelevantRst   
  10. (   
  11.     vector<STRING></STRING> &vecTerm,    
  12.     map &mapBuckets,    
  13.     set<STRING></STRING> &setRelevantRst   
  14. const  
  15. {   
  16.     set<STRING></STRING> setSRst;   
  17.   
  18.     bool bFirst=true;   
  19.     vector<STRING></STRING>::iterator itTerm = vecTerm.begin();   
  20.   
  21.     for ( ; itTerm != vecTerm.end(); ++itTerm )   
  22.     {   
  23.   
  24.         setSRst.clear();   
  25.         copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));   
  26.   
  27.         map mapRstDoc;   
  28.         string docid;   
  29.         int doccnt;   
  30.   
  31.         map::iterator itBuckets = mapBuckets.find(*itTerm);   
  32.         if (itBuckets != mapBuckets.end())   
  33.         {   
  34.             string strBucket = (*itBuckets).second;   
  35.             string::size_type idx;   
  36.             idx = strBucket.find_first_not_of(" ");   
  37.             strBucket = strBucket.substr(idx);   
  38.   
  39.             while ( (idx = strBucket.find(" ")) != string::npos )    
  40.             {   
  41.                 docid = strBucket.substr(0,idx);   
  42.                 doccnt = 0;   
  43.   
  44.                 if (docid.empty()) continue;   
  45.   
  46.                 map::iterator it = mapRstDoc.find(docid);   
  47.                 if ( it != mapRstDoc.end() )   
  48.                 {   
  49.                     doccnt = (*it).second + 1;   
  50.                     mapRstDoc.erase(it);   
  51.                 }   
  52.                 mapRstDoc.insert( pair(docid,doccnt) );   
  53.   
  54.                 strBucket = strBucket.substr(idx+1);   
  55.             }   
  56.   
  57.             // remember the last one   
  58.             docid = strBucket;   
  59.             doccnt = 0;   
  60.             map::iterator it = mapRstDoc.find(docid);   
  61.             if ( it != mapRstDoc.end() )   
  62.             {   
  63.                 doccnt = (*it).second + 1;   
  64.                 mapRstDoc.erase(it);   
  65.             }   
  66.             mapRstDoc.insert( pair(docid,doccnt) );   
  67.         }   
  68.   
  69.         // sort by term frequencty   
  70.         multimap > newRstDoc;   
  71.         map::iterator it0 = mapRstDoc.begin();   
  72.         for ( ; it0 != mapRstDoc.end(); ++it0 ){   
  73.             newRstDoc.insert( pair((*it0).second,(*it0).first) );   
  74.         }   
  75.   
  76.         multimap::iterator itNewRstDoc = newRstDoc.begin();   
  77.         setRelevantRst.clear();   
  78.         for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){   
  79.             string docid = (*itNewRstDoc).second;   
  80.   
  81.             if (bFirst==true) {   
  82.                 setRelevantRst.insert(docid);   
  83.                 continue;   
  84.             }   
  85.   
  86.             if ( setSRst.find(docid) != setSRst.end() ){       
  87.                 setRelevantRst.insert(docid);   
  88.             }   
  89.         }   
  90.   
  91.         //cout << "setRelevantRst.size(): " << setRelevantRst.size() << "<BR>";   
  92.         bFirst = false;   
  93.     }   
  94.     return true;   
  95. }  
接下来的就是现实了,前面都只是处理数据得到 setRelevantRst 这个查询结构集合,这里就不多说了下面就和php之类的脚本语言差不多,格式化结果集合并显示出来。

//TSESearch.cpp

view plain copy to clipboard print ?
  1. //下面开始显示   
  2.     CDisplayRst iDisplayRst;    
  3.     iDisplayRst.ShowTop();    
  4.   
  5.     float used_msec = (end_tv.tv_sec-begin_tv.tv_sec)*1000    
  6.         +((float)(end_tv.tv_usec-begin_tv.tv_usec))/(float)1000;    
  7.   
  8.     iDisplayRst.ShowMiddle(iQuery.m_sQuery,used_msec,    
  9.             setRelevantRst.size(), iQuery.m_iStart);   
  10.   
  11.     iDisplayRst.ShowBelow(vecTerm,setRelevantRst,vecDocIdx,iQuery.m_iStart); 

这篇关于北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670220

相关文章

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、