写在前面:因为是在实习期间接触的这个搜索引擎,所以关于引擎的管理、监控和部署本菜鸟一概未曾得到机会尝试。本篇也是完全基于应用层的尝试讲解。
本文内容主要是基于java api对elasticSearch的一些操作,目录如下:
- 创建对elasticSearch服务器的连接
- 创建mapping
- 对文档的增删查改
- 根据实际情况构建一个跨字段实体搜索
- 对搜索结果的分析以及调优
1、创建TransportClient对象并实例化
public static TransportClient getclient(){
if(client!=null){
System.out.println("client不为空!!!!!!");
return client;
}
System.out.println("client为空了!!!!!!");
long start1=System.currentTimeMillis();
Settings settings = Settings.settingsBuilder()
.put(ElasticConfig.Cluster_Name, ElasticConfig.Password).build();
try {
client=TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ElasticConfig.Local_Host), ElasticConfig.Port));
} catch (UnknownHostException e) {
e.printStackTrace();
};
long end1=System.currentTimeMillis();
System.out.println("elastic连接花费:"+(end1-start1));
return client;
}
参数说明:
ElasticConfig.Cluster_Name //elastic服务的名称
ElasticConfig.Password //elastic服务的密码
ElasticConfig.Local_Host //服务地址
ElasticConfig.Port //服务端口
以上四个参数在一般情况下可以询问elasticSearch服务器搭建人员
2、创建mapping
/**
* 创建索引
* @param indices 索引名称
* @param mappingType 文档类型
* @throws Exception
*/
public static void createPerMapping(String indices,String mappingType)throws Exception{
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject()
.startObject("properties")
//文档的字段名称:persionID 字段类型:string .startObject("persionID").field("type","string").endObject()
//文档的字段名称:sex, 字段类型:string , search_analyzer:搜索时的分析器,analyzer:索引时的分析器 (在这里我们都是用的ik分词器,这个需要在elastic服务端进行安装) .startObject("sex").field("type","string").field("search_analyzer","ik_max_word").field("analyzer","ik_max_word").endObject()
.startObject("age").field("type","string").field("search_analyzer","ik_max_word").field("analyzer","ik_max_word").field("index_options", "docs").endObject()
.startObject("address").field("type","string").field("search_analyzer","ik_max_word").field("analyzer","ik_max_word").endObject()
.endObject()
.endObject();
PutMappingRequest putmap =
//test_persion:索引名称 persion:文档类型(用户可以根据需要进行自由命名) Requests.putMappingRequest("test_persion").type("persion").source(mapping);
//getclient()获取客户端(即第一步函数的调用)
getclient().admin().indices().prepareCreate("doctor_inf_index_01").execute().actionGet();
ElasticUtils.client.admin().indices().putMapping(putmap).actionGet();
}
在现实中一一般会有一个实体对应着一个文档,在这个例子中我们会以以下Persion实体对象对应每一个文档对象
public class Persion implements Serializable {
private String persionID;
private String sex;
private String age;
private String address;
//省略set/get
@Override
public String toString() {
return "Persion [persionID=" + persionID + ", sex=" + sex + ", age="
+ age + ", address=" + address + "]";
}
}
在此,我们已经做好了前期准备。可以查看已经存在一个叫test_persion的索引,并且在这个索引中存在一个叫做persion的文档,文档包含persionID、sex、age、address四个属性。完成上面的工做之后,我们需要做的就是增删差改了。