??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲av片在线观看18女人 ,亚洲成人网在线播放,亚洲成年看片在线观看http://www.tkk7.com/guming123416/category/6971.htmljava学习天堂,个h关于其他blogQblog.javaworker.cn,Ƣ迎大家讉Kzh-cnTue, 28 Sep 2010 01:45:42 GMTTue, 28 Sep 2010 01:45:42 GMT60centos5.4下安装apache+svnhttp://www.tkk7.com/guming123416/archive/2010/09/28/333104.html天空苍茫天空苍茫Tue, 28 Sep 2010 00:24:00 GMThttp://www.tkk7.com/guming123416/archive/2010/09/28/333104.htmlhttp://www.tkk7.com/guming123416/comments/333104.htmlhttp://www.tkk7.com/guming123416/archive/2010/09/28/333104.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/333104.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/333104.html

1?/span>首先下蝲apache2.2 下蝲地址Q?/font>http://mirrors.sohu.com/apache/httpd-2.2.16.tar.gz

2?/span>然后下蝲SVN

a) 包:subversion-deps-1.6.12.tar.gz

i. 地址Q?font face="Times New Roman">http://subversion.tigris.org/downloads/subversion-deps-1.6.12.tar.gz

b) susubversion-1.6.12.tar.gz  地址Q?/font>

i. http://subversion.tigris.org/downloads/subversion-1.6.12.tar.gz 

3?/span>然后解析Apache2Q安?/font>

4?/span>tar -zxvf httpd-2.2.16.tar.gz

5?/span>安装Apache

a) ./configure -prefix=/opt/web/apache2 --enable-mods-shared=all --enable-so

b) Make

c) Make install

6?/span>?font face="Times New Roman">APACHE是否安装成功Q?/font>

启动apache:/opt/web/apache2/bin/apachectl start

7?/span>安装Svn

8?/span>首先解压Q?nbsp;tar -zxvf subversion-deps-1.6.12.tar.gz

9?/span>然后解压Q?font face="Times New Roman">tar -zxvf susubversion-1.6.12.tar.gz 

10?/span>安装命oQ?/span>

a) ./configure --prefix=/opt/web/subversion --with-apxs=/opt/web/apache2/bin/apxs --with-apr=/opt/web/httpd-2.2.16/srclib/apr  --with-apr-util=/opt/web/httpd-2.2.16/srclib/apr-util

11?/font>make  make install



天空苍茫 2010-09-28 08:24 发表评论
]]>
LuceneQ?.4.1Q技术研I?5)--IndexWritecL代码解析Q四QRAMDirectory介绍 http://www.tkk7.com/guming123416/archive/2009/05/08/269601.html天空苍茫天空苍茫Fri, 08 May 2009 05:56:00 GMThttp://www.tkk7.com/guming123416/archive/2009/05/08/269601.htmlhttp://www.tkk7.com/guming123416/comments/269601.htmlhttp://www.tkk7.com/guming123416/archive/2009/05/08/269601.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/269601.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/269601.html阅读全文

天空苍茫 2009-05-08 13:56 发表评论
]]>
LuceneQ?.4.1Q技术研I?5)--IndexWritecL代码解析Q三QFSDirectory介绍http://www.tkk7.com/guming123416/archive/2009/05/05/269036.html天空苍茫天空苍茫Tue, 05 May 2009 10:02:00 GMThttp://www.tkk7.com/guming123416/archive/2009/05/05/269036.htmlhttp://www.tkk7.com/guming123416/comments/269036.htmlhttp://www.tkk7.com/guming123416/archive/2009/05/05/269036.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/269036.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/269036.html阅读全文

天空苍茫 2009-05-05 18:02 发表评论
]]>
Linux下安装Oracle11G http://www.tkk7.com/guming123416/archive/2009/04/17/266195.html天空苍茫天空苍茫Fri, 17 Apr 2009 09:27:00 GMThttp://www.tkk7.com/guming123416/archive/2009/04/17/266195.htmlhttp://www.tkk7.com/guming123416/comments/266195.htmlhttp://www.tkk7.com/guming123416/archive/2009/04/17/266195.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/266195.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/266195.html

1、首先检查一下linux下是有存在一下YӞ如果不存在,必须这些Y件安?br /> rpm -q compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc- gcc-c++ libaio-devel libaio libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel
2、以root方式登陆Q修?etc/sysctl.confQ在文g中增加一下参?br /> kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range =1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default =262144
net.core.wmem_max =262144

然后创徏数据库的所有者:
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba Oracle 创徏用户Oracle
passwd OracleQ修改Oracle的密码)
修改Oracle用户的限?br /> cd /etc/security
vi limits.conf
在该文g增加一下内?br /> Oracle soft nproc 2047
Oracle hard nproc 16384
Oracle soft nofile 1024
Oracle hard nofile 65536
在文?etc/pam.d/login文g增加一下内?br /> session required /lib/security/pam_limits.so
session required pam_limits.so
在文?etc/profile增加一下内?/p>

if [$USER = "Oracle"] ; then
if [ $SHELL = " /bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65535
else
ulimit -u 16384 -n 65536
fi
fi
创徏安装目录Q?br /> mkdir -p /opt/app/oracle
chown -P Oracle:oinstall /opt/app
chmod -R 755 /opt/app
执行命oQ解压安装文?Qunzip linux_11gR1_database.zip
然后q入解压后的目录Q执?br /> $ ./runInstaller



天空苍茫 2009-04-17 17:27 发表评论
]]>
LuceneQ?.4.1Q技术研I?5)--IndexWritecL代码解析Q二Q?-Directory 解析 http://www.tkk7.com/guming123416/archive/2009/04/16/266008.html天空苍茫天空苍茫Thu, 16 Apr 2009 09:32:00 GMThttp://www.tkk7.com/guming123416/archive/2009/04/16/266008.htmlhttp://www.tkk7.com/guming123416/comments/266008.htmlhttp://www.tkk7.com/guming123416/archive/2009/04/16/266008.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/266008.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/266008.html首先我们看构造函C的第一个类Directory cR根据这个类的英文,我们能得个类是关于目录操作的。Directory 是一个抽象类。其?个子c,分别是:DbDirectory, FSDirectory, JEDirectory, RAMDirectory

