`
lc0451
  • 浏览: 47072 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

lucene使用注意事项

阅读更多

部分信息翻译自 Apache Lucene FAQ ,请注意标题中 "(翻译)" 字样。

IndexWriter.SetUseCompoundFile(true) 有什么用?

在创建索引库时,会合并多个 Segments 文件到一个 .cfs 中。此方式有助于减少索引文件数量,减少同时打开的文件数量。

可以使用 CompoundFileReader 查看 .cfs 文件内容。

CompoundFileReader reader = new CompoundFileReader(FSDirectory.GetDirectory("y:\\index", false), "_1oa.cfs");

foreach (string filename in reader.List())
{
    Console.WriteLine(filename);
}


IOException "Too many open files" (翻译)

原因:
某些操作系统会限制同时打开的文件数量。

解决方法:
1. 使用 IndexWriter's setUseCompoundFile(true) 创建复合文件,减少索引文件数量。
2. 不要将 IndexWriter's mergeFactor 的值设置过大。尽管这能加快索引速度,但会增加同时打开的文件数量。
3. 如果在搜索时发生该错误,那么你最好调用 IndexWriter.Optimize() 优化你的索引库。
4. 确认你仅创建了一个 IndexSearcher 实例,并且在所有的搜索线程中共用。(原文:"Make sure you only open one IndexSearcher, and share it among all of the threads that are doing searches -- this is safe, and it will minimize the number of files that are open concurently. " 晕~~~,究竟要怎么做? )

为什么搜索不到结果?(翻译)

可能原因:

1. 搜索字段没有被索引。
2. 索引库中的字段没有分词存储,无法和搜索词语进行局部匹配。
3. 搜索字段不存在。
4. 搜索字段名错误,注意字段名称区分大小写。建议对字段名进行常量定义。
5. 要搜索的词语是忽略词(StopWords)。
6. 索引(IndexWriter)和搜索(IndexSearcher)所使用的 Analyzer 不同。
7. 你所使用的 Analyzer 区分大小写。比如它使用了 LowerCaseFilter,而你输入的查询词和目标大小写不同。
8. 你索引的文档(Document)太大。Lucene 为避免造成内存不足(OutOfMemory),缺省仅索引前10000个词语(Term)。可以使用 IndexWriter.setMaxFieldLength() 调整。
9. 确认在搜索前,目标文档已经被添加到索引库。
10. 如果你使用了 QueryParser,它可能并没有按照你所设想的去分析 BooleanQuerySyntax。

如果还不行,那么:

1. 使用 Query.ToString() 查看究竟搜索了些什么。
2. 使用 Luke 看看你的索引库究竟有什么。

TooManyClauses Exception (翻译)

使 用 RangeQuery, PrefixQuery, WildcardQuery, FuzzyQuery 等类型时可能会引发该异常。比如我们使用 "ca*" 来搜索 "car" 和 "cars",由于搜索结果文档(Document)所包含的 Term 超出 Lucene 默认数量限制 (默认1024),则会引发 TooManyClauses 异常。解决方法:

1. 使用 Filter 替换引发异常的 Query,比如使用 RangeFilter 替换 RangeQuery 搜索 DateField 就不会引发 TooManyClauses 异常。你可以使用 ConstantScoreQuery 像 Query 那样执行 Filter。第一次使用 Filters 时速度要比 Queries 慢一点,但我们可以使用 CachingWrapperFilter 进行缓存。
2. 使用 BooleanQuery.setMaxClauseCount() 加大 Terms 数量,当然这会增加内存占用。使用 BooleanQuery.setMaxClauseCount(int.MaxValue) 会避开任何限制。
3. 还有一个解决方法是通过缩小字段数据精度来达到减少索引中 Terms 数量的目的。例如仅保存 DateField 中的 "yyyymmddHHMM"(可以使用 Lucene 1.9 版本中的 DateTools)。

通配符

Lucene 支持英文 "?" 和 "*" 通配符,但不能放在单词首位。

QueryParser 是线程安全的吗?

不是。

MaxDoc() 和 DocCount()、NumDocs() 有什么不同?

MaxDocs() 表示索引库中最大的 Document ID 号,由于中间的某些 Document 可能被删除,因此不能使用 MaxDocs() 来表示 Document 数量。IndexWriter.DocCount()、IndexReader.NumDocs()、 IndexSearcher.Reader.NumDocs() 都表示索引库中 Document 数量。

为什么同时进行搜索和更新会引发 FileNotFoundException 异常?(翻译)

可能原因:
1. 某个搜索或更新对象禁用了锁。
2. 搜索和更新使用了不同的 lockDir。
3. 索引库被存放在 NFS (or Samba) 文件系统上。

尽管搜索是只读操作,但 IndexSeacher 为了获取索引文件列表,也必须打开时锁定索引库。如果锁没有正确设置,那么它将取回一个错误的文件列表(此时 IndexWriter 可能正在添加或优化索引),从而导致该异常发生。

索引文件有大小限制吗?(翻译)

某些 32 位操作系统限制每个文件不能大于 2GB。

解决方法:
1. 使用 IndexWriter.setMaxMergeDocs() 减小 MaxMergeDocs 数值。
2. 使用多个索引库。

什么是 Segments ?(翻译)

索引库中每个索引文件都是由多个 Segments 组成。当你添加一个 Document 到索引库,那么就可能会创建一个新的 Segment。你可以使用 Optimize() 来压缩索引库以减少 Segments 数量。

write.lock 有什么用?哪些类会用到它?(翻译)

write.lock 用来协调索引库的并发修改处理。
当 IndexWriter 打开索引库,或者 IndexReader 删除文档时都将创建该锁。

commit.lock 文件有什么用?哪些类会用到它?(翻译)

commit.lock 在调整索引库 segments 文件内容时使用。 IndexReader 和 IndexWriter 都会使用到它。

"Lock obtain timed out." 错误。在哪删除锁文件?(翻译)

一 般存放在系统临时目录(System.IO.Path.GetTempPath()),也可以在 app.config/web.config 中手工设置。可以手工进行删除,或者使用 "IndexReader.isLocked"、"IndexReader.unlock" 进行自动判断和删除操作。

FSDirectory.cs

public static readonly System.String LOCK_DIR = SupportClass.AppSettings.Get("Lucene.Net.lockDir", System.IO.Path.GetTempPath());


app.config / web.config

<configuration>
    <appSettings>
        <add key="Lucene.Net.lockdir" value="c:\index" />
    </appSettings>
</configuration>


如何更新已经索引的文档? (翻译)

你只能先删除,然后添加更新后的文档。

使用 IndexWriter.addIndexes(IndexReader[]) 和 IndexWriter.addIndexes(Directory[]) 合并索引库有什么不同? (翻译)

使用 Directory[] 参数所需的文件句柄和内存较小,索引文件仅需打开一次,而使用 IndexReader[] 参数则需要打开所有的索引库。

分享到:
评论

相关推荐

    关于lucene的小常识

    基于lucene的文献垂直搜索技术是当今火热的技术

    lucene in action第二版(word版)

    这是公认的最优秀的讲解lucene的书。书中详细讲解了lucene 2.9 API的使用,并指明了使用lucene构建搜索引擎的经验,包括:内存溢出、分页技巧、分词、结果打分、update索引注意事项等等。

    [搜索链接]java(结合lucene)版的公交搜索系统_javaso_new.rar

    4. 注意事项 学生在使用这些资源时应确保遵循学校和课程的相关规定,如防止抄袭、确保原创等。 在参考源代码进行编程时,需要确保理解其工作原理和逻辑,避免仅仅复制和粘贴。 希望这种资源描述能够满足您的需求!...

    ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)_new.rar

    4. 注意事项:使用资源时,学生需确保遵守学校和课程的规定,防止直接复制粘贴,鼓励真正理解和原创。在借鉴源代码时,重要的是确保学生理解代码的逻辑和工作原理,而不仅仅是简单地复制。 希望这种资源描述能为您...

    dbpedia-spotlight:DBpedia Spotlight是一个用于自动注释文本中提到的DBpedia资源的工具

    一般注意事项 从v1.0开始,DBpedia Spotlight在相同的API下分为两个版本,如下所示: DBpedia-Spotlight-Model:在描述-回购: : DBpedia-Spotlight-Lucene:在《 描述-回购:-https: 不再处于活跃开发中** 我们...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

     8.1.3 图文消息使用注意事项 201  8.2 公众账号无响应的处理 202  8.2.1 公众账号无响应的几种情况 202  8.2.2 计算字符串所占字节数 202  8.3 应用开发最佳实践 204  8.3.1 解析消息创建时间 204  ...

    Solr入门

    本文来自于csdn,本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的...

    GeoParsingNSF:新版本

    经度,纬度)的重新喜爱的对象##How 使用注意事项:此程序至少需要 1.2 GB 磁盘空间来构建 Lucene 索引function A(stream){Metadata metadata = new Metadata (); ParseContext context = new ParseContext

    Baioogle-SearchEngine(百歌搜索引擎)

    二、注意事项: 1.关于以上所列出的最小有效组件集,对于非熟悉本系统开发原理者不应再进行缩减,否则可能不能顺利运行本程序 2.本系统依赖于网络爬虫软件wget的自动存放格式,如网址“http://127.0.0.1:8080”所...

    2022年JAVA开发工程师简历范文.docx

    7. JAVA开发工程师简历的写作技巧:包括如何写简历的基本格式、如何写简历的注意事项、如何Highlight自己的优势等。在写作技巧中,需要详细说明简历的写作技巧,例如如何写简历的基本格式、如何Highlight自己的优势...

    涵盖了90%以上的面试题

    使用switch时有哪些注意事项 instanceof有什么作用 什么是不可变类 类型转换 Math类的round,ceil和floor方法 值传递和引用传递有什么不同? char型变量是否可以存储一个中文汉字 s=null和s=” ”是否相同 new String...

    近乎v5.0源码 Almostv50.rar

    三、注意事项 1、开发环境为Visual Studio 2015,数据库为SQL2012,使用.net 4.5开发。 2、用SQLserver数据库时的产品安装指南 自动安装: 源码版安装之前,请使用Vs2015或以上版本以管理与身份打开项目, 您...

Global site tag (gtag.js) - Google Analytics