安安的BLOG

安安目前专注电子商务解决方案^_^

 

2008年8月30日

网络路径结点回溯分析工具

测试采用世界网络(http://www.linkwan.com/vr/) Visualroute网络路径结点回溯分析工具

posted @ 2008-08-30 10:53 安安 阅读(15) | 评论 (0)编辑

telnet命令

telnet命令可以缩写。支持的命令为:

c    - close                    关闭当前连接
d    - display                  显示操作参数
o    - open hostname [port]     连接到主机名称(默认端口 23)。
q    - quit                     退出 telnet
set  - set                      设置选项 (要列表,请键入 'set ?')
sen  - send                     将字符串发送到服务器
st   - status                   打印状态信息
u    - unset                    解除设置选项 (要列表,请键入 'unset ?')
?/h  - help                     打印帮助信息


Telnet远程登录服务分为以下4个过程:

1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的Ip地址或域名;

2)将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据报;

3)将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;

4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。


Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务:

1)Telnet定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的程序;

2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项;

3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。

Win2000为我们提供了Telnet客户机和服务器程序:Telnet.exe是客户机程序(Client),tlntsvr.exe是服务器程序(server),同时它还为我们提供了Telnet服务器管理程序tlntadmn.exe。

Windows 2000 默认安装了 Telnet 服务,但是并没有默认启动。下面给出HELP文件中 Telnet 服务的一部分默认设置:

AllowTrustedDomain:是否允许域用户访问。默认值是1,允许信任域用户访问。可以改为0: 不允许域用户访问(只允许本地用户)。

DefaultDomain:可以对与该计算机具有信任关系的任何域设置。默认值是"."。

DefaultShell:显示 shell 安装的路径位置。默认值是: %systemroot%\System32\Cmd.exe /q /k

MaxFailedLogins:在连接终止之前显示尝试登录失败的最大次数。默认是3。

LoginScript:显示 Telnet 服务器登录脚本的路径位置。默认的位置就是“%systemroot%\System32\login.cmd”,你可以更改脚本内容,这样登录进Telnet的欢迎屏幕就不一样了。

NTLM:NTLM身份验证选项。默认是2。可以有下面这些值:
0: 不使用 NTLM 身份验证。
1: 先尝试 NTLM 身份验证,如果失败,再使用用户名和密码。
2: 只使用 NTLM 身份验证。

TelnetPort:显示 telnet 服务器侦听 telnet 请求的端口。默认是:23。你也可以更改为其他端口。

以上各项设置你可以使用tlntadmn.exe(Telnet服务器管理程序)来进行非常方便的配置,配置后需要重新启动Telnet服务。


对于入侵者来说,NTLM是横在我们面前的一座大山,必须要除掉它,一般我们有如下几种方法:

1通过修改远程注册表更改telnet服务器配置,将验证方式从2改为1或0;
2使用NTLM.exe,上传后直接运行,可将telnet服务器验证方式从2改为1;
3在本地建立扫描到的用户,以此用户身份开启telnet客户机并进行远程登录;
4使用软件,比如opentelnet.exe(需要管理员权限且开启IPC管道)
5使用脚本,如RTCS,(需要管理员权限但不依赖IPC管道)

基本上是以上的5种,其中后两种是我们比较常用的开telnet的手法,而且使用方法十分简单,命令如下:

OpenTelnet.exe http://www.cnblogs.com/anan/admin/file://server/ username password NTLMAuthor telnetport
OpenTelnet.exe \\服务器地址 管理员用户名 密码 验证方式(填0或1) telnet端口

cscript RTCS.vbe targetIP username password NTLMAuthor telnetport
cscript RTCS.vbe <目标IP> <管理员用户名> <密码> <验证方式> <tlnet端口>


 

posted @ 2008-08-30 08:38 安安 阅读(12) | 评论 (0)编辑

2008年8月16日

品牌机用Vista光盘分区

