elasticsearch索引结构和配置简单调优.

1.搜索时对特定字段设置更高权值,以弱化相关性低的字段

例如:我们在搜索时认为标题对我们更重要就可以对标题提高匹配权重

boolQuery.must(

                QueryBuilders.matchQuery(HouseIndexKey.TITLE, rentSearch.getKeywords())

                        .boost(2.0f)

       );

2.一般elasticsearch只是用来做检索的,而不适合存储原始结果集,所以我们只需要检索后id(比如houseId),而不需要返回整个结果集

所以我们只需要获取id即可(如果返回整个字段的数据集,当数据量过大将会导致性能大大降低);因此我们可以通过

setFetchSource(HouseIndexKey.HOUSE_ID, null)方法只返回houseId。

SearchRequestBuilder requestBuilder = this.esClient.prepareSearch(INDEX_NAME)

                .setTypes(INDEX_TYPE)

                .setQuery(boolQuery)

                .addSort(

                        HouseSort.getSortKey(rentSearch.getOrderBy()),

                        SortOrder.fromString(rentSearch.getOrderDirection())

                )

                .setFrom(rentSearch.getStart())

                .setSize(rentSearch.getSize())

                .setFetchSource(HouseIndexKey.HOUSE_ID, null);

                

3.索引结构优化

索引读写优化:索引存储采用niofs

"index.store.type": "niofs",

索引模版采用strict严格模式,即在整个索引结构稳定的情况下不允许随意更改,当然不稳定的情况下可以指定为false,可以动态更改

"dynamic": "strict",

禁用_all字段,防止将所有的字符串字段连接起来做全文检索,影响检索性能(es6.x以上版本貌似已经废弃该字段)

Index中默认会有_all这个字段(es6.x已经禁用),默认会把所有字段的内容都拷贝到这一个字段里面,这样会给查询带来方便,但是会增加索引时间和索引尺寸。

"_all": {

        "enabled": false

      },

设置默认查询字段

"index.query.default_field": "title"

设置节点掉线延时操作时间(5m),防止由于网络原因导致集群中卸载该分配节点

"index.unassigned.node_left.delayed_timeout": "5m"

 

注意:分片和副本的设置需要看集群的大小(我如下的索引设置副本为0,分配为5是因为我是单节点测试的,各位如果是集群节点注意修改这另两个参数)

{

  "settings": {

    "number_of_replicas": 0,

    "number_of_shards": 5,

    "index.store.type": "niofs",

    "index.query.default_field": "title",

    "index.unassigned.node_left.delayed_timeout": "5m"

  },



  "mappings": {

    "house": {

      "dynamic": "strict",

      "_all": {

        "enabled": false

      },

      "properties": {

        "houseId": {

          "type": "long"

        },

        "title": {

          "type": "text",

          "index": "analyzed",

          "analyzer": "ik_smart",

          "search_analyzer": "ik_smart"

        },

        "price": {

          "type": "integer"

        },

        "area": {

          "type": "integer"

        },

        "createTime": {

          "type": "date",

          "format": "strict_date_optional_time||epoch_millis"

        },

        "lastUpdateTime": {

          "type": "date",

          "format": "strict_date_optional_time||epoch_millis"

        },

        "cityEnName": {

          "type": "keyword"

        },

        "regionEnName": {

          "type": "keyword"

        },

        "direction": {

          "type": "integer"

        },

        "distanceToSubway": {

          "type": "integer"

        },

        "subwayLineName": {

          "type": "keyword"

        },

        "subwayStationName": {

          "type": "keyword"

        },

        "tags": {

          "type": "text"

        },

        "street": {

          "type": "keyword"

        },

        "district": {

          "type": "keyword"

        },

        "description": {

          "type": "text",

          "index": "analyzed",

          "analyzer": "ik_smart",

          "search_analyzer": "ik_smart"

        },

        "layoutDesc" : {

          "type": "text",

          "index": "analyzed",

          "analyzer": "ik_smart",

          "search_analyzer": "ik_smart"

        },

        "traffic": {

          "type": "text",

          "index": "analyzed",

          "analyzer": "ik_smart",

          "search_analyzer": "ik_smart"

        },

        "roundService": {

          "type": "text",

          "index": "analyzed",

          "analyzer": "ik_smart",

          "search_analyzer": "ik_smart"

        },

        "rentWay": {

          "type": "integer"

        },

        "suggest": {

          "type": "completion"

        },

        "location": {

          "type": "geo_point"

        }

      }

    }

  }

}

 

4.配置优化

禁止通配符删除索引(索引删除的 后果是不可逆的,且删且珍惜)

执行PUT http://10.0.2.19:9200/_cluster/settings

设置请求参数:

{

    "transient":{

        "action.destructive_requires_name":true

    }

}

elk索引周期策略设置别名无效 elasticsearch索引设计_elasticsearch  优化

查看设置:

elk索引周期策略设置别名无效 elasticsearch索引设计_elk索引周期策略设置别名无效_02

设置延时刷新时间

调整refresh时间间隔,优化点: 减少刷新频率,降低潜在的写磁盘性能损耗, 默认的刷新时间间隔是1s,对于写入量很大的场景,这样的配置会导致写入吞吐量很低,适当提高刷新间隔,可以提升写入量,代价就是让新写入的数据在60s之后可以被搜索,新数据可见的及时性有所下降。

index.refresh_interval: 30s

集群发现超时优化

#节点间的存活时间检测间隔

discovery.zen.fd.ping_interval: 10s

#存活超时时间

discovery.zen.fd.ping_timeout: 120s

#存活超时重试次数

discovery.zen.fd.ping_retries: 5

另外对于集群机器资源够多的情况下,可以设置主节点不存储数据(一般小集群规模会设置主节点和从节点都作为数据节点),看各自的业务情况应变处理。

指挥节点(主节点):

#指挥节点配置
#节点名称
node.name: master
#是否是主节点
node.master: true
#是否存储数据(改为false则不做数据节点,根据情况设计)
node.data: true

数据节点(从节点):

#数据节点配置
node.name: slave1
node.master: false
node.data: true

针对数据节点 http功能关闭设置(关闭数据节点的http通信,只开启tcp数据通信,可以降低数据节点的访问负载)
 

http.enable: false