详解ElasticSearch的store属性

    在Elasticsearch建立mapping的时候,须要制定store属性和index属性,对于刚入门es的学者,一般对lucene又不熟悉的人,一般不知道如何设置这两个值。app

    先来看需求:性能

    在作搜索时,常常会须要对一个分类进行分 组,好比搜索"ipad",须要在平板电脑分类下面统计有多少个商品,在电脑配件下面统计有多少个商品,这种统计数量的需求,咱们一般会在 document里面添加一个分类ID,而后对全部的分类作facet。那么问题出来了,若是分类ID是个整数的话,store属性应该设置true or false?这种整数是否还须要索引?学习

    这个问题,在ES的文档中怎么也找不到,我的一开始又对lucene不熟悉,因此花时间看了一下lucene。经过学习lucene及实际的实践得出,以上需求的设置store应该为no,而index应该设置为not_analyzied测试

 

    下面咱们来仔细理解一下这两个设置项。spa

    其中index的含义还比较容易理解,一 共3个值,no,analyzied,not_analyzied,分别对应'不对该字段进行索引(没法搜索)','分词后索引','以单个关键词进行索 引'。就是说,若是这个字段不须要搜索,通常不须要设置为analyzied,可是若是不搜索,针对以上的需求,index应该设置为no吗?请继续往下 看。code

    一般分类在索引的时候都是一个整数或长整数,对应lucene的IntField或LongField,而这两个类在lucene中的第一行注释是:Field that indexes int values for efficient range filtering and sorting.(Field that indexes long values for efficient range filtering and sorting),也就是说,IntField是被索引的,而且这种索引在范围过滤和排序的时候性能很是高。那么问题就很明确了,由于,咱们的分类字段也是做为filter项的,所以若是要作过滤,必须进行索引。不然可能没法做为过滤条件。blog

 

    实际上,咱们在建立mapping的时 候,若是设置了数据类型为integer,其余的都未指定,默认的index即为no_analyzied。至于store,采用默认值也是合适的(默认 为no),实际上这些默认值都是lucene的默认值。由于通常咱们是用不到store='yes'的功能的,除非,咱们须要对某个域(就是字段)进行高 亮显示。排序

 

    你可能会问,若是设置store:"no",会不会影响facet的性能。答案为不会,由于作facet的时候并不会使用store的字段,而是使用的索引表的词。也就是后面设置的index:'not_analyzied"。索引

 

    我本身作过一个测试,若是设置分类ID不索引,则没法进行facet,可见任何须要facet的字段,必须进行索引。    ip

    请支持原创: http://donlianli.iteye.com/blog/1975727

相关文章
相关标签/搜索