1. 用Vista光盘启动电脑,不安装系统,选择修复计算机
2. 点击修复Vista系统,进CMD命令提示符环境。界面X:\Source>
3. 输入 diskpart
4. 进入 DISKPART>
5. 用“select disk 0”命令选中系统的第一硬盘
6. 用“list partition”命令查看该硬盘的分区情况
7. 用“select partition 1”选中我们即将进行操作的第一分区
8. 用“shrink querymax”命令查看C:驱动器可以释放的磁盘空间
9. 用“shrink desired = 35000”磁盘空间释放出来(35G)
10.用“exit”命令退出Diskpart工作环境

posted @ 2008-08-16 13:07 安安 阅读(10) | 评论 (0)编辑

2008年8月6日

sql server中为某个整数前加上一定数量的0,如1,要返回00001

select replace(space(5-Len(ltrim(str(field1)))),' ','0')+ltrim(str(field1))

select right('0000'+CONVERT(varchar(5),field1),5)

 

如:

DECLARE @MyCounter INT
set @MyCounter=3
select replace(space(5-Len(ltrim(str(@MyCounter)))),' ','0')+ltrim(str(@MyCounter))
select right('0000'+CONVERT(varchar(5),@MyCounter),5)

 

DECLARE @MyCounter INT
set @MyCounter=30
select replace(space(5-Len(ltrim(str(@MyCounter)))),' ','0')+ltrim(str(@MyCounter))
select right('0000'+CONVERT(varchar(5),@MyCounter),5)

 

DECLARE @MyCounter INT
set @MyCounter=600
select replace(space(5-Len(ltrim(str(@MyCounter)))),' ','0')+ltrim(str(@MyCounter))
select right('0000'+CONVERT(varchar(5),@MyCounter),5)

posted @ 2008-08-06 14:20 安安 阅读(12) | 评论 (0)编辑

2008年7月3日

word-wrap,word-break,white-space,text-overflow的区别和用法

在div中,文本布局经常出现,换行混乱的情况。
问题表现:1.如果是全英文字符串,中间不包含任何符号(包括空格),不自动换行.
          2.中英文混写,则在英文字符串的开始处换行(英文长度>div长度),结尾处不换行。
          3.英文整个单词换行。等等,可能还有一些问题,这里只列出了常见的几个;

介绍上面几个css属性功能的简单用法;
word-wrap:normal | break-word; (内容换行)
         normal:默认的属性值.(允许内容顶开指定的容器边界).
         break-word:内容将在边界内换行(不截断英文单词换行,截断英文单词下面的属性才具备这个功能。) 

word-break:normal | break-all | keep-all (词内换行)
           normal:如果是中文则到边界处的汉字换行,如果是英文整个词换行,注意:如果出现某个英文字符串长度超过边界,则后面的部分将撑开边框,如果边框为固定属性,则后面部分将无法显示.
           break-all : 强行换行,将截断英文单词
           keep-all : 不允许字断开。如果是中文将把前后标点符号内的一个汉字短语整个换行,英文单词也整个换行,注意:如果出现某个英文.字符串长度超过边界,则后面的部分将撑开边框,如果边框为固定属性,则后面部分将无法显示.

text-overflow:clip | ellipsis  (文本溢出)
             clip :  不显示省略标记(...),而是简单的裁切
             ellipsis :  当对象内文本溢出时(超过width部分)显示省略标记(...)

white-space: normal | pre | nowrap  (内容不换行)
 normal 默认。空白会被浏览器忽略。
 pre 空白会被浏览器保留。其行为方式类似 HTML 中的 <pre> 标签。
 nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。
(层中放一个表格,如果层的float:none  则表格和层间会有空隙,这种问题的解决办法是在层的style里面加上white-space: nowrap)


使用方式: word-break:break-all;

一般情况下:
.body{
       word-wrap:break-word;
       word-break:keep-all;
       overflow:hidden;
}