首先我们看看Directory 的类
public abstract class Directory {
volatile boolean isOpen = true;
/*** 持有一个LockFactory的实例(实现锁定q个目录实例Q?/
protected LockFactory lockFactory;
/**q回该目录下的所有文件数l?如果q个目录下没有文件存在,或者存在权限问题不能访问,该方法可能返回Null*/
public abstract String[] list() throws IOException;
/** * q回指定名称的文件是不是存在 */
public abstract boolean fileExists(String name)
throws IOException;
/**q回指定名称的文件最后修改的旉
public abstract long fileModified(String name) throws IOException;
/**讄指定文g名的文g最后的修改旉为当前时?/
public abstract void touchFile(String name) throws IOException;

/**删除指定文g?*/
public abstract void deleteFile(String name)throws IOException;
/**q回指定文g的长度?*/
public abstract long fileLength(String name) throws IOException;
/** 在当前目录下使用l定的名U创Z个空的文件。ƈ且返回一个流来写该文件?/
public abstract IndexOutput createOutput(String name) throws IOException;
/** * Lucene使用该方法确保所有的针对该文件的写操作都会存储到Index。ƈ且阻止machine/OS发生故障 破坏该index?/
public void sync(String name) throws IOException {}
/**获取已经存在的一个文件的IndexInput操作该文g?*/
public abstract IndexInput openInput(String name) throws IOException;
/** q回已经存在的一个文件、ƈ且用指定大的~冲的IndexInputQ但是当前目录也可能忽略该缓冲池的大,
* 当前主要是考虑CompoundFileReader和FSDirectory对于ơ参数的需求?/
public IndexInput openInput(String name, int bufferSize) throws IOException {
return openInput(name);
}
/** 创徏一个指定名U的?
public Lock makeLock(String name) {
return lockFactory.makeLock(name);
}
/**
* 清除指定的锁定(解锁和删除)q不仅要求在q个时候当前的锁一定不在用?*/
public void clearLock(String name) throws IOException {
if (lockFactory != null) {
lockFactory.clearLock(name);
}
}
/** l束q个store. */
public abstract void close() throws IOException;

/**讄LockFactoryQ此目录实例应光定执行。每个LockFactory实例只用于一个目录(卻I不要q一个实例在多个目录Q?*/
public void setLockFactory(LockFactory lockFactory) {
this.lockFactory = lockFactory;
lockFactory.setLockPrefix(this.getLockID());
}

/** 获得LockFactoryQ此目录例实例用其锁定执行。请注意Q这可能是无效的目录执行Q提供自己锁执行*/
public LockFactory getLockFactory() {
return this.lockFactory;
}
/**q去锁实例的唯一表示ID的字W串描述*/
public String getLockID() {
return this.toString();
}
/**// 拯源目录src下的文gQ复制到目的目录dest下面Q拷贝完成后关闭源目录src*/
public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException {
final String[] files = src.list();
if (files == null)
throw new IOException("cannot read directory " + src + ": list() returned null");
byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
for (int i = 0; i < files.length; i++) {
IndexOutput os = null;
IndexInput is = null;
try {
// create file in dest directory
os = dest.createOutput(files[i]);
// read current file
is = src.openInput(files[i]);
// and copy to dest directory
long len = is.length();
long readCount = 0;
while (readCount < len) {
int toRead = readCount + BufferedIndexOutput.BUFFER_SIZE > len ? (int)(len - readCount) : BufferedIndexOutput.BUFFER_SIZE;
is.readBytes(buf, 0, toRead);
os.writeBytes(buf, toRead);
readCount += toRead;
}
} finally {
// graceful cleanup
try {
if (os != null)
os.close();
} finally {
if (is != null)
is.close();
}
}
}
if(closeDirSrc)
src.close();
}

从Directory抽象cȝ定义Q我们可以得到如下几点:
1、管理锁工厂及其锁实例;
2、管理Directory目录实例的基本属性,主要是通过文g名称q行理Q?br /> 3、管理与操作该目录相关的一些流对象Q?br /> 4、管理烦引文件的拯?br />



天空苍茫 2009-04-16 17:32 发表评论
]]>
LuceneQ?.4.1Q技术研I?5)--IndexWritecL代码解析Q一Q?/title><link>http://www.tkk7.com/guming123416/archive/2009/04/07/264298.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 07 Apr 2009 09:39:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2009/04/07/264298.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/264298.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2009/04/07/264298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/264298.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/264298.html</trackback:ping><description><![CDATA[<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1?/span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">indexWriter<font face="宋体">cM要功能是对烦引的创徏Q加入Document后,合ƈ各种索引D,以及控制与烦引相关的其他斚wQ它是lucene索引的主要操U者?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2?/span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">我们首先看看IndexWriter的构造函?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(String path, Analyzer a, boolean create, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(String path, Analyzer a, boolean create)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(File path, Analyzer a, boolean create, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(File path, Analyzer a, boolean create)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, Analyzer a, boolean create)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(String path, Analyzer a, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(String path, Analyzer a)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(File path, Analyzer a, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(File path, Analyzer a)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, Analyzer a)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, boolean autoCommit, Analyzer a)(<font face="宋体">废弃Q不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create)<font face="宋体">Q废弃,不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, Analyzer a, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, boolean autoCommit, Analyzer a, IndexDeletionPolicy deletionPolicy)<font face="宋体">Q废弃,不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy)<font face="宋体">Q废弃,不提倡?</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">l心的读者肯定会发现Q废弃的构造函C提倡用的构造函敎ͼ多了一个MaxFieldLength参数。带有该参数的构造函数都是允许正怋用的?/font></span><span style="font-size: 10.5pt; color: rgb(255,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">Q注释:废弃的构造函数将在Lucene3.0中移除)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">仔细查看其构造函数的实现呢,最l都转化成一个私有的构造函敎ͼ如图Q?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">/**</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* <font face="宋体">该构造函C要是创徏一个IndexWrite对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* d <font face="宋体">Q指定的存放建立索引文g的烦引目?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* a <font face="宋体">QAnalyzer  分词分析?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* create <font face="宋体">Q是否要重新写入索引文gQ如果ؓtrueQ则重写索引文gQ如果ؓfalseQ则q加写入索引文g</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* closeDir <font face="宋体">Q一个boolean型变量,表示是否关闭索引目录Directory dQ与IndexWriter的一个成员变量相?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* deletionPolicy <font face="宋体">Q指定删除烦引文件用的{略</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* autoCommit <font face="宋体">Q徏立烦引文件后Q自动提交?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">* maxFieldLength <font face="宋体">Q?nbsp;表示索引中Field的最大长度?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*/</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, IndexDeletionPolicy deletionPolicy, boolean autoCommit, int maxFieldLength)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    throws CorruptIndexException, LockObtainFailedException, IOException {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    this.closeDir = closeDir;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    directory = d;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    analyzer = a;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    setMessageID(defaultInfoStream);</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">q里主要是指定infoStreamQ是一个PrintStream输出对?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    this.maxFieldLength = maxFieldLength;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">指定Field数据的最大长?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    if (create) {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      // </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">如果是重新创建烦引文?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">Q?/font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">清除写锁文gwrite.lock</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      directory.clearLock(WRITE_LOCK_NAME);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    }</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    Lock writeLock = directory.makeLock(WRITE_LOCK_NAME);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    if (!writeLock.obtain(writeLockTimeout)) // </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">获取写锁文g</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      throw new LockObtainFailedException("Index locked for write: " + writeLock);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    this.writeLock = writeLock;             </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">保存新的写锁文g</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    try {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      if (create) {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        // </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">如果create为trueQ表C重写烦引文件。重写烦引文件之前,要先d已经存在的烦引文Ӟq且要清除掉历史写入的segment信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        try {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">          segmentInfos.read(directory);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">          segmentInfos.clear();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        } catch (IOException e) {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        }</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        segmentInfos.commit(directory);  </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">// <font face="宋体">向指定的索引存放目录中写入segment信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">   </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      } else {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        segmentInfos.read(directory);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">dsegment信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        // We assume that this segments_N was previously</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        // properly sync'd:</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        for(int i=0;i<segmentInfos.size();i++) {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">          final SegmentInfo info = segmentInfos.info(i);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">          List files = info.files();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">          for(int j=0;j<files.size();j++)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">            synced.add(files.get(j));</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        }</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      }</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      this.autoCommit = autoCommit;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">执行提交写入索引的标?nbsp;</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      setRollbackSegmentInfos(segmentInfos);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">克隆原来?/font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">segment<font face="宋体">状态信息,q且信息保存到HashSet?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      docWriter = new DocumentsWriter(directory, this);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">创徏一个DocumentsWriter对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      docWriter.setInfoStream(infoStream);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">讄</font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">DocumentsWriter<font face="宋体">对象?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">infoStream<font face="宋体">信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      docWriter.setMaxFieldLength(maxFieldLength);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">讄</font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">DocumentsWriter<font face="宋体">对象?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">maxFieldLength<font face="宋体">信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      //<font face="宋体">默认的删除策略实现类为KeepOnlyLastCommitDeletionPolicyQ它只是保证最q提交删除的索引文gQ提交删除动?nbsp;</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      // IndexFileDeleter deleter<font face="宋体">是IndexWritercȝ一个私有的成员变量Q它在org.apache.lucene.index包里面,主要对删除烦引文件进行实现和理 </font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      deleter = new IndexFileDeleter(directory,</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">                                     deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy,</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">                                     segmentInfos, infoStream, docWriter);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      pushMaxBufferedDocs();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">hDocsBuffer?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      if (infoStream != null) {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">如果infoStream是null</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        message("init: create=" + create);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">        messageState();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      }</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    } catch (IOException e) {</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      this.writeLock.release();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      this.writeLock = null;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">      throw e;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    }</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">  } </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">  <font face="宋体">通过IndexWrite的构造函敎ͼ以及最l的实现Ҏ的init分发Q其主要是实CҎ指定的徏立烦引的方式(重写、追加写?Q通过create标志位来判断Q从而指定一U在操作索引文g的过E中删除索引文g的策略?/font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">在理解lucene的时_必须熟悉其初始化</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">IndexWrite<font face="宋体">的原理,才能深入了解该框架在创徏索引的核心实现机制?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <!--endfragment--> <img src ="http://www.tkk7.com/guming123416/aggbug/264298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2009-04-07 17:39 <a href="http://www.tkk7.com/guming123416/archive/2009/04/07/264298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LuceneQ?.4.1Q技术研I?4)--Field源代?/title><link>http://www.tkk7.com/guming123416/archive/2009/03/31/263059.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 31 Mar 2009 02:48:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2009/03/31/263059.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/263059.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2009/03/31/263059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/263059.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/263059.html</trackback:ping><description><![CDATA[<p>Fieldc(cM数据库中的字D与属性)<br />     该类实现接口QFieldable    l承静态类: AbstractField<br />     Fieldable接口。主要是描述一些基信息的内?br />         讄权重以及获取权重 [void setBoost(float boost), float getBoost();]<br />         获取名称String name();<br />         获取Stringcd的值public String stringValue();<br />         以Reader方式q回public Reader readerValue();<br />         以二q制或者TokenStream  方式q回public byte[] binaryValue();public TokenStream       tokenStreamValue();<br />         是否被存储boolean  isStored();<br />         是否被烦引boolean  isIndexed();<br />         是否被分词boolean  isTokenized();<br />         是否是压~存?boolean  isCompressed();<br />         是否是二q制boolean  isBinary();<br />            ......其他的读者可以参考源代码<br /> AbstractField抽象cd义的一些常量:<br />           protected String name = "body";                        //表示该Filed的名U?br />           protected boolean storeTermVector = false;    //表示是否存储词条向量<br />           protected boolean storeOffsetWithTermVector = false;  //存储词条向量的偏U量<br />           protected boolean storePositionWithTermVector = false;  //存储词条向量的位|?br />           protected boolean omitNorms = false;     //<br />           protected boolean isStored = false;      //是否存储<br />           protected boolean isIndexed = true;      //是否是烦?br />           protected boolean isTokenized = true;     //是否是分?br />           protected boolean isBinary = false;      //是否是二q制数据<br />           protected boolean isCompressed = false;     //是否是压~?br />           protected boolean lazy = false;      //是否是gq?br />           protected boolean omitTf = false;     //<br />           protected float boost = 1.0f;      //讄Ȁ励因?br />           protected Object fieldsData = null;     //Field的内部属性的具体内容<br />           protected int binaryLength;       //二进制数据长?br />           protected int binaryOffset;       //二进制数据偏U量</p> <p>FiledcL代码解析<br />     首先Filed内部定义了三个静态类Store、Index、TermVector?br /> //定一个静态类Store Q主要ؓ了设|Field的存储属?br /> public static final class Store extends Parameter implements Serializable {<br />     private Store(String name) {<br />       super(name);<br />     }<br />     //使用压羃的方式来存储Field的?br />     public static final Store COMPRESS = new Store("COMPRESS");<br />     //在烦引中存储Field的?br />     public static final Store YES = new Store("YES");<br />     //在烦引中不存贮Field的?br />     public static final Store NO = new Store("NO");<br />   }<br /> //定一个静态类Index Q主要ؓ了设|Field的烦引属?br /> public static final class Index extends Parameter implements Serializable {<br />     private Index(String name) {<br />       super(name);<br />  }<br />  //不对Fieldq行索引Q所以这个Field׃能被索到(一般来_建立索引而它不被检索,q是没有意义?<br />  //如果对该Fieldq设|了Field.Store为Field.Store.YES或Field.Store.COMPRESSQ则可以?br />     public static final Index NO = new Index("NO");</p> <p>    //对Fieldq行索引Q同时还要对其进行分?由Analyzer来管理如何分?<br />     public static final Index ANALYZED = new Index("ANALYZED");<br /> //废弃的属性,使用ANALYZED 来替?br />      public static final Index TOKENIZED = ANALYZED;<br /> //对Fieldq行索引Q但是不对该Field使用分词<br />     public static final Index NOT_ANALYZED = new Index("NOT_ANALYZED");<br /> //废弃的属性,使用NOT_ANALYZED来替?br />     public static final Index UN_TOKENIZED = NOT_ANALYZED;<br /> //即不对Field索引Q也不对其用Analyzer来分?br />     public static final Index NOT_ANALYZED_NO_NORMS = new  Index("NOT_ANALYZED_NO_NORMS");<br /> //废弃的属性,有NOT_ANALYZED_NO_NORMS来替?br />     public static final Index NO_NORMS = NOT_ANALYZED_NO_NORMS;<br /> //对Field属性,使用分词Q但是不是用Analyzer来分?br />     public static final Index ANALYZED_NO_NORMS = new Index("ANALYZED_NO_NORMS");<br />   }<br /> q是一个与词条有关的类。因为在索的时候需要指定检索关键字Q通过Z个Fieldd一个TermVectorQ就可以在检索中把该Field索到?br /> public static final class TermVector  extends Parameter implements Serializable {<br />     private TermVector(String name) {<br />       super(name);<br />     }<br />     //不存?br />     public static final TermVector NO = new TermVector("NO");<br />     //为每个Document都存储一个TermVector<br />     public static final TermVector YES = new TermVector("YES");<br />     //存储Qƈ且存在位|信?br />     public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");<br />     //存储Qƈ且存贮偏U量信息<br />     public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");<br />     //存储位置、偏U量{所有信?br />     public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");<br />   }</p> <p>构造函?br />  public Field(String name, String value, Store store, Index index)   <br /> public Field(String name, String value, Store store, Index index, TermVector termVector)<br /> public Field(String name, Reader reader)<br /> public Field(String name, Reader reader, TermVector termVector)<br /> public Field(String name, TokenStream tokenStream) <br /> public Field(String name, TokenStream tokenStream, TermVector termVector)<br />  public Field(String name, byte[] value, Store store) <br /> public Field(String name, byte[] value, int offset, int length, Store store) </p> <p>程Q?br /> 首先查name以及values不能为空以及Nnull?br /> 然后查是否是存储以及是否分词如果两者都是NoQ则抛出异常?br /> 然后查是否存储以及是否向量分词,如果两者都是No'Q则抛出异常?br /> 然后该Filed的名U命令传递过来的名称源代码(this.name = name.internQ?br /> 表示获取JVM String帔R池的地址<br /> 此时ҎStore的|来设|是否存储以及压~的?br /> 然后ҎIndex的|来设|是否烦引、是否分词、omitNorms  的g及置是否是二q制<br /> 然后开始根据TermVector 的|来设|是否存储向量、是否存储偏U量、是否存储位|等信息?br /> <br /> <br /> 以上信息可能存在分析不正,请大家给指证Q本语有不怎么好,<br /> <br /> </p> <script type="text/javascript"><!-- google_ad_client = "pub-5850191600757552"; /* 728x90, 创徏?09-3-30 */ google_ad_slot = "5627680550"; google_ad_width = 728; google_ad_height = 90; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <img src ="http://www.tkk7.com/guming123416/aggbug/263059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2009-03-31 10:48 <a href="http://www.tkk7.com/guming123416/archive/2009/03/31/263059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LuceneQ?.4.1Q技术研I?3)--Document源代?/title><link>http://www.tkk7.com/guming123416/archive/2009/03/30/262909.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Mon, 30 Mar 2009 08:17:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2009/03/30/262909.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/262909.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2009/03/30/262909.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/262909.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/262909.html</trackback:ping><description><![CDATA[<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1?/span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Document<font face="宋体">文g</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Document<font face="宋体">是lucene自己定义的一U文件格式,lucene使用docement来代替对应的物理文g或者保存在数据库中的数据。因此Document只能作ؓ数据源在Lucene中的数据存贮的一U文件Ş式?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Document<font face="宋体">只是负责攉数据源,因ؓ不同的文件可以构建同一个Document。只要用户将不同的文件创建成Documentcd的文ӞLucenep快速找到查扑ƈ且用他们?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">对于一个Document文gQ可以同时增加多个Field。Lucene中对于每个数据源是用FieldcL表示的。多个Fieldl成一个DocumentQ多个Documentl成一个烦引文件。Document与Field关系如果一所C?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span> </p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><img height="230" alt="" src="http://www.tkk7.com/images/blogjava_net/guming123416/document.gif" width="604" border="0" /><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">此时Q我们去看看Documentq个cȝ源代码。Document采用默认不带参数的构造函敎ͼ但是我们他在创徏的时_<br />         产生两个变量Q?/font></span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,192); font-family: 'ËÎÌå'; mso-spacerun: 'yes'">fields</span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,192); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">?nbsp;</font></span><span style="font-size: 10.5pt; background: rgb(192,192,192); color: rgb(0,0,192); font-family: 'ËÎÌå'; mso-spacerun: 'yes'">boost</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">其中fields是创Z一个arrayList,其主要是保存Fieldc?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Boost<font face="宋体">主要是设|该doc的优先</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">其方法:addQFieldable fieldQ增加一个field对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">   </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">removeField(String name)  <font face="宋体">ҎnameU除一个ield对象Q找C个就q回Q?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">removeFields(String name)  <font face="宋体">ҎnameU除所有的field对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Field getField(String name)  <font face="宋体">Ҏ名字扑ֈ该Field对象?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Fieldable getFieldable(String name)  <font face="宋体">Ҏ名字扑ֈFieldable子类QFieldable?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">接口Q具体有Filed来实玎ͼ</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">String get(String name) <font face="宋体">Ҏ名字Q找到给Filed对象中包含的内容</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public final byte[] getBinaryValue(String name) <font face="宋体">主要查找Doc中包含有二进制field</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">数据Q如果不存在Q则q回nullQ?/font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br /> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">    public final List getFields() <font face="宋体">直接q回该Doc中包含的Field?br /> </font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p>    <br /> </o:p></span></p> <!--endfragment--><script type="text/javascript"><!-- google_ad_client = "pub-5850191600757552"; /* 728x90, 创徏?08-7-7 */ google_ad_slot = "7437612977"; google_ad_width = 728; google_ad_height = 90; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <img src ="http://www.tkk7.com/guming123416/aggbug/262909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2009-03-30 16:17 <a href="http://www.tkk7.com/guming123416/archive/2009/03/30/262909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LuceneQ?.4.1Q技术研I?2)--分析事例 http://www.tkk7.com/guming123416/archive/2009/03/27/262483.html天空苍茫天空苍茫Fri, 27 Mar 2009 09:54:00 GMThttp://www.tkk7.com/guming123416/archive/2009/03/27/262483.htmlhttp://www.tkk7.com/guming123416/comments/262483.htmlhttp://www.tkk7.com/guming123416/archive/2009/03/27/262483.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/262483.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/262483.html1?/span>我们d析一下该D늨序?br />
a) 首先我们创徏一个类IndexWriter,该类是lucene创徏索引的核心,其主要功能是所有的数据源所有内容,l过分词处理Q创建成索引格式的文Ӟ同数据库惛_比,一个烦引文件就相当一张表Q?br />
b) 然后Q我们定义了documentcRLucene是将所有的数据源都转换成Documentcd的文Ӟlucene内部只能识别出Documentcd的文件。(同数据库相比的话QDocument像一个表的每一条记录。)

