自己动手写分布式搜索引擎
上QQ阅读APP看书,第一时间看更新

3.2.8 灵活索引

以前,可以通过声明列属性来说明是否存储词在文档中的位置信息,如Field.TermVector.WITH_POSITIONS_OFFSETS。但这样的方式不够灵活,需要能够用任意有效的组合来说明倒排索引中存什么内容。例如,有时候也许并不关心词在文档中出现了多少次。有下面4种有效的索引格式:

(1) <doc>+

(2) <doc, boost>+

(3) <doc, freq, <position>+ >+

(4) <doc, freq, <position, boost>+ >+

例如可以只存文档编号,如(1)所示;或者还附加文档的加权信息,如(2)所示;或者还存储位置信息,如(3)所示;或者给不同位置的词设置不同的加权,如(4)所示。

这要求每个列设置如下的布尔值:

(1) freq。

(2) document boost。

(3) position (要求频率)。

(4) position boost (要求位置)。

索引选项枚举类型定义如下:

        public static enum IndexOptions {
            DOCS_ONLY,  //仅索引文档
            DOCS_AND_FREQS,  //索引文档和频率
            DOCS_AND_FREQS_AND_POSITIONS,  //索引文档、频率和词的位置
            DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS, //索引文档、频率、词的位置
        //以及字符偏移量
        };

可以在设置列类型的时候设置索引选项。

        FieldType fieldType = new FieldType();
        fieldType.setStoreTermVectors(true);
        fieldType.setStoreTermVectorPositions(true);
        fieldType.setIndexed(true);
        fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS); //索引文档和频率
        fieldType.setStored(true);
        Document doc = new Document();
        doc.add(new Field("content", content, fieldType));

对于写入索引,如何写入很重要。应用程序应该可以很容易地存储新的东西到索引。或者更改现有东西的编码,例如更改文档编号、位置、payloads等的编码方式。