.css{
      text-overflow:ellipsis;
      white-space:nowrap;
      overflow:hidden;
}

IE与Firefox将它看成是一个长单词了,因此不会自动换行。
对于IE,可以通过IE专有的CSS属性word-wrap即可实现自动换行:word-wrap:break-word;

对于Firefox,CSS2标准并没有定义类似word-wrap的属性,可以通过overflow属性将撑出的部分隐藏:overflow:hidden

posted @ 2008-07-03 10:50 安安 阅读(136) | 评论 (0)编辑

2008年6月5日

修改远程桌面的端口

1.  打开注册表,进入以下路径:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp],看见PortNamber值了吗?其默认值是3389,修改成所希望的端口即可,例如6111。

2. 仅仅修改这一项,就好了
再打开[HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro1Set\Control\Tenninal Server\WinStations\RDP\Tcp],将PortNumber的值(默认是3389)修改成端口6111。

3. 修改完毕,重新启动电脑,以后远程登录的时候使用端口6111就可以了,格式为"IP:new-port"。

posted @ 2008-06-05 09:35 安安 阅读(149) | 评论 (0)编辑

2008年6月1日

网络工具命令

1.ping—这个命令能够检查与某个地址的连通情况。
2.ipconfig—据微软自己的描述,这个工具本来只是设计来显示默认的IP地址、子掩码和网关信息的。但除了能够列出TCP/IP网络配置参数外,用户还可以刷新DHCP和DNS设置。
3.net—它是一个通用的工具,其中包含的众多命令覆盖了非常多的功能。
4.netstat—显示协议统计情况和TCP/IP网络链接。
5.netsh—这个命令行工具使得Vista用户能够浏览和改变电脑的网络设置。
6.nslookup—通过这个命令可以查询到域名的相关信息。
7.hostname—不知道自己电脑在网络上的主机名是什么吗?输入这个命令并按回车就会知道。
8.getmac—通过这个命令可以显示网卡的物理地址。网卡的物理地址可以在本地电脑上访问,也可以通过网络远程访问。
9.nbtstat—该命令使用TCP/IP上的NetBIOS显示协议统计当前TCP/IP的连接。
10.tracert—通过这个命令行工具能够检查出本地计算机与某网络地址的链接问题。
11.route—操纵网络路由表。
12.pathping—它捆绑了traceroute和ping提供的功能


常用命令

sndrec32   录音机
nslookup   IP地址侦测器
explorer    打开资源管理器
logoff    注销命令
tsshutdn    60秒倒计时关机命令
notepad    打开记事本
cleanmgr    垃圾整理
conf    启动 netmeeting
calc    启动计算器
rononce -p    15秒关机
dxdiag    检查DirectX信息
regedit    注册表编辑器
msconfig    系统配置实用程序
winchat    XP自带局域网聊天
progman    程序管理器

perfmon.msc    性能监测程序
winmsd    系统信息
regsvr32 /u *.dll    停止指定 Dll 文件运行
net start messenger    开始信使服务
compmgmt.msc    计算机管理
net stop messenger    停止信使服务
taskmgr    任务管理器(2000/xp/2003)


posted @ 2008-06-01 16:05 安安 阅读(21) | 评论 (0)编辑

2008年5月4日

回车事件

设置在页面回车时触发事件的控件

  /// <summary>
        /**//// <summary>
        /// 设置在页面回车时触发事件的控件
        /// </summary>
        /// <param name="Ctrl">将触发事件的控件对象</param>
        public static void SetEnterControl(System.Web.UI.Control Ctrl)
        {
            System.Web.UI.Page mPage = Ctrl.Page;
            string mScript;
            mScript = @"<script language=""javascript"">
                        function document.onkeydown()
                        {
                        var e = event.srcElement;
                        var k = event.keyCode;
                        if (k == 13 && e.type != ""textarea"")
                        {
                        document.all." + Ctrl.ClientID + @".click();
                        event.cancelBubble = true;
                        event.returnValue = false;
                        }
                        }
                        </script>";
            if(!mPage.IsClientScriptBlockRegistered("SetEnterControl"))
                mPage.RegisterClientScriptBlock("SetEnterControl",mScript);
        }

