`
lc0451
  • 浏览: 47195 次
  • 性别: 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[] 参数则需要打开所有的索引库。

分享到:
评论

相关推荐

    ssh+lucene搜索实例

    5. 注意事项: - SSH连接的安全性:确保SSH配置正确,避免密码泄露,推荐使用公钥认证。 - 数据同步:如果远程服务器数据实时更新,需要考虑同步机制,保证搜索结果的准确性。 - 性能调优:根据服务器资源和数据...

    基于lucene技术的增量索引

    注意事项** - **并发控制**:在多线程环境下,需要确保对索引的操作是安全的,防止数据冲突和丢失。 - **优化索引**:定期执行索引优化(`IndexWriter.optimize()`)可以合并较小的段,提高搜索效率,但需要注意这...

    lucene-3.5.0.jar

    5. **优化与注意事项** - 分片与分布式:大型应用中,可以利用Sharding或Solr/Lucene Cloud实现分布式搜索。 - 索引优化:定期重建索引以提高搜索性能,避免过度碎片化。 - 内存管理:合理配置缓存,避免内存溢出...

    Lucene之删除索引

    了解了这些基本原理后,我们可以通过阅读提供的链接(http://blog.csdn.net/nupt123456789/article/details/10666105)获取更多关于Lucene删除索引的实战技巧和注意事项。同时,`HelloLucene_delete`这个压缩包文件...

    关于lucene的小常识

    **Lucene小常识详解** Lucene,作为Apache软件基金会的一个开放源代码项目,是一款高性能、全文本搜索引擎库,被广泛应用于各种搜索应用中,尤其在文献垂直搜索领域表现卓越。垂直搜索,顾名思义,是指针对某一特定...

    Lucene4.7-Web 例子

    五、注意事项 1. 性能优化:合理设置索引目录的缓存大小,避免频繁的磁盘I/O操作。 2. 日志监控:启用日志记录,以便于追踪和调试可能出现的问题。 3. 安全性:确保搜索功能的安全性,防止恶意的SQL注入或索引破坏。...

    lucene使用流程

    #### 七、其他注意事项 1. **工具推荐**: 文章推荐使用 LukeAll 这个工具来查看 Lucene 索引。LukeAll 提供了一个用户友好的界面,可以帮助开发者更好地理解和调试索引文件。 2. **大小写敏感性**: Lucene 在进行...

    最新版windows lucene-8.11.0.zip

    6. **挑战与注意事项** - **硬件需求**:随着数据量的增长,索引和搜索可能会对硬件性能提出更高要求。 - **分词准确性**:不同语言的分词策略不同,选择合适的分词器对搜索结果至关重要。 - **性能调优**:根据...

    lucene对doc.xlsx操作包

    六、优化与注意事项 在实际应用中,可能需要对文本进行预处理,例如去除停用词、标点符号,进行词干化等,以提高搜索效果。同时,注意处理大文件时可能出现的内存问题,可以使用分块或流式处理方式。 总结,利用...

    Lucene-core-2.0.0

    7. **安全注意事项**: 使用第三方库时,应确保来源可靠,避免潜在的安全风险。在解压和运行库文件前,最好进行病毒扫描,确保系统的安全性。 8. **社区支持**: 作为开源项目,Lucene有一个活跃的社区,开发者可以在...

    Lucene3.0创建索引

    #### 五、注意事项 - 确保源文件夹路径和索引文件夹路径正确。 - 调整字段配置以满足特定需求。 - 索引创建过程中可能会遇到各种异常,应添加适当的错误处理机制。 - 对于大量文档,可能需要考虑分批处理以避免内存...

    lucene 分组统计

    #### 五、注意事项 1. **性能优化**:在实际应用中,为了进一步提高性能,可以考虑使用更高级的缓存策略,如 `FilterCache` 和 `UnInvertedField`。 2. **内存消耗**:虽然 `FieldCache` 能够提高查询速度,但它也...

    luke--- lucene索引数据查看器

    注意事项 - Luke只能查看Lucene索引,不能修改或创建新的索引。 - 使用Luke时确保索引文件未被其他进程锁定,否则可能无法正确加载。 - Luke的版本应与所使用的Lucene版本相匹配,以避免兼容性问题。 总之,...

    Lucene 全文检索实践.pdf

    #### 四、注意事项 在实施上述方案时,特别要注意配置细节,例如确保正确的路径设置、依赖库的版本兼容性以及安全设置,避免潜在的运行时错误或安全隐患。 以上实践任务和部署策略的实施,不仅能深化对Lucene的...

    lucene.net基本应用(doc)

    5. **使用注意事项**: - 确保在操作完索引后总是关闭 `IndexWriter` 和 `IndexSearcher`,以释放资源。 - 如果在多个线程中使用 Lucene,需要考虑同步和锁定机制,以避免数据不一致。 - 选择合适的 `Analyzer`,...

    Lucene.NET2.9搜索引擎源代码(C#)

    - **README.txt**:通常包含项目的基本介绍、安装指南和使用注意事项。 - **DISCLAIMER.txt**:免责声明,提醒用户使用软件可能存在的风险。 - **NOTICE.txt**:列出所有需要遵循的第三方库及其许可信息。 - **src**...

    最简单的Lucene建立、搜索索引的方法

    **注意事项** - Lucene的性能和效率取决于Analyzer的选择,不同的Analyzer对文本的处理方式不同,可能会直接影响搜索效果。 - 索引更新时,应避免在搜索操作进行时修改索引,以防止数据不一致。 - 为了提高搜索效率...

    基于java的Lucene全文搜索引擎资源简单实例下载

    - **README.txt**: 提供关于实例的说明,包括如何运行、注意事项等。 - **WEB-INF**: Java Web应用的标准目录,包含web.xml配置文件和其他类库资源。 - **META-INF**: 通常包含应用的元数据,如MANIFEST.MF文件,...

Global site tag (gtag.js) - Google Analytics