ElasticSearch5.0使用记录

来源:互联网 发布:错生网络剧演员表 编辑:程序博客网 时间:2024/06/11 13:29
因公司项目要求,需要将搜索数据从以前的solr切换到ElasticSearch,我们采用的是ElasticSearch5.0,在数据的切换中遇到一些问题,以下为相关记录.
ElasticSearch2.x和5.x在java api接口上有很大的变化.
1.如何取ElasticSearch客户端
修改pom文件,加入如下依赖
<dependency>
        <groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
elastic支持查询,数据高亮,数据聚合,分页,排序等各种操作
// 高亮数据
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("text", 150, 3);
searchRequestBuilder = searchRequestBuilder.highlighter(highlightBuilder);
2.elastic支持动态数据类型
需要在mapping文件中加入如下定义:
"dynamic_templates": [
        {
          "match_1": {
            "match": "*_i",
            "mapping": {"type": "integer","store": true,"index": true}
          }
        },
        {
          "match_3": {
            "match": "*_s",
            "mapping": {"type": "keyword","store": true,"index": true}
          }
        },
3.推送数据到elasticSearch有时会报如下错误
Limit of total fields [1000] in index [xxxxxx_index] has been exceeded
解决办法是修改setting配置
"settings": {
    "index.mapping.total_fields.limit": 2000,
    "number_of_shards": 1,
    "number_of_replicas": 1
  },


4.elasticSearch5.0暂时没有jieba分词的插件支持,只能自己修改相关源码.
停用词可以在jieba(java版)源代码处修改,也可以直接在elasticsearch-jieba插件上修改
此外增加了同义词的支持,如查询"工行",会返回"工商银行"的相关检索.
对于中文分词推荐使用jieba 1.0.2版本,elasticsearch推荐使用5.1.1版,对应的jieba分词插件需要自己实现.
5.做集群的时候,操作数据可能会报如下错误
ERROR ServiceElasticIndexer:218 - elastic index error
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{xxxxxxxxxxxxxxx}{192.168.10.1}{192.168.10.1:9300}, {#transport#-2}{xxxxxxxxxxxxxxxx}{192.168.10.2}{192.168.10.2:9300}, {#transport#-3}{Fxxxxxxxxxxxxxxxxxxx{192.168.10.3}{192.168.10.3:9300}]
  at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:328)
  at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:226)
  at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
  at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:345)
  at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
  at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80)
解决办法如下:
Settings settings = Settings.builder().put("cluster.name", "xxxxx-elastic").put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses(servers);
transportClient = client;


最终使用的版本如下:
{
  "name" : "es3",
  "cluster_name" : "xxxxx-elastic",
  "cluster_uuid" : "xxxxxxxxxxxxx",
  "version" : {
    "number" : "5.1.1",
    "build_hash" : "5395e21",
    "build_date" : "2016-12-06T12:36:15.409Z",
    "build_snapshot" : false,
    "lucene_version" : "6.3.0"
  },
  "tagline" : "You Know, for Search"
}
0 0
原创粉丝点击