产生由英文和数字组成的指定个数的随机数(转)
        /**//// <summary>
        /// 产生由英文和数字组成的指定个数的随机数
        /// </summary>
        /// <param name="number">产生随机数的个数</param>
        /// <returns>指定个数的随机英数字符串</returns>
        public static string GetRandomCode(int number)
        {
            string[] arrList = new string[] {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G",
                                                "H","I","J","K","L","M","N","O","P","Q","R","S","T","U","W","X","Y","Z"} ;
            StringBuilder sb = new StringBuilder("") ;
            Random random = new Random() ;
 
            for( int i = 0 ; i < number ; i++ )
            {
                sb.Append(arrList[(int)random.Next(0,arrList.Length)]) ;
            }
 
            return sb.ToString() ;
        }

posted @ 2008-05-04 13:34 安安 阅读(41) | 评论 (0)编辑

2008年4月20日

Lucene.Net 简介

Lucene 简介
Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。

图 1 表示了搜索应用程序和 Lucene 之间的关系,也反映了利用 Lucene 构建搜索应用程序的流程:


索引和搜索

     索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。
     为什么索引这么重要呢?试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。

     Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词/短语表,对于这个表中的每个词/短语,都有一个链表描述了有哪些文档包含了这个词/短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。

     由于 Lucene 提供了简单易用的 API,所以即使读者刚开始对全文本进行索引的机制并不太了解,也可以非常容易的使用 Lucene 对你的文档实现索引。

     对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。

Lucene 命名空间分析

命名空间: Lucene.Net.Documents
这个命名空间提供了一些为封装要索引的文档所需要的类,比如 Document, Field。
这样,每一个文档最终被封装成了一个 Document 对象。

命名空间: Lucene.Net.Analysis
这个命名空间主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。

命名空间: Lucene.Net.Index
这个命名空间提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。

命名空间: Lucene.Net.Search
这个命名空间提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。

posted @ 2008-04-20 11:34 安安 阅读(93) | 评论 (0)编辑

2008年4月19日

Lucene.Net学习

1. 基于内存的索引
private Directory directory = new RAMDirectory();
2. 基于目录的索引
从指定目录打开已有索引库。
private Directory directory = FSDirectory.GetDirectory("c:\index",false);
* true 时将删除已有索引库文件,可以通过 IndexReader.IndexExists() 方法判断。
* false 时将使增量索引
3. 将索引库载入内存,以提高搜索速度。
private Directory directory = new RAMDirectory(FSDirectory.GetDirectory(@"c:\index", false));
//或
//private Directory directory = new RAMDirectory(c:\index");

4. 合并索引库
将 directory1 合并到 directory2 中。
Directory directory1 = FSDirectory.GetDirectory("index1", false);
Directory directory2 = FSDirectory.GetDirectory("index2", false);

IndexWriter writer = new IndexWriter(directory2, analyzer, false);
writer.AddIndexes(new Directory[] { directory1 });
Console.WriteLine(writer.DocCount());
writer.Close();


5. 搜索
Query query = QueryParser.Parse("name2", FieldName, analyzer);
IndexSearcher searcher = new IndexSearcher(directory);
Hits hits = searcher.Search(query);
6. 多字段搜索
Query query = MultiFieldQueryParser.Parse("name*", new string[] { FieldName, FieldValue }, analyzer);