c) 然后我们定义了一些Filec,其中File是作为真实的数据存储使用Q每一个需要烦引的内容都对应一个FiledQ(和数据库相比QFieldq当一一条记录的一个属性与其|?br />
d) 然后Field增加到Document中,其中每个Document可以增加到多个Field对象。然后将所有的Doc交给IndexWriterd建烦引,创徏完成后,如图一


图一 lucene索引后的文g

E)
然后开始查询,首先使用IndexReader来读取所创徏目录下的索引文gQ然后创Z个IndexSearch对象Q该对象主要功能是从烦引中查询?br />
F)
然后定义查询{略Q本例中采用queryParse来查询,然后循环Q将所有查询的l果打印出来?br />


天空苍茫 2009-03-27 17:54 发表评论
]]>
LuceneQ?.4.1Q技术研I?1)--lucene技?/title><link>http://www.tkk7.com/guming123416/archive/2009/03/27/262332.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Fri, 27 Mar 2009 05:18:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2009/03/27/262332.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/262332.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2009/03/27/262332.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/262332.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/262332.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.tkk7.com/guming123416/archive/2009/03/27/262332.html'>阅读全文</a><img src ="http://www.tkk7.com/guming123416/aggbug/262332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2009-03-27 13:18 <a href="http://www.tkk7.com/guming123416/archive/2009/03/27/262332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring源代码学习(2.0.5Q一QBeanFactoryQ?/title><link>http://www.tkk7.com/guming123416/archive/2008/07/06/212916.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Sun, 06 Jul 2008 14:04:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2008/07/06/212916.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/212916.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2008/07/06/212916.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/212916.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/212916.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.tkk7.com/guming123416/archive/2008/07/06/212916.html'>阅读全文</a><img src ="http://www.tkk7.com/guming123416/aggbug/212916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2008-07-06 22:04 <a href="http://www.tkk7.com/guming123416/archive/2008/07/06/212916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用DBCP建立的连接池。(直接使用在应用程序用Q?/title><link>http://www.tkk7.com/guming123416/archive/2007/08/28/140313.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 28 Aug 2007 01:47:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2007/08/28/140313.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/140313.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2007/08/28/140313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/140313.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/140313.html</trackback:ping><description><![CDATA[<p>׃在JAVA自动获得新闻Q没有徏立web的环境,徏立的服务器放|在一台服务器上,数据库放在另一台服务器上,l果造成使用JDBC速度~慢Q因此修Ҏq接池:<br><br>import java.sql.Connection;<br>import java.sql.DriverManager;<br>import java.sql.SQLException;</p> <p>import org.apache.commons.dbcp.ConnectionFactory;<br>import org.apache.commons.dbcp.DriverManagerConnectionFactory;<br>import org.apache.commons.dbcp.PoolableConnectionFactory;<br>import org.apache.commons.dbcp.PoolingDriver;<br>import org.apache.commons.pool.ObjectPool;<br>import org.apache.commons.pool.impl.GenericObjectPool;<br>import org.apache.log4j.Logger;</p> <p>/**<br> * @author Administrator<br> *<br> */<br>public class DBConnectionFactory {<br> /**<br>  * Logger for this class<br>  */<br> private static final Logger logger = Logger<br>   .getLogger(DBConnectionFactory.class);</p> <p> private static ObjectPool connectionPool=null; <br> private static String sqlJdbc = ""; <br>    private static String sqlUser = ""; <br>    private static String sqlPwd = ""; <br>    @SuppressWarnings("unchecked")<br> private static Class driverClass=null; </p> <p><br>    public static void proDBConnectionFactory(){<br>     if(sqlJdbc.equals("")){<br>      sqlJdbc = "jdbc:jtds:sqlserver://27.0.0.1:1433/finance;tds=8.0;lastupdatecount=true";<br>     }<br>     if(sqlUser.equals("")){<br>      sqlUser = "sa";<br>     }<br>     if(sqlPwd.equals("")){<br>      sqlPwd = "11111";<br>     }<br>     initDataSource();<br>    }<br>     public synchronized static void initDataSource(){ <br>      if(driverClass == null){<br>       try {<br>    driverClass = Class.forName("net.sourceforge.jtds.jdbc.Driver");<br>   } catch (ClassNotFoundException e) {<br>    logger.error("在注册驱动名U的旉发生错误Q?+e.getMessage(),e);<br>   }<br>      }<br>      if(connectionPool == null){<br>       setupDriver(sqlJdbc);<br>       //printDriverStats(); <br>      }else{<br>       System.out.print("q接池已l存?);<br>      }<br>      try { <br>            // printDriverStats(); <br>         } catch (Exception e) { <br>             e.printStackTrace(); <br>         }   <br>     }<br>     <br>     public static Connection getConn(){<br>      proDBConnectionFactory();<br>      Connection conn = null;<br>      try { <br>             conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:FinanceDBPool"); <br>         } catch(SQLException e) { <br>             e.printStackTrace(); <br>         } <br>         return conn; </p> <p>     }<br>     <br>     public static void printDriverStats() throws Exception { <br>         PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); <br>         ObjectPool connectionPool = driver.getConnectionPool("FinanceDBPool"); <br>         System.out.println("zd的连? " + connectionPool.getNumActive()); <br>         System.out.println("I闲的连? " + connectionPool.getNumIdle()); <br>     } </p> <p>     <br>     public static void setupDriver(String connectURI){<br>      try {<br>   connectionPool = new GenericObjectPool(null); <br>    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,sqlUser,sqlPwd); <br>    @SuppressWarnings("unused")<br>   PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true); <br>    Class.forName("org.apache.commons.dbcp.PoolingDriver"); <br>    PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");<br>    //driver.registerPool("FinanceDBPool",connectionPool);<br>    driver.registerPool("FinanceDBPool",connectionPool);</p> <p>  } catch (ClassNotFoundException e) {<br>   logger.error("注册q接池的旉发生错误:"+e.getMessage(),e);<br>  } catch (SQLException e) {<br>   logger.error("注册q接池的旉发生错误:"+e.getMessage(),e);<br>  }<br>     }<br> </p> <img src ="http://www.tkk7.com/guming123416/aggbug/140313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2007-08-28 09:47 <a href="http://www.tkk7.com/guming123416/archive/2007/08/28/140313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizercȝ使用Ҏ http://www.tkk7.com/guming123416/archive/2006/11/29/84316.html天空苍茫天空苍茫Wed, 29 Nov 2006 04:28:00 GMThttp://www.tkk7.com/guming123416/archive/2006/11/29/84316.htmlhttp://www.tkk7.com/guming123416/comments/84316.htmlhttp://www.tkk7.com/guming123416/archive/2006/11/29/84316.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/84316.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/84316.html StringTokenizerQ字W串分隔解析cd
属于Qjava.util包?/span>

