这个想法由来已久,由于全文索引本身的缓存设计,使得其io操作要小于数据库对于频繁读取的操作全文索引绝对有可能在性能上超越数据库(至少能轻松秒杀mysql,mysql那超低的io性能如果不改那肯定是要被sqlserver给灭掉的,只是时间问题)但当你深入这个问题的时候就会有很多问题出现,我最初的需求是利用这个记录搜索关键字进而得到关键字hot排名。问题出现了:
1 IndexerWriter有个特性如果不close始终有部分内容会写不入索引,也就是它的缓冲机制,这是非常致命的,由于在实际应用中,这种写入是多线程的,当你在需要的时候close下以获得更新的时候,那么很可能使得某个写入线程出错,这是非常糟糕的,虽然我们不要求lucene达到acid的水准,但是经常报错是非常有问题的。
2 接着1的问题,同样在reader端需要频繁读入新内容,这可能会造成很大的性能问题,虽然在2.3中已经有了reopen方法,但我尝试过效率绝对没有官方宣称的如此高效,源代码我也看过的确不是那么高效的在我已经优化过的环境里,并没有获得很巨大的优势。
那么现在来看看解决的方法:
首先可以考虑是否使用ram作为临时存储地,不管如何,在ram上close和reopen都要比fs要高速得多,当然这个代价就是无法很大,虽然现在我的生产环境已经是16g内存的机器×2但我依然无法保证能够无限满足需求,有一天满了怎么办?到时候哭都来不及。
第二,考虑在fs上使用多索引,然后merge到主索引的方法,这样我可以利用线程限制极大保证fs上不会在close状态下被写入,close方法上有一个参数 是否等待merge完成,只要在线程模式下,是可以保证得到期望结果的,偶尔io不行的时候也就是偶尔出错一次不会产生太多问题。
好了,上述的方法还没有得到验证,尤其是线程模式下环境是很复杂的,而lucene又要求严格的线程安全,因此大量的实验室少不了的。
其实在我的理想中希望做一套lucene的服务,能够完全兼容于jdbc,这样可以实现服务的从db到全文的0切换,毕竟在like下lucene的效率之高使得数据库系统完全被秒杀。当然进而还有很多问题,比如表和表的关系,在lucene中怎么对应,这是后话,待我想想再来说,先去试验多线程安全模式下的写入。
分享到:
相关推荐
[CDATA[ ]]> 用于包含 Mybatis 的标签(如 `<if>`、`<where>`、`<choose>` 等),否则这些标签将不会被解析。 实例如下:<select id="allUserInfo" parameterType="java.util.HashMap" resultMap="userInfo1"> <!...
微信小程序支付JSAPI交易类型 已通过测试 返回例子如下: <xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code>
当遇到包含特殊字符如 "<" 和 "&" 的文本时,XML解析器可能会产生错误,因为这些字符在XML语法中有特定含义。为了解决这个问题,我们可以使用CDATA(Character Data)段来封装这些文本,使得XML解析器将其视为纯文本...
<preconditions><![CDATA[1.使用udp_bi用户在PLSQL正常登陆UAT数据库<br> (UAT数据库IP: 10.0.13.178)<br> 2.数据库脚本已下载至本地环境]]></preconditions><importance><![CDATA[2]]></importance><steps> <step>
[CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></...
[CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml...
ATTLIST 电话 类别 CDATA "移动电话"> ]> <联系人列表> <说明>&content;</说明> <联系人> <姓名>刘保文</姓名> <ID>201003101115</ID> <公司>腾飞汇通有限公司</公司> <电话 类别="移动电话">18993380967</...
自己将数据导入到xml中的,希望有需要的朋友可以自己下载,格式为<!DOCTYPE PCAroot[ <!ELEMENT PCAroot (Province*)> <!ELEMENT Province (City*)> <!ELEMENT City (Area*)> <!ELEMENT Area (#PCDATA)> <!...
例如,`<department>`标签使用`dept name`、`building`和`budget`属性来存储部门信息。同样,`<instructor>`标签使用`IID`、`name`、`dept name`和`salary`属性来描述教师。`<teaches>`标签则通过`IID`和`course id`...
[CDATA["&fromusername&"]]></ToUserName>" &_ "<FromUserName><![CDATA["&tousername&"]]></FromUserName>" &_ "<CreateTime>"&now&"</CreateTime>" &_ "<MsgType>news</MsgType>" &_ "<ArticleCount>3</...
在数据库设计中,外键约束是确保数据完整性和一致性的重要机制。题目中提到的三个表——JBPM_ID_GROUP、JBPM_ID_MEMBERSHIP和JBPM_ID_USER,分别代表用户组、用户成员关系和用户,它们之间的关系是通过外键关联的。 ...
这段代码中,我们首先创建了`MemoryStream`和`XmlTextWriter`对象,然后使用`WriteXml`方法将`DataTable`写入流中。最后,将流中的内容转换为字符串并返回。 以上就是关于`DataTable`与XML之间相互转换的详细说明,...
当多个组织或个人使用相同的DTD来创建XML文档时,它们之间可以轻松地交换和处理数据。此外,XML解析器可以根据DTD验证文档,从而发现和报告潜在的结构错误。 XML文档的基本构建模块包括: 1. **元素(Elements)**...
**示例**:定义一个`<note>`元素,其包含`<to>`、`<from>`、`<heading>`和`<body>`四个子元素,其中`<to>`、`<from>`和`<heading>`元素仅包含文本数据,而`<body>`元素可以包含文本和子元素。 ```xml <!ELEMENT note...
[CDATA[10]]></LoginTimeOut> <QueryTimeOut><![CDATA[3600]]></QueryTimeOut> 原始set.xml数据库连接节点缺少以上两个节点请添加,LoginTimeOut为数据库连接超时时间,单位秒,QueryTimeOut为SQL语句执行超时时间...
[CDATA[留言内容]]></content> </message> </messages> </gbook> ``` 4. **DTD定义**: - 用于定义XML文档的结构和约束条件。 - 例如,`<gbook>` 元素包含了 `<info>` 和 `<messages>` 两个子元素。 ```xml...
2. '<':当遇到 '<' 时,状态变化到 '<',以判断是否是CDATA部分的起始。 3. '<!':继续往后读,检查是否是CDATA的开始。 4. '<![':继续,检查是否是CDATA的开始。 5. '<![C':继续,检查是否是CDATA的开始。 6. '...
</body> </note> ``` 对应的`note.dtd`文件内容与内部声明相同。 使用DTD的好处主要包括: 1. **自包含性**:每个XML文件都可以携带其格式描述,方便理解和处理。 2. **标准化**:为不同的人提供了一种共同理解数据...
</body> </note> ``` 在上面的例子中,我们使用了外部的 DTD 文件“note.dtd”,其中包含了 DTD 声明: ```dtd <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!...