IndexReader reader = IndexReader.Open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);
7. 遍历搜索结果集
for (int i = 0; i < hits.Length(); i++)
{
    int docId = hits.Id(i);
    string name = hits.Doc(i).Get(FieldName);
    string value = hits.Doc(i).Get(FieldValue);
    float score = hits.Score(i);

    Console.WriteLine("{0}: DocId:{1}; Name:{2}; Value:{3}; Score:{4}",
      i + 1, docId, name, value, score);
}
8. 多条件搜索
除了使用 QueryParser.Parse 分解复杂的搜索语法外,还可以通过组合多个 Query 来达到目的。
Query query1 = new TermQuery(new Term(FieldValue, "name1")); // 词语搜索
Query query2 = new WildcardQuery(new Term(FieldName, "name*")); // 通配符
//Query query3 = new PrefixQuery(new Term(FieldName, "name1")); // 字段搜索 Field:Keyword,自动在结尾添加 *
//Query query4 = new RangeQuery(new Term(FieldNumber, NumberTools.LongToString(11L)), new Term(FieldNumber, NumberTools.LongToString(13L)), true); // 范围搜索
//Query query5 = new FilteredQuery(query, filter); // 带过滤条件的搜索
     
BooleanQuery query = new BooleanQuery();
query.Add(query1, BooleanClause.Occur.MUST);
query.Add(query2, BooleanClause.Occur.MUST);

IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);
9. 设置权重
可以给 Document 和 Field 增加权重(Boost),使其在搜索结果排名更加靠前。缺省情况下,搜索结果以 Document.Score 作为排序依据,该数值越大排名越靠前。Boost 缺省值为 1。

Score = Score * Boost

通过上面的公式,我们就可以设置不同的权重来影响排名。

如下面的例子中根据 VIP 级别设定不同的权重。
Document document = new Document();
switch (vip)
{
  case VIP.Gold: document.SetBoost(2F); break;
  case VIP.Argentine: document.SetBoost(1.5F); break;
}

只要 Boost 足够大,那么就可以让某个命中结果永远排第一位,这就是百度等网站的"收费排名"业务。明显有失公平,鄙视一把。
10. 排序
通过 SortField 的构造参数,我们可以设置排序字段,排序条件,以及倒排。
Sort sort = new Sort(new SortField(FieldName, SortField.DOC, false));

IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query, sort);

排序对搜索速度影响还是很大的,尽可能不要使用多个排序条件。
11. 过滤
使用 Filter 对搜索结果进行过滤,可以获得更小范围内更精确的结果。

举个例子,我们搜索上架时间在 2005-10-1 到 2005-10-30 之间的商品。
对于日期时间,我们需要转换一下才能添加到索引库,同时还必须是索引字段。
// index
document.Add(FieldDate, DateField.DateToString(date), Field.Store.YES, Field.Index.UN_TOKENIZED);

//...

// search
Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-1"), DateTime.Parse("2005-10-30"));
Hits hits = searcher.Search(query, filter);

除了日期时间,还可以使用整数。比如搜索价格在 100 ~ 200 之间的商品。
Lucene.Net NumberTools 对于数字进行了补位处理,如果需要使用浮点数可以自己参考源码进行。
// index
document.Add(new Field(FieldNumber, NumberTools.LongToString((long)price), Field.Store.YES, Field.Index.UN_TOKENIZED));

//...

// search
Filter filter = new RangeFilter(FieldNumber, NumberTools.LongToString(100L), NumberTools.LongToString(200L), true, true);
Hits hits = searcher.Search(query, filter);

使用 Query 作为过滤条件。
QueryFilter filter = new QueryFilter(QueryParser.Parse("name2", FieldValue, analyzer));

我们还可以使用 FilteredQuery 进行多条件过滤。

Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-10"), DateTime.Parse("2005-10-15"));
Filter filter2 = new RangeFilter(FieldNumber, NumberTools.LongToString(11L), NumberTools.LongToString(13L), true, true);

Query query = QueryParser.Parse("name*", FieldName, analyzer);
query = new FilteredQuery(query, filter);
query = new FilteredQuery(query, filter2);

IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);