Q、构造函数?/span>

    1. StringTokenizer(String str) Q构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t?”、“换行符(‘\n?”、“回车符(‘\r?”?br />2. StringTokenizer(String str, String delim) Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W?br />3. StringTokenizer(String str, String delim, boolean returnDelims) Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W,同时Q指定是否返回分隔符?/ul>

    Q、方法?/span>
    说明Q?br />1. 所有方法均为publicQ?br />2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;
    如:
    static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>

      1. int countTokens() Q返回nextTokenҎ被调用的ơ数。如果采用构造函??Q返回的是分隔W数??)?br />2. boolean hasMoreTokens() Q返回是否还有分隔符?br />3. boolean hasMoreElements() Q结果同2?br />4. String nextToken() Q返回从当前位置C一个分隔符的字W串?br />5. Object nextElement() Q结果同4?br />6. String nextToken(String delim) Q与4cMQ以指定的分隔符q回l果?/ul>

      例子Q?/span>
      		String s = new String("The Java platform is the ideal platform for network computing");
      StringTokenizer st = new StringTokenizer(s);
      System.out.println( "Token Total: " + st.countTokens() );
      while( st.hasMoreElements() ){
      System.out.println( st.nextToken() );
                 }
      l果为:
      Token Total: 10
      The
      Java
      platform
      is
      the
      ideal
      platform
      for
      network
      computing

      ?:
      		String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");
      StringTokenizer st = new StringTokenizer(s,"=",true);
      System.out.println( "Token Total: " + st.countTokens() );
      while( st.hasMoreElements() ){
      System.out.println( st.nextToken() );
      }
      l果为:
      Token Total: 19
      The
      =
      Java
      =
      platform
      =
      is
      =
      the
      =
      ideal
      =
      platform
      =
      for
      =
      network
      =
      computing


      天空苍茫 2006-11-29 12:28 发表评论
      ]]>数据库设计说明书- http://www.tkk7.com/guming123416/archive/2006/03/16/35622.html天空苍茫天空苍茫Thu, 16 Mar 2006 04:58:00 GMThttp://www.tkk7.com/guming123416/archive/2006/03/16/35622.htmlhttp://www.tkk7.com/guming123416/comments/35622.htmlhttp://www.tkk7.com/guming123416/archive/2006/03/16/35622.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/35622.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/35622.html1 引言
      1Q?~写目的
        说明~写q䆾数据库设计说明书的目的,指出预期的读者?BR>1Q?背景
        说明Q?BR>  aQ说明待开发的数据库的名称和用此数据库的软gpȝ的名Uͼ
        bQ列软gpȝ开发项目的d提出者、用户以及将安装该Y件和q个数据库的计算站(中心Q?
      1Q?定义
        列出本文件中用到的专门术语的定义、外文首字母l词的原词组?BR>1Q?参考资?
        列出有关的参考资料:
        aQ本目的经核准的计划Q务书或合同、上U机x文;
        bQ属于本目的其他已发表的文Ӟ
        cQ本文g中各处引用到的文件资料,包括所要用到的软g开发标准?
        列出q些文g的标题、文件编受发表日期和出版单位Q说明能够取得这些文件的来源?BR>2 外部设计
      2Q?标识W和状?BR>  联系用途,详细说明用于唯一地标识该数据库的代码、名U或标识W,附加的描q性信息亦要给出。如果该数据库属于尚在实验中、尚在测试中或是暂时使用的,则要说明q一特点及其有效旉范围?BR>2Q?使用它的E序
        列出要使用或访问此数据库的所有应用程序,对于q些应用E序的每一个,l出它的名称和版本号?
      2Q?U定
        陈述一个程序员或一个系l分析员Z能用此数据库而需要了解的建立标号、标识的U定Q例?用于标识数据库的不同版本的约定和用于标识库内各个文卷、、记录、数据项的命名约定等?
      2Q?专门指导
        向准备从事此数据库的生成、从事此数据库的试、维护h员提供专门的指导Q例如将被送入数据 库的数据的格式和标准、送入数据库的操作规程和步骤,用于产生、修攏V更新或使用q些数据文卷的操 作指对{?如果q些指导的内容篇q很长,列出可参阅的文g资料的名U和章条?BR>2Q?支持软g
        单介l同此数据库直接有关的支持YӞ如数据库理pȝ、存储定位程序和用于装入、生成、修 攏V更新数据库的程序等。说明这些Y件的名称、版本号和主要功能特性,如所用数据模型的cd、允?的数据容量等。列些支持Y件的技术文件的标题、编号及来源?
      3 l构设计
      3Q?概念l构设计
        说明本数据库反映的现实世界中的实体、属性和它们之间的关pȝ的原始数据Ş式,包括各数据项、记录、系、文L标识W、定义、类型、度量单位和值域Q徏立本数据库的每一q用戯图?
      3Q?逻辑l构设计
        说明把上q原始数据进行分解、合q后重新l织h的数据库全局逻辑l构Q包括所定的关键字和属性、重新确定的记录l构和文L构、所建立的各个文卷之间的怺关系QŞ成本数据库的数据库管理员视图?
      3Q?物理l构设计
        建立pȝE序员视图,包括Q?BR>  aQ数据在内存中的安排Q包括对索引区、缓冲区的设计;
        bQ所使用的外存设备及外存I间的组l,包括索引区、数据块的组l与划分Q?BR>  cQ访问数据的方式Ҏ?BR>4 q用设计
      4Q?数据字典设计
        Ҏ据库设计中涉及到的各U项目,如数据项、记录、系、文南模式、子模式{一般要建立h据字典,以说明它们的标识W、同义名及有关信息。在本节中要说明Ҏ数据字典设计的基本考虑?

      4Q?安全保密设计
        说明在数据库的设计中Q将如何通过区分不同的访问者、不同的讉Kcd和不同的数据对象Q进行分别对待而获得的数据库安全保密的设计考虑?/P>

      天空苍茫 2006-03-16 12:58 发表评论
      ]]>
      计算Y仉求说明编制指?/title><link>http://www.tkk7.com/guming123416/archive/2006/03/16/35620.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Thu, 16 Mar 2006 04:56:00 GMT</pubDate><guid>http://www.tkk7.com/guming123416/archive/2006/03/16/35620.html</guid><wfw:comment>http://www.tkk7.com/guming123416/comments/35620.html</wfw:comment><comments>http://www.tkk7.com/guming123416/archive/2006/03/16/35620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/guming123416/comments/commentRss/35620.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/guming123416/services/trackbacks/35620.html</trackback:ping><description><![CDATA[<P>你的工程应该有个好的L。一个小l要带领客户q入需求启发阶D而且你要写Y仉求说明书。这份说明有些大Q但客户会很重视Q所以说明必d到赞同? <P><BR>  现在你正在设计其中的一个特性,已经发现了需求的一些问题。你可以用多U不同的方式解释需?5Q需? 的说明正好与需?1相反Q你因该怿哪一个?需?4非常含糊Q你Ҏ不明白它的意思;你不得不׃一个小时与2位开发h员讨论需?0Q只因ؓ你们对其各有各的理解Qƈ且,唯一能够澄清q些问题的客h有给你们{复。你被迫破解众多需求的含义Qƈ且你能预料到Q如果你错了Q你要做大量的重复工作?</P> <P><BR>  许多软g需求说明书QSRSQ写得非常糟p。Q何品的质量需要其原始材料的质量保证,p糕的Y仉求说明书不可能ZU的Y件。不q的是,几乎没有开发h员受q与需求的抽象、分析、文、质有关的教肌Ӏ而且Q没有非常多的好需求可以借鉴学习Q部分原因是很少有工E可以找C个好的借鉴Q其他原因是公司不愿意将其品说明书攑֜公共区域?/P> <P><BR>  q篇文章描述了高质量需求叙q和说明的几个特性(特点Q。我们将用这些观Ҏ查一些有~陷的需求,带着痛楚重新~写。而且我会谈一些如何编写好的需求的提示。你也许想通过q些质量标准评估你的工程需求。对于修订,也许q了Q但你会学到一些有用的东西Qƈ帮助你的组在下ơ编写出更好的需求?</P> <P><BR>  不要期望能够~写Z份能体现需求应具备的所有特性的SRS。无Z怎么l化、分析、评论和优化需求,都不可能辑ֈ完美。但是,如果你牢记这些特性,你就会编写出更好的需求,生出更好的产品?/P> <P>高质量需求叙q的Ҏ?/P> <P>  我们如何从一些有问题的需求中分L出好的Y仉求?q一节将分别介绍需求叙q应体现?个特性,下一节将从整体上介绍SRS文应具备的Ҏ。判断每个需求是否具备应有的Ҏ的一U方式是由持有不同观点的工程资金理人所作的正规查。另一U有力的Ҏ是在~写代码前依据需求编写测试例子。测试例子能够明显现在需求中描述的品行为(Ҏ)Q能够显现缺陗冗余和含糊之处?</P> <P><BR>  正确Q每个需求必ȝ描q要交付的功能。正性依据于需求的来源Q如真实的客h高别的pȝ需求说明书。一个Y仉求与其对应的pȝ需求说明书相抵触是不正的Q当Ӟpȝ需求说明书本n可能不正)?/P> <P><BR>  只有用户的代表能够决定用户需求的正确性,q就是ؓ什么在查需求时Q要包括他们或他们的代理的关键所在。不包括用户的需求检查就会导致开发h员的Q“这是没意义的”,“这可能是他们的意思”等众所周知的猜?</P> <P><BR>  可行性:在已知的能力、有限的pȝ及其环境中每个需求必L可实现的。ؓ了避免需求的不可行性,在需求分析阶D应该有一个开发h员参与,在抽象阶D应该有市场人员参与。这个开发h员应能检查在技术上什么能做什么不能做Q哪些需要需要额外的付出或者和其他的权衡?/P> <P><BR>  必要性:每个需求应载明什么是客户实需要的Q什么要应于外部的需求,接口或标准。每个需求源于你认可、具有权说明需求的原始资料Q这是考虑必需的另外情形(译注Q此句翻译不,请参照原文:Another way to think of “necessary?is that each requirement originated from a source you recognize as having the authority to specify requirementsQ。跟t每个需求回溯到出处Q如用例Q系l需求,规章Q或来自其他用户的意见。如果你不能标识出处Q可能需求只是个镀金的例子Q没有真正的必须?/P> <P><BR>  优先权:Z表明在一个详l的产品版本中应包含哪些要点Q需要ؓ每个需求,特征Q或用例分配实现的优先权。客h其代理都应有强烈的责d立优先权。如果所有的需求都被视为同{重要,那么׃在开发中Q预削减,计划时或组员的dD新的需求时Q?目l理不能vC用。优先权的作用是提供l客L价|实现的相兌用,实现相关联的有关技术风险?</P> <P><BR>  我是?U别的优先权:高优先权表明需求必M现在下一个品版本中Q中优先权表明需求是必须的,但是如果需要可以推q到晚一些的产品版本中,低优先权表明有它很好Q但我们必须认识到如果没有充的旉或资源,它可以被攑ּ掉?/P> <P><BR>  明确Q需求叙q的读者应只能从其得到唯一的解释说明,同样Q一个需求的多个读者也应达成共识。自然语a极易D含糊。要避免使用一些对于SRS作者很清楚但对于读者不清楚的主观词汇,如:用户友好性,ҎQ简单,快速,有效Q几个,艺术U,改善的,最大,最等{。每写一个需要都应简z,单,直观的采用用L知的语言Q不要采用计机术语。检查需求模p的有效方式包括需求说明书的正规检查,Ҏ需求写试Q徏立用L假想来说明品某个特定部分预期的Ҏ?</P> <P><BR>  可证实:看你是否能够做出试计划或其他验证方式,如检查和实证Q来军_在品中每个需求是否正的实现。如果需求是不可验证的,军_需求是不是正确的实现就成了判断的事。需求之间不一_不可行,不明也能导致不可证实。Q何需求如果说产品要支持什么也是不可证实的?/P> <P>高质量需求说明的特征</P> <P>  一个完整的SRS不仅是包括长长的功能性需求列表,q包括外部接口描q和一些诸如质量属性,期望性能的非功能性需求。下面描qC高质量的SRS的一些特性?/P> <P><BR>  完整Q不应该遗漏要求和必需的信息。完整性也是一个需求应具备的。发现缺的信息很难Q因为根本不存在。在SRS中将需求以分层目录方式l织Q将帮助评审人员理解功能性描q的l构Q他们很容易指出遗q东西?/P> <P><BR>  在需求抽象时Q相对于pȝ功能Q你q多的注意用L业务Q将D在需求的全局观和引进不是真正必需的需求上昑־不。在需求抽象上Q应用用例方法会发挥很好的作用。能够从不同角度察看需求的囑Ş分析模型也可以检查出不完整性?</P> <P><BR>  如果你知道已~少一些信息,使用TBDQto be determinedQ标准标志可以突些缺P当你在构Z品的相关部分Ӟ可以从一个给定的需求集中解x有的~陷?/P> <P><BR>  一致性:一致性需求就是不要于其他的Y仉求或高别的pȝQ商业)需求发生冲H。需求中的不一致必d开发开始前得到解决。只有经q调研才能确定哪些是正确的。修攚w求时一定要谨慎Q如果只审定修改的部分,没有审定于修改相关的部分Q就可能D不一致性?/P> <P><BR>  可修Ҏ:当每个需求的要求修改了或l护其历史更ҎQ你必须能够审定SRS。也是说每个需求必ȝ对于其他需求有其单独的标示和分开的说明,便于清晰的查阅。通过良好的组l可以需求易于修改,如:相关的需求分l,建立目录表,索引Q以及前后参考(照)?/P> <P><BR>  可追t:你应能将一个Y件与其原始材料相对应Q如高pȝ需求,用例Q用L提议{。也能够Y仉求与设计元素Q源代码Q用于构造实现和验证需求的试相对应。可q踪的需求应该具有独立标C,l密和结构化的编写,不应q大Q不应是叙述性的文字和公告式的列表?需求质量的评审</P> <P>  q些有关需求质量的Ҏ的描述在理Z都是非常好的Q但一个好的需求到底是个什么样子的呢?Z体现得更切合实际Q我们做个小l习。下面有几个从实际的工程选出的需求,依据上面的质量标准,评估每个需求,看看有什么问题,然后用更好的方式重写。我对每个例子都提q分析和改q的。也Ƣ迎你提Z同的见解。我所占优的只是我知道每个需求的出处。因Z我都不是真正的客P我们只能猜测每个需求的意图?/P> <P>  ?Q“品应在不于?0U的正常周期内提供状态信息?BR>  q个需求是不完整的Q状态信息是什么,如何昄l用戗这个需求有几处含糊。我们在谈论产品的哪部分Q状态信息间隔真的假定ؓ不少?0U?Q甚者每10q显CZ条新的状态信息也可以Q也许它的意图是消息间隔不应过60U,那么1毫秒是不是太短?“每”这个词D了不定性。问题的后果Q就是需求的不可证实?BR>弥补~陷Q重写需求的一U方法:</P> <P><BR>  1、状态信?BR>  1Q?后台d理器因该以误差上下不超q?0U的60U间隔,在用L面的指定位置昄状态信?BR>  1Q?如果后台q程处理正常Q那么应该显CZQ务已完成的百分数/?BR>  1Q?d完成Ӟ应显C相关的信息 <BR>   1Q?后台d出错应该昄错误信息<BR>  Z分别试和追t,我将其分成了多个需求。如果将几个需求串接在一节中Q在构造和试时就很容易漏掉一个?/P> <P>  ?Q“品应瞬间在显C和隐藏不可打印字符间切换?<BR>  计算机在瞬间不能做Q何事Q所以这个需求不切实可行。它的不完整性表现在没有声明触发状态切换的条g。Y件要在某些条件下更改自己Q或者用户ؓ了模仿更改要做一些动作?而且Q在文档中改变显C的范围是多大:选中的文本,整个的文,或其他的Q这也是个模p的问题。不可打印字W合隐藏字符一样吗Q或者是一些属性标志或一些控制字W?问题的后果,是需求的不可证实?</P> <P><BR>  象这L写需求也许更好一些:“用戯够在一个由特定触发条gȀzd于编辑的文中在昄和隐藏所有HTML标记间切换”。现在就很清楚,不可打印字符是HTML标记。由于没有定义触发条Ӟ需求对设计没有U束力。只有设计h员选定了触发条件后Q你才能~写试验证触发的正操作?/P> <P>  ?Q“HTML分析器可以生HTML标记错误报告Q帮助HTML入门者快速解决错误”。单词“快速”其模p,没  有加q错误报告的定义也是光完整。我不知道,你怎么验证q个需求。找一个自UCؓHTML的入门者,看看能不能根据错误报告快速解决错误?</P> <P><BR>  试试q个Q“HTML分析器可以生一个错误报告,错误报告包含有在被分析文件中出错的HTML文本和行号以及错误的描述。如果没有错误,׃会生错误报告”。现在我们知道了Q什么会被加到出错报告中Q但是出错报告是个什么样子,则留p计h员决定。我们还指定了一个例外:如果没有发现错误Q不产生错误报告?/P> <P>  ?Q“如果可能,ȝL应通过联机校验Q而不是通过d体主号码列表校验”。真感到l望Q什么是“如果可能”:如果技术上可行Q如果主全体ȝL列表可以联机获得Q要避免象“应该”的q类不确切的词。客h需要这个功能性还是不需要。我曄q一些需求说明书Q采用诸如:应,,应该/要{一些词描述优先U的l微差别。但我更喜欢用“应”清楚的说明需求的意图Q指明优先。这是修改后的:pȝ应校验输入的ȝL而不通过联机的主全体dL列表。如果在列表中没有发C号码,会昄一条错误信息,也不接受指o?/P> <P><BR>  在理解各个已完成的糟p需求上Q开发h员将会遇到的N是:开发h员与客户会在审栔R求,未达成共识前发生Ȁ烈的争论。详l检查大的需求文不是一件轻杄事情。我清楚有h做过Q而且他们花在查上的每一分钟都是值得的。相对于开发阶D和用户的抱怨电话,在这个阶D修补缺h便宜的,</P> <P>~写质量需求的斚w</P> <P><BR>  ~写优秀的需求是没有公式化的Ҏ的。这需要大量的l验Q要从你在过ȝ文档中发现的问题学习。请在组lY仉求文时Q严格遵从这些方针?/P> <P><BR>  句子和段落要短。采用主动语气。用正的语法Q拼写,标点。用术语,要保持一致性,q在术语表或数据字典中定义它?/P> <P><BR>  要看需求是否被有效的定义,可以以开发h员的观点看看。在内心“当你们做完了找我”这句加到文档尾部,看看能不能是你紧张v来。换句话_你是否需要SRS的编写者的额外解释帮助开发h员很好的理解需求,以便于设计和实现Q如果是的话Q在l箋工作前,需求还需要细化?/P> <P><BR>  需求编写者还要努力正地把握l化E度。要避免包含多个需求的长的叙述D落。有帮助的提C是~写独立的可试的需求。如果你认ؓ一部分测试可以验证一个需求的正确Q那么它已经正确的细化了。如果你预想到多U不同类的测试,几个需求可能已挤到了一P需要拆分开?</P> <P><BR>  密切x多个需求合成了单个需求。一个需求中的连接词“和?“或”徏议几个需求合q。不要在一个需求中使用“和?“或”?/P> <P><BR>  通篇文l节上要保持一致。我曄见过多个需求说明书前后不一致。如Q“对于红色合法的颜色代码应是R”及“对于绿色合法的颜色代码应是G”就有可以以分散的需求分dQ而“品应能对来自语音~辑指示做出反应”应作ؓ一个子pȝQ不应作为单个的功能性需求?/P> <P><BR>  避免在SRS中过多的甌需求。在多处包含相同的需求可以文更易于阅读,但也会给文的维护增加困难。文档的多䆾文本要在同一旉内全部更斎ͼ避免不一致性?/P> <P>  如果你遵从了q些斚wQ你能够早地经常正式或非正式的审查需求,q些需求对于品的构造,pȝ试以及最后的客户满意Q都会成为好的奠基石。ƈ且要CQ没有高质量的需求,软gp一盒y克力Q你永远不知道你会得C么?<BR></P><!-- #EndEditable --><img src ="http://www.tkk7.com/guming123416/aggbug/35620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/guming123416/" target="_blank">天空苍茫</a> 2006-03-16 12:56 <a href="http://www.tkk7.com/guming123416/archive/2006/03/16/35620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式系l教E?----------(? http://www.tkk7.com/guming123416/archive/2006/01/23/29002.html天空苍茫天空苍茫Mon, 23 Jan 2006 05:11:00 GMThttp://www.tkk7.com/guming123416/archive/2006/01/23/29002.htmlhttp://www.tkk7.com/guming123416/comments/29002.htmlhttp://www.tkk7.com/guming123416/archive/2006/01/23/29002.html#Feedback0http://www.tkk7.com/guming123416/comments/commentRss/29002.htmlhttp://www.tkk7.com/guming123416/services/trackbacks/29002.html
      前言

        正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读q些资料Q加上应用的时候进行一定的参考,掌握正则表达式不是问题?BR>
      索引

      1. 引子
        目前Q正则表辑ּ已经在很多Y件中得到q泛的应用,包括*nixQLinux, Unix{)QHP{操作系l,PHPQC#QJava{开发环境,以及很多的应用Y件中Q都可以看到正则表达式的影子?BR>
        正则表达式的使用Q可以通过单的办法来实现强大的功能。ؓ了简单有效而又不失强大Q造成了正则表辑ּ代码的难度较大,学习h也不是很ҎQ所以需要付Z些努力才行,入门之后参照一定的参考,使用hq是比较单有效的?BR>
        例子Q?^.+@.+\\..+$

        q样的代码曾l多ơ把我自q吓退q。可能很多h也是被这L代码l吓跑的吧。l阅L文将让你也可以自由应用这L代码?BR>
        注意Q这里的W?部分跟前面的内容看v来似乎有些重复,目的是把前面表格里的部分重新描述了一ơ,目的是让q些内容更容易理解?BR>2. 正则表达式的历史

        正则表达式的“祖先”可以一直上溯至对hcȝl系l如何工作的早期研究。Warren McCulloch ?Walter Pitts q两位神l生理学家研I出一U数学方式来描述q些经|络?BR>
         1956 q? 一位叫 Stephen Kleene 的数学家?McCulloch ?Pitts 早期工作的基上,发表了一标题ؓ“神l网事g的表C法”的论文Q引入了正则表达式的概念。正则表辑ּ是用来描述他称为“正则集的代数”的表达式,?此采用“正则表辑ּ”这个术语?BR>
        随后Q发现可以将q一工作应用于?Ken Thompson 的计搜索算法的一些早期研IӞKen Thompson ?Unix 的主要发明h。正则表辑ּ的第一个实用应用程序就?Unix 中的 qed ~辑器?BR>
        如他们所_剩下的就是众所周知的历史了。从那时L至现在正则表辑ּ都是Z文本的编辑器和搜索工具中的一个重要部分?BR>3. 正则表达式定?BR>
        正则表达?regular expression)描述了一U字W串匚w的模式,可以用来查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?BR>
        列目录时Q dir *.txt或ls *.txt中的*.txt׃是一个正则表辑ּ,因ؓq里*与正则式?的含义是不同的?

        正则表达式是由普通字W(例如字符 a ?zQ以及特D字W(UCؓ元字W)l成的文字模式。正则表辑ּ作ؓ一个模板,某个字W模式与所搜烦的字W串q行匚w?BR>
        3.1 普通字W?BR>
        由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以及一些符受?

        3.2 非打印字W?BR>
      字符 含义
      \cx 匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/TD>
      \f 匚w一个换늬。等价于 \x0c ?\cL?/TD>
      \n 匚w一个换行符。等价于 \x0a ?\cJ?/TD>
      \r 匚w一个回车符。等价于 \x0d ?\cM?/TD>
      \s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/TD>
      \S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/TD>
      \t 匚w一个制表符。等价于 \x09 ?\cI?/TD>
      \v 匚w一个垂直制表符。等价于 \x0b ?\cK?/TD>

       
        3.3 Ҏ字符

        所谓特D字W,是一些有Ҏ含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W?BR>
      特别字符 说明
      $ 匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/TD>
      ( ) 标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/TD>
      * 匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/TD>
      + 匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/TD>
      . 匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/TD>
      [ 标记一个中括号表达式的开始。要匚w [Q请使用 \[?/TD>
      ? 匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/TD>
      \ 下一个字W标Cؓ或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/TD>
      ^ 匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/TD>
      { 标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/TD>
      | 指明两项之间的一个选择。要匚w |Q请使用 \|?/TD>


        构造正则表辑ּ的方法和创徏数学表达式的Ҏ一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?
       

        3.4 限定W?BR>
        限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?BR>
        *??限定W都是贪婪的Q因为它们会可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?BR>
        正则表达式的限定W有Q?BR>
      字符 描述
      * 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/TD>
      + 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/TD>
      ? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/TD>
      {n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/TD>
      {n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/TD>
      {n,m} m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/TD>


        3.5 定位W?/STRONG>

        用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界?SPAN style="COLOR: rgb(255,0,0)">不能对定位符使用限定W?


        3.6 选择

        用圆括号所有选择ҎhQ相ȝ选择之间用|分隔。但用圆括号会有一个副作用Q是相关的匹配会被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?BR>
        其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦字符丌Ӏ?

        3.7 后向引用

         对一个正则表辑ּ模式或部分模式两Ҏ加圆括号导致相兛_配存储到一个时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内 容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?BR>
        可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存?
      4. 各种操作W的q算优先U?BR>
        相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?BR>
      操作W? 描述
      \ 转义W?/TD>
      (), (?:), (?=), [] 圆括号和Ҏ?/TD>
      *, +, ?, {n}, {n,}, {n,m} 限定W?/TD>
      ^, $, \anymetacharacter 位置和顺?/TD>
      | “或”操?/TD>
      5. 全部W号解释

      字符 描述
      \ 下一个字W标Cؓ一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/TD>
      ^ 匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/TD>
      $ 匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/TD>
      * 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/TD>
      + 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/TD>
      ? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/TD>
      {n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/TD>
      {n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/TD>
      {n,m} m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/TD>
      ? 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/TD>
      . 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/TD>
      (pattern) 匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/TD>
      (?:pattern) 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/TD>
      (?=pattern) 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/TD>
      (?!pattern) 负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?/TD>
      x|y 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/TD>
      [xyz] 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/TD>
      [^xyz] 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/TD>
      [a-z] 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/TD>
      [^a-z] 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/TD>
      \b 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/TD>
      \B 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/TD>
      \cx 匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/TD>
      \d 匚w一个数字字W。等价于 [0-9]?/TD>
      \D 匚w一个非数字字符。等价于 [^0-9]?/TD>
      \f 匚w一个换늬。等价于 \x0c ?\cL?/TD>
      \n 匚w一个换行符。等价于 \x0a ?\cJ?/TD>
      \r 匚w一个回车符。等价于 \x0d ?\cM?/TD>
      \s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/TD>
      \S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/TD>
      \t 匚w一个制表符。等价于 \x09 ?\cI?/TD>
      \v 匚w一个垂直制表符。等价于 \x0b ?\cK?/TD>
      \w 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/TD>
      \W 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/TD>
      \xn 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
      \num 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/TD>
      \n 标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/TD>
      \nm 标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/TD>
      \nml 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?/TD>
      \un 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/TD>
      6. 部分例子

      正则表达?/TH> 说明
      /\b([a-z]+) \1\b/gi 一个单词连l出现的位置
      /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 一个URL解析为协议、域、端口及相对路径
      /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位|?/TD>
      /[-a-z]/ A至z?6个字母再加一?受?/TD>
      /ter\b/ 可匹配chapterQ而不能terminal
      /\Bapt/ 可匹配chapterQ而不能aptitude
      /Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的索匹配?/TD>
      7. 正则表达式匹配规?BR>
        7.1 基本模式匚w

        一切从最基本的开始。模式,是正规表辑ּ最基本的元素,它们是一l描q字W串特征的字W。模式可以很单,由普通的字符串组成,也可以非常复杂,往往用特D的字符表示一个范围内的字W、重复出玎ͼ或表CZ下文。例如:

        ^once

         q个模式包含一个特D的字符^Q表C模式只匹配那些以once开头的字符丌Ӏ例如该模式与字W串"once upon a time"匚wQ与"There once was a man from NewYork"不匹配。正如如^W号表示开头一P$W号用来匚w那些以给定模式结字符丌Ӏ?BR>
        bucket$

        q个模式?Who kept all of this cash in a bucket"匚wQ与"buckets"不匹配。字W^?同时使用Ӟ表示_匚wQ字W串与模式一P。例如:

        ^bucket$

        只匹配字W串"bucket"。如果一个模式不包括^?Q那么它与Q何包含该模式的字W串匚w。例如:模式

        once

        与字W串

        There once was a man from NewYork
        Who kept all of his cash in a bucket.

        是匹配的?BR>
         在该模式中的字母(o-n-c-e)是字面的字符Q也是_他们表示该字母本w,数字也是一L。其他一些稍微复杂的字符Q如标点W号和白字符Q空 根{制表符{)Q要用到转义序列。所有的转义序列都用反斜?\)打头。制表符的{义序列是Q\t。所以如果我们要一个字W串是否以制表符开_可以 用这个模式:

        ^\t

        cM的,用\n表示“新行”,\r表示回R。其他的ҎW号Q可以用在前面加上反斜杠Q如反斜杠本w用\\表示Q句?用\.表示Q以此类推?BR>
        7.2 字符?BR>
        在INTERNET的程序中Q正规表辑ּ通常用来验证用户的输入。当用户提交一个FORM以后Q要判断输入的电话号码、地址、EMAIL地址、信用卡L{是否有效,用普通的Z字面的字W是不够的?BR>
        所以要用一U更自由的描q我们要的模式的办法Q它是字符。要建立一个表C所有元韛_W的字符,把所有的元音字符攑֜一个方括号里:

        [AaEeIiOoUu]

        q个模式与Q何元韛_W匹配,但只能表CZ个字W。用q字号可以表CZ个字W的范围Q如Q?BR>
        [a-z] //匚w所有的写字母
        [A-Z] //匚w所有的大写字母
        [a-zA-Z] //匚w所有的字母
        [0-9] //匚w所有的数字
        [0-9\.\-] //匚w所有的数字Q句号和减号
        [ \f\r\t\n] //匚w所有的白字W?

        同样的,q些也只表示一个字W,q是一个非帔R要的。如果要匚w一个由一个小写字母和一位数字组成的字符Ԍ比如"z2"?t6"?g7"Q但不是"ab2"?r2d3" ?b52"的话Q用q个模式Q?BR>
        ^[a-z][0-9]$

        管[a-z]代表26个字母的范围Q但在这里它只能与第一个字W是写字母的字W串匚w?BR>
        前面曄提到^表示字符串的开_但它q有另外一个含义。当在一l方括号里用^是,它表C“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子Q我们要求第一个字W不能是数字Q?BR>
        ^[^0-9][0-9]$

        q个模式?&5"?g7"?-2"是匹配的Q但?12"?66"是不匚w的。下面是几个排除特定字符的例子:

        [^a-z] //除了写字母以外的所有字W?
        [^\\\/\^] //除了(\)(/)(^)之外的所有字W?
        [^\"\'] //除了双引?")和单引号(')之外的所有字W?

        Ҏ字符"." (点,句号)在正规表辑ּ中用来表C除了“新行”之外的所有字W。所以模?^.5$"与Q何两个字W的、以数字5l尾和以其他非“新行”字W开头的字符串匹配。模?."可以匚wM字符Ԍ除了IZ和只包括一个“新行”的字符丌Ӏ?BR>
        PHP的正规表辑ּ有一些内|的通用字符,列表如下Q?BR>
        字符含?

        [[:alpha:]] M字母
        [[:digit:]] M数字
        [[:alnum:]] M字母和数?
        [[:space:]] M白字W?
        [[:upper:]] M大写字母
        [[:lower:]] M写字母
        [[:punct:]] M标点W号
        [[:xdigit:]] M16q制的数字,相当于[0-9a-fA-F]

        7.3 定重复出现

        到现在ؓ止,你已l知道如何去匚w一个字母或数字Q但更多的情况下Q可能要匚w一个单词或一l数字。一个单词有若干个字母组成,一l数字有若干个单数组成。跟在字W或字符后面的花括?{})用来定前面的内容的重复出现的次数?

        字符?含义
        ^[a-zA-Z_]$ 所有的字母和下划线
        ^[[:alpha:]]{3}$ 所有的3个字母的单词
        ^a$ 字母a
        ^a{4}$ aaaa
        ^a{2,4}$ aa,aaa或aaaa
        ^a{1,3}$ a,aa或aaa
        ^a{2,}$ 包含多于两个a的字W串
        ^a{2,} 如:aardvark和aaabQ但apple不行
        a{2,} 如:baad和aaaQ但Nantucket不行
        \t{2} 两个制表W?
        .{2} 所有的两个字符

         q些例子描述了花括号的三U不同的用法。一个数字,{x}的意思是“前面的字符或字W簇只出现xơ”;一个数字加逗号Q{x,}的意思是“前面的内容?现x或更多的ơ数”;两个用逗号分隔的数字,{x,y}表示“前面的内容臛_出现xơ,但不过yơ”。我们可以把模式扩展到更多的单词或数字:

        ^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划U的字符?
        ^[0-9]{1,}$ //所有的正数
        ^\-{0,1}[0-9]{1,}$ //所有的整数
        ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的数

         最后一个例子不太好理解Q是吗?q么看吧Q与所有以一个可选的负号(\-{0,1})开?^)、跟着0个或更多的数?[0-9]{0,})、和一?可选的数?\.{0,1})再跟?个或多个数字([0-9]{0,})Qƈ且没有其他Q何东?$)。下面你知道能够用的更ؓ单的Ҏ?BR>
        Ҏ字符"?"与{0,1}是相{的Q它们都代表着Q?个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以化ؓQ?BR>
        ^\-?[0-9]{0,}\.?[0-9]{0,}$

        Ҏ字符"*"与{0,}是相{的Q它们都代表着?个或多个前面的内容”。最后,字符"+"?{1,}是相{的Q表C?个或多个前面的内容”,所以上面的4个例子可以写成:

        ^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划U的字符?
        ^[0-9]+$ //所有的正数
        ^\-?[0-9]+$ //所有的整数
        ^\-?[0-9]*\.?[0-9]*$ //所有的数

        当然qƈ不能从技术上降低正规表达式的复杂性,但可以它们更容易阅诅R?BR>

      天空苍茫 2006-01-23 13:11 发表评论
      ]]> վ֩ģ壺 AVƬ߲| ޹˳߹ۿ| Ƶ߹ۿ| йһëƬƵѿ| AV| Ʒ鶹123| ޾Ʒ91רֻ | Ƶ| ҹëƬ| 95ѹۿƵ| ޹ۺ| Ʒ| ޾Ʒ㶮| ޹߶| ˵www| ޳AӰԺ߹ۿ | ҹþ| þ޹˾Ʒɫ| ձ߹ۿ| ˳www| ˾Ʒֱ| ޶߹ۿվ| ɫƬѹۿ| ĻĻmv| þþþƵ| Ʒþþþþ| yellowվ| ɫӴӴƷѹۿ| þŷƷ| AVվ߹ۿ| ͼƬӰ| ޳aƬ߹ۿapp| ۺϼС˵| պAVһ | һƵ | 97߹Ƶۿ| Ƶվ߹ۿ| 99ƵȫѾƷȫĻ | AVרAVëվ | ڳ˾Ʒձ | ҳվѹۿ|