Tag Archives: lucene

Lucene文件结构

Lucene文件的组织结构

Lucene文件结构组件 索引 文档
具体信息 整个存储索引的文件夹,solr中即/opt/solr/spu/data 新添加文档时生成段,在索引目录下_0.*,-1.*表示两个段 对应schema中的一条记录 文档中包括的域 分词后生成的term

简短的lucene创建索引的代码

public void createIndex() {
  String title = "solr apache ";
  Document document = new Document();
  Field field = new Field("title", new StringReader(title));
  document.add(field);

  try {
    SimpleFSDirectory directory = new SimpleFSDirectory(new File("/home/lucene"));
    IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_34, 
            new StandardAnalyzer(Version.LUCENE_34));
    IndexWriter writer = new IndexWriter(directory,writerConfig);
    writer.addDocument(document);
    writer.commit();
    writer.close();
  }catch (IOException e) {

  }
}

执行两次后,生成的索引结构如下图。 第一次title是”lucene index doc”,第二次title如上代码所示。

索引包含正向信息的文件有:

segments_2 保存了此索引包含多少个段,每个段包含多少篇文档。
_0.fnm 保存了此段包含了多少个域,每个域的名称及索引方式。
_0.fdx,_0.fdt 保存了此段包含的所有文档,每篇文档包含了多少域,每个域保存了那些信息。
_0.tvx,_0.tvd,_0.tvf 保存了此段包含多少文档,每篇文档包含了多少域,每个域包含了多少词,每个词的字符串,位置等信息。

所谓反向信息保存了词典到倒排表的映射:词(Term) –> 文档(Document)

包含反向信息的文件有:

_0.tis,_0.tii 保存了词典(Term Dictionary),也即此段包含的所有的词按字典顺序的排序。
_0.frq 保存了倒排表,也即包含每个词的文档 ID 列表。
_0.prx 保存了倒排表中每个词在包含此词的文档中的位置。

我们用Linux下的strings命令分别看一下每下文档具体包含的信息。

strings 可以打印出对象中所有可读取的字符

star@star:lucene$ strings _0.fnm
title

上面的命令,显示可以通过strings,获取当前索引中包含的域的名称。

star@star:lucene$ strings _0.tis
index
lucene

上面的输出可以看出,”lucene index doc” 实际上只索引了”index,lucene”两个词,而doc被分析器过滤掉了。

Solr使用小结

最近在使用solr搭建公司网站的搜索,到目前为止,刚好3周时间,Solr搭建的引擎也上线了,即将正式提供服务。总结一下这过程中遇到的一些问题,及最终解决的方法。

几乎是从0开始学习solr与lucene,经过了三个星期的努力,基本上把solr能提供的功能都了解。针对项目的业务需求,都从solr找到了现成的方案来实现。其中有过很多的纠结,不过好在这些困难都克服了。目前的项目主要用到了solr的下面几个功能:

facet:对查询的若干字段时间统计,使用过程中发现这个功能对于多值的域也非常有用,折腾了很长时间,才在昨天做了一下实验,搞定了这个问题。另外在这过程中也发现了Solr本身提供的DataImportHandler非常不靠谱,在导入多值的field时会存在问题。facet在对multiValued的field做统计时,会把搜索结果中facet.field的包含的所有的值一起做统计,这个功能在某些场合非常有用。

fq:运用了大量的fq,用来对结果做进一步的查询。在使用过程中详细了看了lucene的查询语法,基本上把这个东西用熟悉了。

hl:毫无疑问,这个功能是搜索必须的。

boost:通过在查询串的q中添加_val_:可以影响结果的打分,这是影响boost score的一个很好的方式。solr 3.1之后提供的edismax也能实现这样的功能,而且更强大。在使用过程中,对于这个值的取值非常纠结,取值太大了会完全影响文本相关性。
目前对solr的使用仅仅停留在使用其提供的功能满足业务需求的阶段,对于更深层次的东西并未深究。对于分词器,requestHandler等都没有进行定制,这些等数据量上来或者有新的需求后,再来做进一步的研究吧。