`
Copperfield
  • 浏览: 261022 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25213
社区版块
存档分类

lucene FAQ转

 
阅读更多

13, 索引过程中的任意时刻、任意进程都能对索引文件进行优化,而且这样做也不会损坏索引文件或使其不能被搜索,但是在索引过程中对索引进行优化的做法并不值得 提倡。优化操作的最佳时机是在索引过程结束之后,且当你确认在此后的一段时间内不会对索引文件进行更改的时候。在索引过程中进行优化只会使优化操作耗费更 多的时间。(请大家汲取这个思想)



14, 还是优化, 些人问: 我用lucene做了一个Search Engine
程序运行也很正常,但如果连续运行几个月,有时会出现磁盘空间不足的情况 .
通过iw.addDocument(doc)写入index
当list里的东西全部被写入完毕后,通过optimze来优化索引,
可这个东西运行不是很稳定,有的时候很正常,运行几个月都okay,有时1个月就出现问题了。会在index的目录里出现很多文件。这些文件似乎是应该被 optimize掉的。 一个索引只能有一个indexreader, 在optimize的时候可以有多个indexsearcher在工作。
你得确保
-->optimize确实调用了
-->optimize的时候, 得有双倍的磁盘空间. 可见优化的代价.



15 ,面的lucene都是在一个目录里面的, 大家也都看到了. 也就是如果这个文件一直很大怎么办. 首先碰到的第一个问题是就是文件大小限制. 首先面临的是一个大目录问题.

16, lucene的性能测试:
下面给出一些测试数据,如果你觉得可以接受,那么可以选择。
测试一:250万记录,300M左右文本,生成索引380M左右,800线程下平均处理时间300ms。
测试二:37000记录,索引数据库中的两个varchar字段,索引文件2.6M,800线程下平均处理时间1.5ms。


17 . 分布搜索

我们可以使用 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 进行多线程并行搜索。

18. 合并索引库

将 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[] { directory });
Console.WriteLine(writer.DocCount());
writer.Close();

19. 显示搜索语法字符串

我们组合了很多种搜索条件,或许想看看与其对等的搜索语法串是什么样的。
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]

呵呵,就这么简单。

20. 操作索引库

删除 (软删除,仅添加了删除标记。调用 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();

21. 优化

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

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();

相关参数说明


转自《深入 Lucene 索引机制》

利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率。当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索 引文件的过程中。为了解决这个问题, Lucene 在内存中持有一块缓冲区。但我们如何控制 Lucene 的缓冲区呢?幸运的是,Lucene 的类 IndexWriter 提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。

22.合并因子 (mergeFactor)

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

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

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

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

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

25 , 根据官方文档:从中可以分析出,如果在optimize索引的时候,也同时使用Searcher。索引空间的使用情况如下:
1. 原始索引
2. 由IndexWriter使用的索引,用于optimize
3. 由IndexSearcher使用的索引,用于搜索。

所以要三倍的正常空间.

为什么需要优化?
尽管未经优化的索引在大多数应用程序中都能够很好地进行工作,但在那些处理大批量索引的应用程序中,使用优化过的索引会给应用程序带来更多的好处。特别是 在搜索操作需要长时间打开多个索引文件的情况下,更能体现出索引被优化后的优势,因为使用优化过的索引可以减少需要打开的文件描述符的个数

优化所需的磁盘空间
值得指出的是,Lucene对一个索引的优化操作是通过把已存在的段合并成一个全新的段来完成的,这些已存在段的内容最终会在新的段中表示出来。因而在进 行优化时,使用的磁盘空间会有明显的增加。在新段创建完成时,Lucene删除并移除这些旧段。因此,在旧的段还没有被删除之前,索引占用的磁盘空间会变 成原来的两倍,因为此时新段和旧段都会存储在索引中。在优化完成后,所占用的磁盘空间会降回到优化前的状态。请记住,索引优化的对象可以是多文件索引或复 合索引。



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

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

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


27, IndexWriter.SetUseCompoundFile(true) 有什么用?

在创建索引库时,会合并多个 Segments 文件到一个 .cfs 中。此方式有助于减少索引文件数量,减少同时打开的文件数量。原因:
某些操作系统会限制同时打开的文件数量。

解决方法:
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. " 晕~~~,究竟要怎么做? )

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

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

如果还不行,那么:

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

29, 上面的luke是查看索引库的, 我下载了一个版本, 居然总提示我给他的索引路径不对.无奈. .

30 ,

QueryParser 是线程安全的吗?

不是。

31, 说说分布式数据存储. 支持lucene的分布式搜索就是 hadoop. 这个也是apache下的属于lucene的开源项目. 但目前的我看只支持linux的分布机器. 网上很多这个方面的. 据说开发hadoop的人已经去了yahoo. 让hadoop支撑雅虎的分布式搜索. 所以按说功能强大.2006年的一月份Nutch和Lucene的缔造者Doug Cutting加入了Yahoo公司,从那时起,Yahoo就开始进行Hadoop的部署与研究. 但网上有人说, 这个分布式效率不高.

参数如下:

经测试,Hadoop并不是万用灵丹,很取决于文件的大小和数量,处理的复杂度以及群集机器的数量,相连的带宽,当以上四者并不大时,hadoop优势并不明显。
比如,不用hadoop用java写的简单grep函数处理100M的log文件只要4秒,用了hadoop local的方式运行是14秒,用了hadoop单机集群的方式是30秒,用双机集群10M网口的话更慢,慢到不好意思说出来的地步。

评: 怎么评价上面的哥们测试结果呢. 但愿他说的不对. 因为如果这样, yahoo不就死了..

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

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

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

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

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

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

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

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

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

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

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

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

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

分享到:
评论

相关推荐

    Lucene实战 第二版 完整清晰中文版

    Otis Gospodnetic则是Lucene核心开发组的成员,并在Apache Jakarta项目管理委员会中担任要职,同时也是jGuru网站的Lucene FAQ的维护者。两位作者都曾在技术杂志上发表过大量与Lucene相关的文章。

    基于SpringBoot的Wiki内容管理系统.zip

    这是一个基于Spring Boot、Hibernate和Lucene等技术构建的内容管理系统(CMS)。该系统提供了强大的数据访问、搜索、作业调度和安全认证功能。通过Spring Data Jpa和Hibernate实现高效的数据访问和操作,利用Lucene...

    Solr 教程 pdf

    FAQ部分提供了一些常见问题的排查方法,例如出现乱码或查询不到结果时的解决措施。 通过这篇教程,我们可以获得关于如何安装配置Solr,如何通过Solr进行索引构建和搜索,以及如何优化Solr性能的详细指导。同时,也...

    开源企业搜索引擎SOLR的应用教程.pdf

    最后,文档提供了常见问题(FAQ)和故障排查方法,包括如何处理乱码和查询结果不符的问题。这部分内容对实际应用中可能遇到的问题进行了问题分析和解决方案的提供。 综上所述,Apache Solr是一个功能强大的企业级...

    solr从入门到精通教程

    7. 常见问题解答(FAQ) - 乱码或查不到结果的排查方法:给出了排查此类问题的多种方法。 综合这些内容,可以看出这份教程全面覆盖了Solr从基础概念、安装部署、应用实践到性能优化的方方面面。尤其对于那些想要...

    开源企业搜索引擎SOLR的应用教程

    #### 七、FAQ **7.1 出现乱码或者查不到结果的排查方法:** - 检查字符编码设置是否正确。 - 确认索引过程中是否有遗漏的字段。 - 调整查询语法,尝试使用不同的搜索关键词。 综上所述,Apache Solr是一款功能...

    SOLR的应用教程

    **七、FAQ** 解答关于Solr使用过程中可能遇到的问题,如乱码和查不到结果的排查方法。 这个SOLR应用教程涵盖了从基础概念到实际应用,包括安装配置、索引和搜索操作、SolrJ的使用以及性能优化等多个方面,为读者...

    higo:海狗-多维在线分析系统

    海狗(Higo)是一个分布式的在线分析查询系统,基于hadoop,lucene,solr,蓝鲸等开源系统作为实现,类SQL的查询语法。海狗是快速的高性能的,他的过多因使用了索引,列式存储,以及缓存等技术,因此数据扫描的速度...

    Solr3.5开发应用指导

    #### 七、FAQ - **7.1 出现乱码或者查不到结果的排查方法:** 以上是对Solr3.5开发应用指导的详细解读,涵盖了从安装配置到具体应用的各个方面。通过这些内容,开发者可以更好地理解和掌握Solr的强大功能,从而...

    毕业设计源码(答疑系统).zip

    源码的文件夹名为"faq-system-master",暗示这可能是一个主分支或者完整版本的代码库。 在这样的系统中,通常包含以下几个核心模块: 1. 用户管理:用户注册、登录功能是系统的基础。Java中可以使用Spring ...

    solr教材-PDF版

    #### 七、FAQ - **7.1 出现乱码或者查不到结果的排查方法**:提供了一套系统化的故障排查方案,帮助用户解决常见的问题。 以上是关于《solr教材-PDF版》的详细知识点介绍,涵盖了从Solr的基本概念到具体应用场景,...

    B2C电子商务网站系统源码

    8. **产品搜索**:高效的搜索引擎是电子商务网站的关键,可能使用全文索引技术(如Lucene.NET)来提高搜索速度和准确性。 9. **在线帮助**:提供FAQ、联系客服、使用指南等,以提升用户体验,这需要设计良好的帮助...

    Solrj 中文教程

    ### Solrj 中文教程知识点概览 #### 一、企业搜索引擎方案选型与Solr简介 ##### 1.1 企业搜索引擎方案选型 ...#### 七、FAQ - **7.1 出现乱码或者查不到结果的排查方法**:解决常见问题的方法和步骤。

    opencms

    - **搜索模块**:如OpenCms的Lucene模块,提高网站内容的可搜索性。 - **社交网络集成**:实现与Facebook、Twitter等社交平台的连接。 - **多语言支持**:支持网站内容的多语言版本管理。 ##### 4.5 社区贡献 ...

    开源企业搜索引擎SOLR的 应用教程

    #### 七、FAQ **7.1 出现乱码或者查不到结果的排查方法:** 检查编码设置、索引结构定义等,确保数据的一致性和完整性。 通过以上内容,我们可以看到Solr作为一款成熟的开源企业搜索引擎,不仅具备强大的功能,还...

Global site tag (gtag.js) - Google Analytics