lucene中Field.Index,Field.Store的一些设置

简介: lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZED));

lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZED));


Field有两个属性可选:存储和索引。


通过存储属性你可以控制是否对这个Field进行存储;


通过索引属性你可以控制是否对该Field进行索引。


事实上对这两个属性的正确组合很重要。


Field.Index Field.Store 说明 TOKENIZED(分词) YES 被分词索引且存储 TOKENIZED NO 被分词索引但不存储 NO YES 这是不能被搜索的,它只是被搜索内容的附属物。如URL等 UN_TOKENIZED YES/NO 不被分词,它作为一个整体被搜索,搜一部分是搜不出来的 NO NO 没有这种用法


个人设置这两个属性主要依据还是要看这个Field是否要被索引是否要被存储,Field内容大小,和个人对其索引的重要性还是占了很大的比重。


注:同一Document下可以针对小的Field建立索引,查询出内容过大且存储没有被索引的Field(按查询需求设置)。


总结如下:


1.如果要对某Field进行查找,那么一定要把Field.Index设置为TOKENIZED或UN_TOKENIZED。TOKENIZED会对Field的内容进行分词;而UN_TOKENIZED不会,只有全词匹配,该Field才会被选中。 2.如果Field.Store是No,那么就无法在搜索结果中从索引数据直接提取该域的值,会使null。


补充:


Field.Store.YES:存储字段值(未分词前的字段值)
   Field.Store.NO:不存储,存储与索引没有关系
   Field.Store.COMPRESS:压缩存储,用于长文本或二进制,但性能受损
   Field.Index.ANALYZED:分词建索引
   Field.Index.ANALYZED_NO_NORMS:分词建索引,但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间
   Field.Index.NOT_ANALYZED:不分词且索引
   Field.Index.NOT_ANALYZED_NO_NORMS:不分词建索引,Field的值去一个byte保存
   TermVector表示文档的条目(由一个Document和Field定位)和它们在当前文档中所出现的次数
   Field.TermVector.YES:为每个文档(Document)存储该字段的TermVector
   Field.TermVector.NO:不存储TermVector
   Field.TermVector.WITH_POSITIONS:存储位置
   Field.TermVector.WITH_OFFSETS:存储偏移量
   Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量



目录
相关文章
|
数据库
Unknown column ‘字段名‘ in ‘field list‘解决方法
Unknown column ‘字段名’ in 'field list’英语翻译过来就是未知列的字段名在字段表中,也就是说数据库表中的字段名在实体类中找不到。 解决方案如下: 查看实体类的属性名和数据库表中的名字是否一致(注意数据库表字段中是否有空格或者下划线)
|
存储 SQL 关系型数据库
mysql索引类型 normal, unique, full text
mysql索引类型 normal, unique, full text
186 0
|
JSON 数据格式 索引
Elastic:doc[‘field‘].value与params._source[‘field‘]的区别;doc循环依赖问题
今天有同学问到doc['field'].value与params._source['field']用法的区别,起因在于下述的一道题的解法上,下面详细讲述下我的看法
162 0
Elastic:doc[‘field‘].value与params._source[‘field‘]的区别;doc循环依赖问题
|
自然语言处理 索引 编解码