12. 显示搜索语法字符串
我们组合了很多种搜索条件,或许想看看与其对等的搜索语法串是什么样的。
BooleanQuery query = new BooleanQuery();
query.Add(query1, true, false);
query.Add(query2, true, false);
//...

Console.WriteLine("Syntax: {0}", query.ToString());

输出:
Syntax: +(name:name* value:name*) +number:[0000000000000000b TO 0000000000000000d]

呵呵,就这么简单。

13. 操作索引库
删除 (软删除,仅添加了删除标记。调用 IndexWriter.Optimize() 后真正删除。)
IndexReader reader = IndexReader.Open(directory);

// 删除指定序号(DocId)的 Document。
reader.Delete(123);

// 删除包含指定 Term 的 Document。
reader.Delete(new Term(FieldValue, "Hello"));

// 恢复软删除。
reader.UndeleteAll();

reader.Close();

增量更新 (只需将 create 参数设为 false,即可往现有索引库添加新数据。)
Directory directory = FSDirectory.GetDirectory("index", false);
IndexWriter writer = new IndexWriter(directory, analyzer, false);
writer.AddDocument(doc1);
writer.AddDocument(doc2);
writer.Optimize();
writer.Close();

14. 优化
批量向 FSDirectory 增加索引时,增大合并因子(mergeFactor )和最小文档合并数(minMergeDocs)有助于提高性能,减少索引时间。

在往磁盘上写索引文件的过程中,Lucene 在内存中持有一块缓冲区。
Lucene 的类 IndexWriter 提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。

1.合并因子 (mergeFactor)

这个参数决定了在 Lucene 的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率。比如,如果合并因子的值是 10,那么当内存中的文档数达到 10 的时候所有的文档都必须写到磁盘上的一个新的索引块中。并且,如果磁盘上的索引块的隔数达到 10 的话,这 10 个索引块会被合并成一个新的索引块。这个参数的默认值是 10,如果需要索引的文档数非常多的话这个值将是非常不合适的。对批处理的索引来讲,为这个参数赋一个比较大的值会得到比较好的索引效果。

2.最小合并文档数 (minMergeDocs)

这个参数也会影响索引的性能。它决定了内存中的文档数至少达到多少才能将它们写回磁盘。这个参数的默认值是10,如果你有足够的内存,那么将这个值尽量设的比较大一些将会显著的提高索引性能。

3.最大合并文档数 (maxMergeDocs)

这个参数决定了一个索引块中的最大的文档数。它的默认值是 Integer.MAX_VALUE,将这个参数设置为比较大的值可以提高索引效率和检索速度,由于该参数的默认值是整型的最大值,所以我们一般不需要改动这个参数。

IndexWriter writer = new IndexWriter(directory, analyzer, true);

writer.maxFieldLength = 1000; // 字段最大长度
writer.mergeFactor = 1000;
writer.minMergeDocs = 1000;

for (int i = 0; i < 10000; i++)
{
  // Add Documentes...
}

writer.Optimize();
writer.Close();

15. 分布搜索
我们可以使用 MultiReader 或 MultiSearcher 搜索多个索引库。

MultiReader reader = new MultiReader(new IndexReader[] { IndexReader.Open(@"c:\index"), IndexReader.Open(@"\\server\index") });
IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);

IndexSearcher searcher1 = new IndexSearcher(reader1);
IndexSearcher searcher2 = new IndexSearcher(reader2);
MultiSearcher searcher = new MultiSearcher(new Searchable[] { searcher1, searcher2 });
Hits hits = searcher.Search(query);

还可以使用 ParallelMultiSearcher 进行多线程并行搜索。

posted @ 2008-04-19 23:10 安安 阅读(116) | 评论 (0)编辑

导航

统计

与我联系

搜索

 

常用链接

留言簿(1)

我参与的团队

随笔档案

文章分类

电子商务

购物比价

视频英语学习

最新评论

阅读排行榜

评论排行榜